中的某一地址,定位一些全局常量。
-----------
定位前(不使用const ),代码如下:
ffice
ffice" />
uint8_t MachineCode __attribute__ ((at(0x8002000))) = 0x55;
编译信息如下:
Program Size: Code=4164 RO-data=336 RW-data=3740 ZI-data=1028
(这时,MachineCode 没有被定位到flash空间)
--------------------------
于是,使用const 定位,代码如下:
uint8_t const MachineCode __attribute__ ((at(0x8002000))) = 0x55;
编译信息如下:
Program Size: Code=4164 RO-data=4032 RW-data=44 ZI-data=1028
--------------
打开*.map文件,看到以下信息:
MachineCode 0x08002000 Data 1 main.o(.ARM.__AT_0x08002000)
这说明 MachineCode 已经被定位在flash 的0x08002000 处,且占用1字节。
/////////////////////////////////////////
用某烧写器的编辑软件(类似于j-link打开hex/bin文件)打开*.hex文件,再查看0x08002000 处代码,截图如下:
可以看到,在0x08002000 处的确有我们想要的代码0x55。
-------------------------------------------------
问题出现了:
1、为什么在用const 修饰符定位之后,0x8002000之前,出现了大量的00,这也是两次定位后,RO-data=336 和RO-data=4032 的原因。
能让这些 00 变为FF吗。
2、在0x8002000处,我原本只定位了一个字节(顶多会占用4个字节),为什么在0x8002000 后面,还有一些(16*3-4)=44个多余的数据呢。(在51里用keil定位的时候,可没有这个情况)
问题1的出现,我可以不担心它。
关键是问题2,0x8002000 后面的一串数据,也是有用的。
如果我擦写掉0x8002000 后面1k空间的内容,再在0x8002000 处重写1个字节(写的时候另三个字节是FF),问题发生了,程序不能正常运行了。
这说明:0x8002000 后面的一串数据,也是有用的。这个数据是什么呢,能不产生吗。
以上问题,请高人赐教。