IAR компоновщик копирует код из FLASH в RAM во время инициализации - PullRequest
1 голос
/ 31 октября 2019

Я хочу запустить код в ОЗУ и использовать директивы initialize copy by.

Мой .icf файл выглядит следующим образом:

define symbol __ICFEDIT_intvec_start__ = 0x08000000;
/*-Memory Regions-*/
define symbol __ICFEDIT_region_ROM_start__  = 0x08000000;
define symbol __ICFEDIT_region_ROM_end__    = 0x080007ff;
define symbol __ICFEDIT_region_ROM1_start__ = 0x08070000;
define symbol __ICFEDIT_region_ROM1_end__   = 0x0807FFFF;

define symbol __ICFEDIT_region_RAM_start__  = 0x20000000;
define symbol __ICFEDIT_region_RAM_end__    = 0x2000FFFF;

define symbol __ICFEDIT_size_cstack__ = 0x600;
define symbol __ICFEDIT_size_heap__   = 0x00;

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

define memory mem with size = 4G;
define region ROM_region   = mem:[from __ICFEDIT_region_ROM_start__   to __ICFEDIT_region_ROM_end__];
define region ROM1_region  = mem:[from __ICFEDIT_region_ROM1_start__  to __ICFEDIT_region_ROM1_end__];
define region RAM_region   = mem:[from __ICFEDIT_region_RAM_start__   to __ICFEDIT_region_RAM_end__];

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

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

do not initialize  { section .noinit };

initialize by copy {readwrite};

initialize by copy {
                           object gd32f403_it.o,
                           object gd32f403_exti.o,
                           object gd32f403_fmc.o,
                           object gd32f403_gpio.o,
                           object gd32f403_misc.o,
                           object gd32f403_pmu.o,
                           object gd32f403_rcu.o,
                           object gd32f403_timer.o,
                           object gd32f403_usart.o,
                           object usb_delay.o,
                           object iap_core.o,
                           object usb_core.o,
                           object usbd_core.o,
                           object usbd_int.o,
                           object usbd_std.o,
                           object app.o ,
                   };

place in ROM_region   { 
                        readonly object system_gd32f403.o,
                       };
place in ROM1_region   { 
                           readonly object app.o ,
                           readonly object usb_delay.o,
                           readonly object iap_core.o,
                           readonly object gd32f403_it.o,
                           readonly object gd32f403_exti.o,
                           readonly object gd32f403_fmc.o,
                           readonly object gd32f403_gpio.o,
                           readonly object gd32f403_misc.o,
                           readonly object gd32f403_pmu.o,
                           readonly object gd32f403_rcu.o,
                           readonly object gd32f403_timer.o,
                           readonly object gd32f403_usart.o,
                           readonly object usb_core.o,
                           readonly object usbd_core.o,
                           readonly object usbd_int.o,
                           readonly object usbd_std.o,
                           readonly,
                        };
place in RAM_region   { 
                        readwrite,
                        block CSTACK, block HEAP,
                        };

export symbol __ICFEDIT_region_RAM_start__;
export symbol __ICFEDIT_region_RAM_end__;

Но только gd32f403_gpio.o и gd32f403_misc.oвыполнить в ОЗУ, а другие объекты все еще работают во FLASH, как показано в выходных файлах .map:

"P3", part 1 of 3:                         0x54c
  P3-1                        0x20000000   0x54c  <Init block>
    ...
    .rodata          inited   0x20000000    0x40  app.o [1]
    .rodata          inited   0x20000040    0x44  app.o [1]
    .rodata          inited   0x20000130     0x8  gd32f403_rcu.o [1]
    .rodata          inited   0x20000138    0x14  iap_core.o [1]
    .rodata          inited   0x2000014c     0x4  iap_core.o [1]
    .text            inited   0x20000150    0xc6  gd32f403_gpio.o [1]
    .text            inited   0x20000218    0xd0  gd32f403_misc.o [1]
    .data            inited   0x200002e8   0x120  app.o [1]
    .data            inited   0x20000408    0x30  iap_core.o [1]
    .data            inited   0x20000504    0x48  xfiles.o [3]
    ...
                            - 0x2000054c   0x54c

Почему другие объекты, такие как app.o, gd32f403_usart.o, не были скопированы в ОЗУ для выполнения?

Пожалуйста!

Что мне делать, если я хочу достичь цели - скопировать код в ОЗУ, описанный в файле .icf?

1 Ответ

0 голосов
/ 04 ноября 2019

Разделы, необходимые для инициализации, не затрагиваются директивой инициализации копированием. Это включает в себя функцию __low_level_init и все, на что она ссылается.

Все, что доступно из метки программы, считается необходимым для инициализации, если не достигнуто фрагментом раздела с меткой, начинающейся с __iar_init $$ done.

...