Я пишу базовый 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 ДОЛЖНЫ strong> работает ... но не работает, по крайней мере, с моими текущими настройками.
Вместо этого мне нужно изменить сценарий компоновщика следующим образом, чтобы программа работала плавно и могла начать отладку в обработчике сброса:
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 о несовпадении данных во флэш-памяти.