1543|1

3836

帖子

19

TA的资源

纯净的硅(中级)

楼主
 

MSP单片机的存储器问题 [复制链接]

本帖最后由 fish001 于 2018-2-21 17:59 编辑

     这个问题是一个很严肃的问题。如果说ADC是功耗的隐藏任务,那么这个就是动摇你的整个程序结构基础的隐藏boss,要么你遇不到,遇到了你就   over了,因为这个不是打怪升级。我们先来看看一个warning:


      也许这个问题有人一辈子都遇不到的,这个问题很蛋疼。神马叫做访问了奇地址???这个问题和电脑上的暴力访问内存某地址有着异曲同工之妙。当时我遇到这个问题的时候,有种蛋蛋被人捏在手里的感觉。不过幸好有mc_wangbo这位高人指点。
首先要确定这个地址在什么地方。由于430是冯诺依曼结构的所以程序存储器和数据存储器是一起的。按上用户手册上所说,0x0200以上是RAM,当然是看大小。因为当时我使用的是msp430f4152,RAM为512B,也就是0x0200~0x0400为RAM区,0x0400以上是code区,那么也就是code区有问题。
然后再解释奇地址的问题。下面是截自用户手册的一段关于存储器组织的一段话:

      上面的意思是说,字节数据可以位于奇地址和偶地址,而字数据只能位于偶地址!!!什么意思呢?msp430是16位单片机,它的一个字就是2个字节,虽然它是16位单片机,它还是按照半字方式进行存储,它的一个地址对应的其实是一个字节,而不是一个字!!!也就是说它的存储方式还是8位的(这种存储方式的好处是不会浪费RAM),只是一次可以处理2个8位的数据而已...所以地址才要区分奇偶!又由于其存储方式是小端存储,16位数据高8位存在高地址低8位存在低地址,但是低地址必须是偶地址!!!
那么情况就大概明了了。编译器编译的结果,一般单纯的指令是不会存在这种漏洞的,唯一的可能性就是,定义在code区的常量出问题了,也就是前面加了const的变量!!!
        为什么呢?因为编译器还没有那么智能,假设你定义的常量变量是一串unsigned char型的数组,带着const,如x[4]={0x12,0x34,0x56,0x78};编译器看你是定义的8位,它会使用MOV.B(半字指令)来将这串数组常量存储,假设存储在0xc120,0xc121,0xc122,0xc123这4地址上。这个本来就无可厚非,但是如果你在程序中将这4个数强制转换为一个unsigned char、一个unsigned int和一个unsigned char型的结构体(别说不可以,指针是个很奇妙的东西),那么隐藏的boss就如死神一样挥起收割灵魂的镰刀,在使用这个结构体的时候单片机先使用MOV.B来调用第一个unsigned char数也就是0xc120上的0x12,然后再用MOV.W来调用第二个unsigned inti型的数也就是0xc121和0xc122上的数连起来是0x5634,但是实际上就出错,因为低地址被存在了0xc121这个奇地址上!!!!MOV.W无法访问奇地址!!!
     也就是说实际上单片机根本就不会去访问0xc121这个地址,而是跳过了0xc121直接从0xc122开始取出数据,取出来的是0x7856!!!坑爹了吧!!!而且这个警告在编译的时候不会出错!!!下到单片机里面也不会出错,还能运行!!!只有在软件仿真的时候编译器会出错!!!!
    最好的解决方法,就是别这么干,编译器不会出错,它也不会故意这么分配地址,所以当你定义半字数组,而在程序中又要强制转换类型的时候,就要特别注意。如果你想要把每个数组都定义到偶地址,可以在定义完数组之后在数组后面加上@0xc120,这样数组就会定义到这个地址开始的地方。




最新回复

看来TI的编译器还是有点问题的,这种问题,编译器应该给出警告,并给出解决方法。   详情 回复 发表于 2023-3-28 16:34
 
点赞 关注

回复
举报

115

帖子

0

TA的资源

一粒金砂(高级)

沙发
 

看来TI的编译器还是有点问题的,这种问题,编译器应该给出警告,并给出解决方法。

 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
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
快速回复 返回顶部 返回列表