|
今天在调试程序时,发现程序执行Flash擦写时,会改变其它数据,但储存还够用,编译没有报错.这到底是什么回事呢? 芯片用的是MSP430F135,Flash的地址为C000-FFFF
配置文件的分配为:(下面这个配置是错误的)
-Z(CONST)DATA16_C,DATA16_ID,DIFUNCT,CHECKSUM=C000-FDFF
-Z(CODE)SEGA2_BACKUP=FC00-FDFF
SEGA2_BACKUP 这个块是分配出来存储数据的.可以能过430单片机的Flash功能来擦写的.在我的程序中是这样的.
如果能看懂配置文件的人应该都明白上面的定义是什么意思.仔细一下,有没有发现什么呢?
细心的朋友可能会发现两个空间的交集的大小刚好为:FC00-FDFF
小提示:当以块进行擦除时,信息存储段以128字节为块,主存储段以512字节为块
这就对了,当代码太大时而又不超过总存储器的总容量时,常量就会被安排到后面的交集的空间里,那么SEGA2_BACKUP区的第一个数据对应的地址也不为FC00,而是大于FC00这个地址.因为有其实代码被安排进这个区了.当进行Flash块擦写时,在主存储器中以512为一个单位块的.所以当常被安排进这个区时,一进行Flash擦除操作时,这个区的地址对应的内容都会变成0xFF ,所以安排进来的其它代码也被改变了.当执行到这部分被改变的代码时,那就会出现不可预料的后果.
解决上面的问题非常简单,就是使CONST与CODE的分配不要有交集.
在写配置文件(.xcl文件)时,要注意定义的CODE空间与CONST空间的交集要为0,否则程序将会存在不可预料的bug。但通过仿真能看出来
下面的定义是正确的:
下面是没有交集的空间配置:(这种配置是正确的)
-Z(CONST)DATA16_C,DATA16_ID,DIFUNCT,CHECKSUM=C000-FBFF
-Z(CODE)SEGA2_BACKUP=FC00-FDFF
这种配置的交集为:0
当这样配置后,编译提示分配的空间太小了.那就要进行代优化啦.
优化代码有以下三种小方法,这个只是个人看法,欢迎讨论
1、从结构体变量初始化处下手,可以定义一个指针,使指针指向结构体的变量的地址,在指向时要对指针进行强制转换。然后通过循环将变量里的成员进行初始化
2、查找程序里的重复代码,将找出的重复代码以一个小函数代替,当然,代替后的总代码量不能 大于代替前的代码量。
3、尽量减少程序中的宏定义,因为宏在展开是会增加代码量
分享自:http://t.cn/zHWJFHQ
|
|