MDK中绝对地址__attribute__((at(address)))使用疑问?

2019-12-27 18:40发布

本帖最后由 ubuntuman 于 2012-6-3 11:15 编辑

使用MDK 4.12 想在FLASH地址0X0807F800的地方存放一个数据,故使用__attribute__((at(address)))函数,具体情况如下:  

(软件仿真情况下,硬件还没试验板子坏了)

1.   使用  const int x2 __attribute__((at(0x0807F600)))=10; /* RO */

Program Size: Code=8572 RO-data=513672 RW-data=308 ZI-data=2668       RO-data=513672   没有使用前RO-data=404       为什么??

   2.jpg (61.96 KB, 下载次数: 5) 下载附件 2012-6-2 15:58 上传
查看FLASH 在我要写的地址后跟随了一些其他数据,这又是为什么?  这些数据时那里来的。我并没有操作啊。

2.  不使用const关键字 依然如上;

3.  int x1 __attribute__((at(0x0807F800)));     不赋值的话,一切正常,但没意义了
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
19条回答
WM_CH
2019-12-29 15:45
本帖最后由 WM_CH 于 2017-7-14 15:08 编辑

stm32启动过程.jpg (47.19 KB, 下载次数: 0)

下载附件

2017-7-14 15:08 上传



结合上图说下STM32F407ZGT6的启动过程(采用Cortex-M4、Cortex-M3内核的芯片基本都是这个过程):
上电后首先从0x00000000(映射到0x08000000,这里只考虑从内部Flash启动)处获得中断向量表,
然后在运行用户代码之前会在(标号2)处有一段引导代码负责把存在Flash中的初始化变量的值Copy到SRAM中对应的变量位置(标号3),之后把ZI区域全部清零(标号4),之后才正式开始运行用户代码(标号5)。




我猜是楼主在目标地址定义了一个RO的值以后,RO程序段膨胀了!本来只用了一点,再连上绝对目标地址处的一个值,然后中间全是0xFF。
目标绝对地址之后的值是RW程序段。

具体为什么会这样,以及如何解决,估计真的要看链接脚本了。
其实用分散加载文件Scatter貌似可以奏效,具体不详。。。





一周热门 更多>