我正在为我的 stm32f767zi 板编写一些基本的裸机 C 代码(如果这也很重要,请使用 Keil uVision IDE),我希望我的向量表(以及在某些时候所有 .text 的东西)在闪存中有一个 LMA通过 AXIM 总线和通过 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 内存窗口中进行内存读取时)地址 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 总线从闪存读取指令应该可以工作......但它没有t,至少不是我目前的设置。
相反,我必须将链接器脚本修改为以下内容,以使程序顺利运行并能够在重置处理程序中开始调试:
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 闪存编程错误。