|
有关MSP430F4xxx小RAM堆栈溢出问题
[复制链接]
大学同学在线问我他最近搞项目开发时遇到的一个问题,跟他聊了聊。他最近在搞水表的计量开发,采用的平台是MSP430F4250(PS:很早之前去潍坊考察过一个做表的企业,发现搞表计量的大多都在用MSP430(貌似也有用STM8的),其中F4系列用的较多,一方面当然是考虑到功耗的问题,现在的表多是电池供电,一用就得用个一两年是必须的,还有就是F4系列自带段式液晶的驱动,并且支持差分的高分辨率A/D输入,这点蛮重要的,现在的高精度传感器貌似一色的差分输出),他遇到的问题是程序里某个变量经常性的会被意外改变,造成数据混乱,所以产品一直无法出货。
看到上面的问题,有经验的人很快就会意识的问题的所在,无非就是两种可能,一个是该变量是全局的,而程序里有bug造成该变量在某个地方被错误的操作了,另外一种就是内存溢出了,变量地址重叠,造成数据混乱。个人感觉后一种的可能性较大,而事实也是如此,翻看MSP430F4250的数据手册诧异的发现它的RAM竟然只有可怜的256B(是Byte,你没有看错,有木有,赶上当年叱咤一时的51了,看来不是后面的数越大就代表片子配置越NB),这对拥有动则几KB、几十KB甚至上百KB RAM的ARM来说,的确有点大巫见小巫的感觉,RAM这么小倒的确不敢用了(咳咳,都是被惯的,呵呵),这要是在上面写程序还真得谨慎再谨慎啊。我一直觉着,在高端配置资源丰富的平台写出NB的算法实现NB的功能不算真正的NB,而在配置低端资源有限的平台能实现同样的功能那才叫NB,低端搞实现,高端搞优化嘛,哈哈。
回到正题,最后经过各种尝试,解决了问题,主要原因是他使用了中断嵌套,这就造成了内存经常会只入栈不出栈,这对RAM空间紧缺堆栈大小有限的MCU来说是致命的,也就造成了前面遇到的数据混乱问题,所以这里提几点小RAM空间MCU写程序时需要注意的问题:
(1)变量尽量使用局部变量;
(2)不要在中断服务函数里进行数据处理等复杂操作,将其移到while(1)主线程里,中断服务程序里只是置位相应标志即可;
(3)不要使用中断嵌套功能;
(4)合理安排内存空间,尤其是堆栈区。
|
|