2162|0

2781

帖子

419

TA的资源

五彩晶圆(中级)

楼主
 

MSP430配置文件问题--.xcl文件 [复制链接]

今天在调试程序时,发现程序执行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
                                                    
 
点赞 关注
个人签名

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表