Перейти к содержанию
    

Линкер, как поменять местами расположения секции?

Делаю hex для bootloader  в stm32f405.

В файле линкера создал блок образа IMAGE_HEAD (урезанный там больше указателей)  и перенес туда адрес начала таблицы прерываний.

и два региона  для хранение настроек FlashDefault_region, располагаються в последних двух секторах.

/*###ICF### Section handled by ICF editor, don't touch! ****/
/*-Editor annotation file-*/
/* IcfEditorFile="$TOOLKIT_DIR$\config\linker\ST\IcfEditor\stm32f40x_fsmc.xml" */
/*-Specials-*/
define symbol __ICFEDIT_intvec_start__ = 0x08020000;
/*-Memory Regions-*/
define symbol __ICFEDIT_region_FLASH_start__  = 0x08020000;
define symbol __ICFEDIT_region_FLASH_end__    = 0x080FFFFF;
define symbol __ICFEDIT_region_FSMC11_start__ = 0x0;
define symbol __ICFEDIT_region_FSMC11_end__   = 0x0;
define symbol __ICFEDIT_region_FSMC12_start__ = 0x0;
define symbol __ICFEDIT_region_FSMC12_end__   = 0x0;
define symbol __ICFEDIT_region_FSMC13_start__ = 0x0;
define symbol __ICFEDIT_region_FSMC13_end__   = 0x0;
define symbol __ICFEDIT_region_FSMC14_start__ = 0x0;
define symbol __ICFEDIT_region_FSMC14_end__   = 0x0;
define symbol __ICFEDIT_region_NAND1_start__  = 0x0;
define symbol __ICFEDIT_region_NAND1_end__    = 0x0;
define symbol __ICFEDIT_region_NAND2_start__  = 0x0;
define symbol __ICFEDIT_region_NAND2_end__    = 0x0;
define symbol __ICFEDIT_region_PCARD_start__  = 0x0;
define symbol __ICFEDIT_region_PCARD_end__    = 0x0;
define symbol __ICFEDIT_region_CCRAM_start__  = 0x10000000;
define symbol __ICFEDIT_region_CCRAM_end__    = 0x1000FFFF;
define symbol __ICFEDIT_region_SRAM1_start__  = 0x20000000;
define symbol __ICFEDIT_region_SRAM1_end__    = 0x2001BFFF;
define symbol __ICFEDIT_region_SRAM2_start__  = 0x2001C000;
define symbol __ICFEDIT_region_SRAM2_end__    = 0x2001FFFF;
define symbol __ICFEDIT_region_BKPR_start__   = 0x40024000;
define symbol __ICFEDIT_region_BKPR_end__     = 0x40024FFF;
/*--------------------Sector0---------------------------------------*/

/*--------------------Sector10---------------------------------------*/
define symbol __ICFEDIT_region_FlashDefault_start__   = 0x080C0000;
define symbol __ICFEDIT_region_FlashDefault_end__     = 0x080DFFFF;
/*--------------------Sector_11---------------------------------------*/
define symbol __ICFEDIT_region_FlashVar_start__   = 0x080E0000;
define symbol __ICFEDIT_region_FlashVar_end__     = 0x080FFFFF;
/*--------------------------------------------------------------*/

/*-Sizes-*/
define symbol __ICFEDIT_size_cstack__ = 0x2000;
define symbol __ICFEDIT_size_heap__   = 0x2000;
/**** End of ICF editor section. ###ICF###*/

define memory mem with size = 4G;
define region FLASH_region  =   mem:[from __ICFEDIT_region_FLASH_start__  to __ICFEDIT_region_FLASH_end__ ];
define region FSMC_region   =   mem:[from __ICFEDIT_region_FSMC11_start__ to __ICFEDIT_region_FSMC11_end__]
                              | mem:[from __ICFEDIT_region_FSMC12_start__ to __ICFEDIT_region_FSMC12_end__]
                              | mem:[from __ICFEDIT_region_FSMC13_start__ to __ICFEDIT_region_FSMC13_end__]
                              | mem:[from __ICFEDIT_region_FSMC14_start__ to __ICFEDIT_region_FSMC14_end__];
define region NAND_region   =   mem:[from __ICFEDIT_region_NAND1_start__  to __ICFEDIT_region_NAND1_end__ ]
                              | mem:[from __ICFEDIT_region_NAND2_start__  to __ICFEDIT_region_NAND2_end__ ];
define region PCARD_region  =   mem:[from __ICFEDIT_region_PCARD_start__  to __ICFEDIT_region_PCARD_end__ ];
define region CCRAM_region  =   mem:[from __ICFEDIT_region_CCRAM_start__  to __ICFEDIT_region_CCRAM_end__ ];
define region SRAM_region   =   mem:[from __ICFEDIT_region_SRAM1_start__  to __ICFEDIT_region_SRAM1_end__ ]
                              | mem:[from __ICFEDIT_region_SRAM2_start__  to __ICFEDIT_region_SRAM2_end__ ];
define region BKPR_region   =   mem:[from __ICFEDIT_region_BKPR_start__   to __ICFEDIT_region_BKPR_end__  ];



define block CSTACK    with alignment = 8, size = __ICFEDIT_size_cstack__   { };
define block HEAP      with alignment = 8, size = __ICFEDIT_size_heap__     { };

initialize by copy { readwrite };
//initialize by copy with packing = none { section __DLIB_PERTHREAD }; // Required in a multi-threaded application
do not initialize  { section .noinit };

//place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec };


define block IMAGE_HEAD with fixed order {readonly section .intvec, section .intvecTail};
place in FLASH_region  {readonly,first block IMAGE_HEAD};


//place in PCARD_region  { readonly section application_specific_ro };
place in CCRAM_region  { block CSTACK, section .ccram };
place in SRAM_region   { readwrite, block HEAP };
place in BKPR_region   { section .backup_sram };

define region FlashDefault_region   =   mem:[from __ICFEDIT_region_FlashDefault_start__   to __ICFEDIT_region_FlashDefault_end__];
define region FlashVar_region        =   mem:[from __ICFEDIT_region_FlashVar_start__          to __ICFEDIT_region_FlashVar_end__    ];

place in FlashDefault_region    {section .FlashDefault};
place in FlashVar_region        {section .FlashVar};

 

Вот кусок стартапа


        MODULE  ?cstartup

        ;; Forward declaration of sections.
        SECTION CSTACK:DATA:NOROOT(3)

        SECTION .intvec:CODE:NOROOT(2)

        EXTERN  __iar_program_start
        EXTERN  SystemInit
        EXTERN  hard_fault_handler_c
	    PUBLIC  __vector_table
;;------------------------------------------------------
        PUBLIC  __beginCodehead
        EXTERN   __checksum_begin, __checksum_end

        SECTION  .intvec:CONST:ROOT(8)

        DATA
__vector_table
        DCD     sfe(CSTACK)
        DCD     Reset_Handler             ; Reset Handler

        DCD     NMI_Handler               ; NMI Handler
        DCD     HardFault_Handler         ; Hard Fault Handler
        DCD     MemManage_Handler         ; MPU Fault Handler
        DCD     BusFault_Handler          ; Bus Fault Handler
        DCD     UsageFault_Handler        ; Usage Fault Handler
        ;;----------------------------------------------------------------------    
        SECTION  .intvecTail:CONST:ROOT(2)
        DATA     ;Продолжение таблицы векторов прерываний
__vector_table_tail
        ;;----------------------------------------------------------------------
        ;;DCD     0                         ; Зането CRC
        ;;DCD     0                         ; занято  __beginCodehead        
        DCD     0                         ; Reserved
        DCD     0                         ; Reserved
        DCD     SVC_Handler               ; SVCall Handler
        DCD     DebugMon_Handler          ; Debug Monitor Handler
        DCD     0                         ; Reserved
        DCD     PendSV_Handler            ; PendSV Handler
        DCD     SysTick_Handler           ; SysTick Handler

Проблема возникла в том что,  таблица прерываний начинает распалагаться, после региона блока настроек FlashDefault_region

*******************************************************************************
*** PLACEMENT SUMMARY
***

define block IMAGE_HEAD
   with fixed order { ro section .intvec, section .intvecTail };
"P1":  place in [from 0x802'0000 to 0x80f'ffff] { ro, first block IMAGE_HEAD };
define block CSTACK with size = 8K, alignment = 8 { };
"P2":  place in [from 0x1000'0000 to 0x1000'ffff] {
          block CSTACK, section .ccram };
define block HEAP with size = 8K, alignment = 8 { };
"P3":  place in [from 0x2000'0000 to 0x2001'bfff] |
                [from 0x2001'c000 to 0x2001'ffff] { rw, block HEAP };
"P5":  place in [from 0x80c'0000 to 0x80d'ffff] { section .FlashDefault };
"P6":  place in [from 0x80e'0000 to 0x80f'ffff] { section .FlashVar };
initialize by copy { rw };

No sections matched the following patterns:

  section .backup_sram  in "P4"
  section .ccram        in "P2"


  Section            Kind         Address     Size  Object
  -------            ----         -------     ----  ------
"P5":                                         0xe0
  P5-1                         0x80c'0000     0xe0  <Init block>
    .FlashDefault    inited    0x80c'0000     0xe0  VarFlash.o [1]
                             - 0x80c'00e0     0xe0

"P1":                                       0xc9fc
  IMAGE_HEAD                   0x80c'0100    0x180  <Block>
    .intvec          ro code   0x80c'0100     0x1c  startup_stm32f4xx_Boot.o [1]
    .intvecTail      const     0x80c'011c    0x164  startup_stm32f4xx_Boot.o [1]
  .checksum          const     0x80c'0280      0x4  Place holder __checksum
  .rodata            const     0x80c'0284     0x10  HTTP_v2.o [1]
  .rodata            const     0x80c'0294     0x10  HTTP_v2.o [1]
  .rodata            const     0x80c'02a4      0x8  HTTP_v2.o [1]
  .rodata            const     0x80c'02ac     0x14  HTTP_v2.o [1]
  .rodata            const     0x80c'02c0     0x78  HTTP_v2.o [1]
  .rodata            const     0x80c'0338     0x9c  HTTP_v2.o [1]
  .rodata            const     0x80c'03d4     0x18  HTTP_v2.o [1]

Почему секция

"P1":  place in [from 0x802'0000 to 0x80f'ffff] { ro, first block IMAGE_HEAD };  начинаеться после   P5  ?   и с адресом  0x80c0000 ? Хотя должно с 0x8020000

 

Изменено пользователем pokk

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну ты же перечислил сначала readonly, а потом IMGE_HEAD. А вообще, place at address использовать как это сделано штатно для .intvec.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Кстати, глянь приложенный стартап. В IAR можно смело выкидывать Reset_Handler и SystemInit. Код из SystemInit перенести в __low_level_init(), он всё равно в стартовом коде есть. Чутка да экономим.

startup_iar_stm32f405xx.c

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

41 minutes ago, VladislavS said:

Ну ты же перечислил сначала readonly, а потом IMGE_HEAD

Да я тоже об этом думал пробовал поменять местами все  равно так же

define block IMAGE_HEAD with fixed order {section .intvec, section .intvecTail};
place in FLASH_region  {first block IMAGE_HEAD,readonly};

 

46 minutes ago, VladislavS said:

place at address использовать как это сделано штатно для .intvec.

Да если его использовать то работает как надо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 часа назад, pokk сказал:

Почему секция

"P1":  place in [from 0x802'0000 to 0x80f'ffff] { ro, first block IMAGE_HEAD };  начинаеться после   P5  ?   и с адресом  0x80c0000 ? Хотя должно с 0x8020000

Видимо потому, что тот пример моего кода, который Вы взяли как образец для этого, очень криво отредактировали, добавив туда совершенно левые строки.  :unknw:

Советую внимательнее разобраться в моём примере. Чтобы понимать что там и для чего. Конкретно обратить внимание на объявление секции ".intvec" в asm-файле.

2 часа назад, VladislavS сказал:

Ну ты же перечислил сначала readonly, а потом IMGE_HEAD.

И что?

 

2 часа назад, VladislavS сказал:

А вообще, place at address использовать как это сделано штатно для .intvec.

"place at address" там не нужен. И в таких применениях он вообще не нужен. Проблема в том что автор создал галиматью в своём коде. Внимательнее нужно следить за секциями, которые объявляются.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

6 hours ago, jcxz said:

Конкретно обратить внимание на объявление секции ".intvec" в asm-файле.

Вы про SECTION .intvec:CODE:NOROOT(2) ?

Убрал не помогло

Вообще я ваш пример успешно применил на stm32f103

кусок стартапа:

    MODULE  ?cstartup

        ;; Forward declaration of sections.
        SECTION CSTACK:DATA:NOROOT(3)

        SECTION .intvec:CODE:NOROOT(2)

        EXTERN hard_fault_handler_c
        EXTERN  __iar_program_start
        EXTERN  init_rcc
        PUBLIC  __vector_table
        PUBLIC  __beginCodehead

        EXTERN   __checksum_begin, __checksum_end

;;------------------------------------------------------
;;--------Указатель на адрес основных настроек----------
;;------------------------------------------------------
            PUBLIC   __beginFlashVarAddr
            SECTION  .FlashVar:CONST:ROOT(2)
__beginFlashVarAddr     ;; SettingSignature                    
;;------------------------------------------------------
;;--------Указатель на адрес дефолтных настроек----------
;;------------------------------------------------------
            PUBLIC   __beginFlashDefaultAddr
            SECTION  .FlashDefault:CONST:ROOT(2)
__beginFlashDefaultAddr 
;;------------------------------------------------------
;;----------------Указатель на Header code--------------
;;------------------------------------------------------        
               PUBLIC   __Codehead
               SECTION  .codehead:CONST:ROOT(2)
__Codehead     DC32     0xAABBCCDD              ;;signatur
               DC32     __checksum_begin
               DC32     __checksum_end
               DC32     __beginFlashDefaultAddr
               DC32     __beginFlashVarAddr                
;;------------------------------------------------------
;;----------------Указатель на Header code--------------
;;------------------------------------------------------        
                PUBLIC   __PointCodehead
                SECTION  .PointCodehead:CONST:ROOT(2)
__PointCodehead DC32     __beginCodehead
;;------------------------------------------------------
;;------------------------------------------------------
;;------------------------------------------------------

        SECTION  .intvec:CONST:ROOT(8)
        DATA
__vector_table
        DCD     sfe(CSTACK)
        DCD     Reset_Handler             ; Reset Handler
        DCD     NMI_Handler               ; NMI Handler
        DCD     HardFault_Handler         ; Hard Fault Handler
        DCD     MemManage_Handler         ; MPU Fault Handler
        DCD     BusFault_Handler          ; Bus Fault Handler
        DCD     UsageFault_Handler        ; Usage Fault Handler
        ;;----------------------------------------------------------------------    
        SECTION  .intvecTail:CONST:ROOT(2)
        DATA     ;Продолжение таблицы векторов прерываний
__vector_table_tail
        ;;----------------------------------------------------------------------
        ;;DCD     0                         ; Зането CRC
        ;;DCD     0                         ; занято  __beginCodehead
        DCD     0                         ; Reserved
        DCD     0                         ; Reserved
        DCD     SVC_Handler               ; SVCall Handler
        DCD     DebugMon_Handler          ; Debug Monitor Handler
        DCD     0                         ; Reserved
        DCD     PendSV_Handler            ; PendSV Handler
        DCD     SysTick_Handler           ; SysTick Handler

Файл линкера


initialize by copy { readwrite };
do not initialize  { section .noinit };


define block IMAGE_HEAD with fixed order {section .intvec, section .checksum, section .PointCodehead, section .intvecTail, section .codehead};


place in ROM_region   	        {readonly, first block IMAGE_HEAD,section .SoftWare,section .SectSHA1,block WebContent};
place in FlashDefault_region    {first section .FlashDefault};
place in FlashVar_region        {first section .FlashVar};
place in CrashLog_region        {first section .CrashLog};


define block MEM_FIRST with fixed order {section .StartingRam};

place in RAM_region   { readwrite,
                        first block MEM_FIRST,
                        last block CSTACK, block HEAP };
                        

 

 И в процессе переноса на stm32f405 возникла ситуация с начальным адресом, по этому начал убирать все лишнее (что сязанно с секцией настройками) по этому и остались хвосты.

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

43 минуты назад, pokk сказал:

Вы про SECTION .intvec:CODE:NOROOT(2) ?

Убрал не помогло

А почему тогда опять эта строчка фигурирует? И зачем Вы её вообще добавили? Какой смысл?

И почему во фрагменте .map у вас значится ".intvec ro code 0x80c'0100 0x1c startup_stm32f4xx_Boot.o [1]" ? Опять не CONST, а CODE. И к тому-же из файла "startup_stm32f4xx_Boot.o". У Вас какая таблица прерываний используется? Из асм-файла (того, что в начале привели) или из startup_stm32f4xx_Boot.o? А зачем тогда прицепили ещё "startup_stm32f4xx_Boot.o" если таблицу прерываний описали в асм-файле?  :wacko2:

В моём примере у секции .intvec везде атрибут "CONST". И таблица прерываний - из асм-файла. Онли. У Вас там несколько разных намешано. Видно надёргали каких-то кусков из разных мест. Потому и получили кашу. Разберитесь наконец какая директива для чего предназначена и применяйте осмысленно, а не тыкайте наугад.

Вот как выглядит у меня:

"P1":                                      0x12d0c
  IMAGE_HEAD                   0x08000000    0x228  <Block>
    .intvec                    0x08000000     0x20  <Block>
      .intvec         const    0x08000000     0x20  misca.o [1]
    .checksum         const    0x08000020      0x4  Place holder __checksum
    .codehead         const    0x08000024      0x8  misca.o [1]
    .intvecTail       const    0x0800002c    0x1d0  misca.o [1]
    .codeSignature    const    0x080001fc     0x2c  main.o [1]
  .text               ro code  0x08000228   0x1a30  cedit.o [1]
...
  

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Дело бы в этом:

21 hours ago, pokk said:

define symbol __ICFEDIT_region_FLASH_end__ = 0x080FFFFF;

Изменил диапазон секции FLASH до начала секций с настройками, и поменял .intvec  на const стало так: 

  Section            Kind         Address     Size  Object
  -------            ----         -------     ----  ------
"P1":                                       0xc894
  IMAGE_HEAD                   0x802'0000    0x19c  <Block>
    .intvec          const     0x802'0000     0x1c  startup_stm32f4xx_Boot.o [1]
    .checksum        const     0x802'001c      0x4  Place holder __checksum
    .PointCodehead   const     0x802'0020      0x4  startup_stm32f4xx_Boot.o [1]
    .intvecTail      const     0x802'0024    0x164  startup_stm32f4xx_Boot.o [1]
    .codehead        const     0x802'0188     0x14  startup_stm32f4xx_Boot.o [1]
  .rodata            const     0x802'019c     0x10  HTTP_v2.o [1]

PS:  ещё добавил модификатор first к секции настроек, что бы указатель указывал на начало секций а не конец.   
 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

8 часов назад, pokk сказал:

Изменил диапазон секции FLASH до начала секций с настройками, и поменял .intvec  на const стало так: 

А "startup_stm32f4xx_Boot.o" - что у Вас такое? Вы свой асм-файл с таблицей прерываний что-ли назвали "startup_stm32f4xx_Boot.*"?

Исходя из названия, я думал - что это стандартный файл для семейства МК STM32F4xx из комплекта компилятора.

Цитата

PS:  ещё добавил модификатор first к секции настроек, что бы указатель указывал на начало секций а не конец.

Здесь ничего не понял о чём речь...  :wacko2:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 11/19/2019 at 6:09 PM, jcxz said:

Вы свой асм-файл с таблицей прерываний что-ли назвали "startup_stm32f4xx_Boot.*"? 

Да это стандартный файл,  я его изменил в процессе "настройки" секции на нужный адрес, а исходный оставил.

У меня в каждом проекте, есть папка chip, в которой находиться startup, файл линкер *.icf, и другие хедеры относившиеся к ядру и серии процессора(stm32f4xx.h).

On 11/19/2019 at 6:09 PM, jcxz said:

Здесь ничего не понял о чём речь...  :wacko2:

При таких настройках 

place in FlashDefault_region    {first section .FlashDefault};
place in FlashVar_region        {first section .FlashVar};

Получаем то что мне надо

"P6":                                         0xe0
  .FlashDefault      const     0x80c'0000      0x0  startup_stm32f4xx_Boot.o [1]
  .FlashDefault      const     0x80c'0000     0xe0  VarFlash.o [1]

А если не указывать  first то получим.

"P6":                                         0xe0
  .FlashDefault      const     0x80c'0000     0xe0  VarFlash.o [1]
  .FlashDefault      const     0x80c'00e0      0x0  startup_stm32f4xx_Boot.o [1]
                             - 0x80c'00e0     0xe0

В таблицу векторов запишется адрес конца секции настроек, а не начала.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...