首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有AXIM/ STM32F7闪存的VMA和LMA

具有AXIM/ STM32F7闪存的VMA和LMA
EN

Stack Overflow用户
提问于 2021-01-22 03:27:21
回答 1查看 134关注 0票数 0

我正在为我的stm32f767zi板编写一些基本的裸C代码(如果这也很重要的话,可以使用uVision IDE ),我希望我的向量表(在某些时候,所有的.text内容也是如此)通过AXIM总线在闪存中拥有一个LMA,通过uVision总线在闪存中使用一个VMA。链接器脚本中的如下内容是我想要的:

代码语言:javascript
复制
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总线读取来自的指令应该工作.但事实并非如此,至少在我目前的情况下是这样的。

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

代码语言:javascript
复制
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编程错误。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-25 21:21:16

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65838906

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档