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条回答
sddzycnq
2019-12-29 00:50
本帖最后由 sddzycnq 于 2014-3-8 19:04 编辑

好久没来坛子里发言了。看到这位仁兄的问题。想想以前也是自己走过的路。
找问题得找根本。这个问题表象是你说的这样。但你顺藤摸瓜不难发现,这和MDK工具(这里说工具更合适,说汇编器,编译器,链接器,很多人就不会看下去了)有直接的关系。其实再分析的话应该是链接器的关系。
那么就应该从MDK的链接器手册入手,所以这里必须要看的资料是ARM Compiler toolchain v4.1 for µVision Using the Linker。

下面一一解答你的问题:

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       为什么??

答:首先我对你提供的这组数字有点疑惑,本应该0x07F600 -8572 - 513672 = -4;但结果是-516。所以断定你在0x08007f800的位置还放了一个int型数据。
如果如我所料,那么解释如下:
由于0x0807f800远超过了程序的code+ro的长度。所以链接器会在7F800的位置放一个int型数据。这样,RO段的大小为:
0x07f804(这里要加上放置在些的int型数据长度4)减去code长度8572等于513672.
而在没有使用这个特性时,ro长度为程序实际ro长度。
     
查看FLASH 在我要写的地址后跟随了一些其他数据,这又是为什么?  这些数据时那里来的。我并没有操作啊。

答:后面跟的是RW段数据。

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

答:const只表示变量属性。而决定变量位置的是后面的at。

3.  int x1 __attribute__((at(0x0807F800)));     不赋值的话,一切正常,但没意义了

答:你指的一切正常是什么意思?但如果是你写的这样的话,ro的长度与赋值时是一样的。

一周热门 更多>