Камень-STM32F205RC
в ld файле добавляю две секции.
В отладчике всё работает. Но бинарник получается размером с небоскрёб: 393 344 кб.
Если убрать ram_user_info_section размер приходит в норму. Не могу понять что не так!
MEMORY
{
RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 80K
RAM2_USER_INFO (xrw) : ORIGIN = 0x2001C000, LENGTH = 16K
FLASH_USER_INFO_BACKUP (rx) : ORIGIN = 0x8000000, LENGTH = 16K
FLASH (rx) : ORIGIN = 0x8004000, LENGTH = 48K
/*RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 80K*/
/*RAM2 (xrw) : ORIGIN = 0x2001C000, LENGTH = 16K*/
/*FLASH (rx) : ORIGIN = 0x8000000, LENGTH = 256K*/
}
SECTIONS
{
....
/* Section for user info*/
.ram_user_info_section :
{
. = ALIGN(4);
KEEP(*(.ram_user_info_section))
. = ALIGN(4);
} >RAM2_USER_INFO
/*Section for backup user info*/
.flash_user_info_backup_section :
{
. = ALIGN(4);
KEEP(*(.flash_user_info_backup_section))
. = ALIGN(4);
} >FLASH_USER_INFO_BACKUP
}
Решение в https://ftp.gnu.org/old-gnu/Manuals/ld-2.9.1/html_node/ld_21.html
есть опция NOLOAD. Она решает данную проблему.
Не понятно почему без неё добавляется не 16K а 393320K
в elf обе секции клались во флеш с размерами по 0x30000;
SECTIONS
{
....
/* Section for user info*/
.ram_user_info_section (NOLOAD) :
{
. = ALIGN(4);
KEEP(*(.ram_user_info_section))
. = ALIGN(4);
} >RAM2_USER_INFO
/*Section for backup user info*/
.flash_user_info_backup_section (NOLOAD) :
{
. = ALIGN(4);
KEEP(*(.flash_user_info_backup_section))
. = ALIGN(4);
} >FLASH_USER_INFO_BACKUP
}
Интересно, а проект можешь скинуть?
да как такового ещё нет. Переделываю бутлоадер. Секции переставил, чтобы в 0x08000000 переход не делать.
Хочу в flash_user_backup_section эмуляцию eeprom сделать. Но вот с секцией в рам, почему то коллизия получилась.
При этом линкер не жаловался на выход за пределы флеш памяти.
Такой бутлоадер уже работает с внешней флеш микросхемой. Но иногда происходит сбой и признак приложения удаляется.
Вот хочу во внутреннюю флеш перенести.