带 AXIM/ITCM 闪存的 STM32F7 VMA 和 LMA

STM32F7 VMA and LMA with AXIM/ITCM flash

我正在为我的 stm32f767zi 板编写一些基本的裸机 C 代码(使用 Keil uVision IDE 如果这也很重要)并且我想要我的矢量 table (并且在某些时候所有的.text 东西)通过 AXIM 总线在闪存中有一个 LMA,通过 ITCM 总线在闪存中有一个 VMA。我想要的是链接器脚本中的以下内容:

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 内存中进行内存读取时 window)地址 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 */

为什么将 .vector_table 输出部分的 VMA 更改为与 LMA 相同会影响我 运行 程序的能力?另请注意,如果我将 .vector_table 输出部分的 VMA 和 LMA 设置为 FLASH_ITCM 而不是 FLASH_AXIM,我会收到关于闪存中不匹配数据的 Keil uVision 闪存编程错误。

已解决,这是 .text 部分(在 .vector_table 部分之后)的 LMA 未对齐的问题,因为要求对齐 VMA。有关更详细的说明,请参阅 https://github.com/DISTORTEC/distortos/commit/12765ae58aefad3d51d579a3b90c0abbb7eb75a0