STM32F7 VMA和LMA与AXIM/ITCM闪光灯



我正在为我的stm32f767zi板编写一些基本的裸机C代码(使用Keil uVision IDE,如果这也很重要的话),我希望我的矢量表(以及在某些时候所有的。text东西)通过AXIM总线在flash中有一个LMA,通过ITCM总线在flash中有一个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 2000 9D .....

读取地址0x00200000:
0x00200000: 00 F4 01 20 1D 02 2000 9D .....

对我来说,这重申了AXIM闪存和ITCM闪存漏斗向下到完全相同的物理闪存,并通过AXIM总线将程序加载到flash中,然后通过ITCM总线从flash中读取指令SHOULD工作……但它没有,至少在我目前的设置中没有。

相反,我必须将链接器脚本修改为以下内容,以使程序顺利运行,并能够在重置处理程序中开始调试:

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,则会得到关于flash中不匹配数据的Keil uVision flash编程错误。

解决了,这是.text部分(在.vector_table部分之后)的LMA未在VMA被要求对齐时对齐的问题。更详细的解释请参见https://github.com/DISTORTEC/distortos/commit/12765ae58aefad3d51d579a3b90c0abbb7eb75a0

最新更新