Зарезервируйте сектор 16K в mcu fla sh со ссылочным индексом по адресу c address - PullRequest
1 голос
/ 05 апреля 2020

Я создаю загрузчик для 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 раздел.

1 Ответ

1 голос
/ 06 апреля 2020
/* move the NVIC because we are running from 08004000 */
SCB->VTOR = (FLASH_BASE | 0x4000);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...