本帖最后由 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))); 不赋值的话,一切正常,但没意义了
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貌似可以奏效,具体不详。。。
一周热门 更多>