我正在为我的stm32f767zi板编写一些基本的裸C代码(如果这也很重要的话,可以使用uVision IDE ),我希望我的向量表(在某些时候,所有的.text内容也是如此)通过AXIM总线在闪存中拥有一个LMA,通过uVision总线在闪存中使用一个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 9 D
读取地址0x00200000的内存:
0x00200000: 00 F4 01 20 1D 02 20 00 9 D
其中,对我来说,重申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,则会得到关于flash中不匹配数据的Keil uVision flash编程错误。
发布于 2021-01-25 21:21:16
解决了,这是一个问题,即.text部分的LMA (在.vector_table部分之后)没有对齐,因为VMA被要求对齐。有关更详细的解释,请参见https://github.com/DISTORTEC/distortos/commit/12765ae58aefad3d51d579a3b90c0abbb7eb75a0。
https://stackoverflow.com/questions/65838906
复制相似问题