Я создаю загрузчик для STM32F429 с помощью цепочки инструментов gnu (9.2.1) и пытаюсь зарезервировать некоторую память sh для пользовательских данных, разделяемых загрузчиком и приложением. Я хочу зарезервировать второй из его первых четырех секторов 16K fla sh для этого, поскольку они хороши и малы: все остальные сектора имеют размер 128K. Структура памяти должна выглядеть следующим образом:
ISR vector table : 0x08000000 (428 bytes)
padding : 0x080001ac (15956 bytes)
-----------------------------
user data : 0x08004000 (16K)
-----------------------------
bootloader code : 0x08008000 (max 224K, for total of max. 256K)
Я изменил скрипт компоновщика ST , чтобы он выглядел так:
/* Specify the memory areas */
MEMORY
{
FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 256K /* max. bootloader binary size */
CCMRAM (rw) : ORIGIN = 0x10000000, LENGTH = 64K
RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 191K /* deduct 1K for NOINIT data */
NOINIT (rwx) : ORIGIN = 0x2002FC00, LENGTH = 1K /* NOINIT data will survive reset */
}
/* Define output sections */
SECTIONS
{
/* The startup code goes first into FLASH */
.isr_vector :
{
. = ALIGN(4);
KEEP(*(.isr_vector)) /* Startup code */
. = ALIGN(4);
} >FLASH
/* Then comes user flash sector, make sure to get one of the first 4 that are 16K in size
.user_flash :
{
. = ALIGN(0x4000)
KEEP(*(.user_flash))
. = ALIGN(0x4000)
} >FLASH
/* ... more sections below not shown here */
}
В моем загрузчике. cpp, Я объявляю пользователя fla sh следующим образом:
__attribute__((__section__(".user_flash"))) const uint32_t user_flash[0x4000 / sizeof(uint32_t)] = {0};
Однако в отладчике адрес user_flash
не 0x08004000
, как ожидалось, а 0x0801b4e8
.
Удаление __attribute__((__section__(".user_flash")))
из объявления дает другой адрес, доказывая, что атрибут имеет как минимум некоторый эффект.
Запуск arm-non-eabi-objdump -h
в файле .elf подтверждает (неверный) адрес раздела user_flash
. Я также попытался объявить раздел с . = 0x08004000
, но безрезультатно.
Другой подход, который я пробовал, - поместить .isr_vector
в его собственный раздел 16K, за которым следует раздел 16K для пользователя fla sh. и, наконец, (256-16-16) = 224K FLA SH раздел. В результате получился поддельный двоичный файл, который мог бы вызвать ошибку.
Что я здесь не так делаю?
Редактировать:
Я пытался вставить .padding
раздел после .isr_vector
, чтобы попытаться выровнять .user_flash
таким образом, но независимо от того, что я делаю, разделы .text
и .rodata
всегда появляются сразу после .padding
, даже если они объявлены после .user_flash
раздел.