STM32F7 VMA и LMA с флэш-памятью AXIM / ITCM

Я пишу базовый C-код для моей платы stm32f767zi (используя Keil uVision IDE, если это тоже имеет значение), и я хотел бы, чтобы моя векторная таблица (и в какой-то момент все .text тоже) имела LMA во флеш-памяти через шину AXIM и VMA во флеш-памяти через шину ITCM. Что-то вроде следующего в сценарии компоновщика - это то, что я хочу:

MEMORY
{
    FLASH_AXIM (rwx) : ORIGIN = 0x08000000, LENGTH = 0x001FFFFF
    FLASH_ITCM  (rx) : ORIGIN = 0x00200000, LENGTH = 0x001FFFFF
}

SECTIONS
{
    .vector_table : ALIGN(4)
    {
        KEEP(*(.vectors))
        . = ALIGN(4);
    } > FLASH_ITCM AT > FLASH_AXIM /* VMA in ITCM flash, LMA in AXIM flash */
...

Этот сценарий компоновщика приводит к тому, что программа не работает и зависает при попытке отладки. Когда программа зависает, отладчик показывает, что (при чтении памяти в окне памяти Keil uVision) данные по адресам 0x08000000 и 0x00200000 в точности совпадают, т.е.

Чтение памяти по адресу 0x08000000:
0x08000000: 00 F4 01 20 1D 02 20 00 9D .....

Чтение памяти по адресу 0x00200000:
0x00200000: 00 F4 01 20 1D 02 20 00 9D .....

Что, на мой взгляд, еще раз подтверждает, что флэш-память AXIM и флэш-память ITCM переходят в одну и ту же физическую флэш-память и загружают программу во флэш-память через шину AXIM, а затем читают инструкции из флэш-памяти через шину ITCM ДОЛЖНЫ работает ... но не работает, по крайней мере, с моими текущими настройками.

Вместо этого мне нужно изменить сценарий компоновщика следующим образом, чтобы программа работала плавно и могла начать отладку в обработчике сброса:

MEMORY
{
    FLASH_AXIM (rwx) : ORIGIN = 0x08000000, LENGTH = 0x001FFFFF
    FLASH_ITCM  (rx) : ORIGIN = 0x00200000, LENGTH = 0x001FFFFF
}

SECTIONS
{
    .vector_table : ALIGN(4)
    {
        KEEP(*(.vectors))
        . = ALIGN(4);
    } > FLASH_AXIM /* VMA and LMA in AXIM flash */

Почему изменение VMA выходной секции .vector_table таким же, как LMA, влияет на мою способность запускать программу? Также обратите внимание, что если я устанавливаю VMA и LMA секции вывода .vector_table в FLASH_ITCM вместо FLASH_AXIM, я получаю ошибку программирования флэш-памяти Keil uVision о несовпадении данных во флэш-памяти.


person Dartlead    schedule 22.01.2021    source источник


Ответы (1)


Решена, проблема заключалась в том, что LMA раздела .text (следующего за разделом .vector_table) не выравнивался, поскольку VMA запрашивалось для выравнивания. См. https://github.com/DISTORTEC/distortos/commit/12765ae58a более подробное объяснение.

person Dartlead    schedule 25.01.2021