打印

MSP430堆栈问题求确认

[复制链接]
5034|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
nqyijian|  楼主 | 2012-8-29 11:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
使用MCU:    MSP430F5438 编译环境:   IAR V4.21
使用语言:   C
现象:         正常销售的产品在更改了一些程序后测试过程中出现两次死机想象。
情况:

   1.该程序很大,有50多K,程序有不太合理的地方,很多地方有清狗。因此怀疑死机是进入死循环,而循环中有清狗,导致死机而非看门狗复位。
           经认真排查,未发现可疑死循环,或数值指针越界。
   2.怀疑子程序嵌套太深,堆栈溢出。
           IAR仿真再打开STACK提示总堆栈160个字节,使用142字节。没有堆栈溢出。
   3.网上查资料看到,IAR中局部变量也使用堆栈,怀疑在很深的堆栈时用了较大局部变量导致溢出。
           做实验,在怀疑的子程序中人为申请一个200字长度数值,单步调试发现堆栈的确溢出。全速调试,故障现象和那两次死机一致。

      现在初步认为IAR中最大160,使用142的142是指嵌套堆栈的深度,而不包括局部变量。因此最差情况下,堆栈只有160-142=18字节的裕量,可能在申请大局部变量的时候堆栈溢出。

        求证,请问我这个判断成立吗?还有别的可能吗?还有就是堆栈溢出死机但是看门狗没有复位,是因为程序大量地方清狗,导致溢出跑飞的地方还能清狗造成的吗?

相关帖子

沙发
nqyijian|  楼主 | 2012-8-29 11:56 | 只看该作者
把申请的200字长度数组改为100,单步运行显示溢出,但是全速运行程序好像正常

使用特权

评论回复
板凳
zhl100| | 2012-8-29 17:19 | 只看该作者
我遇到过程序死在while(1)里,中断不响应,好像是程序存储空间不足,中断里写的太多了就这样了,也就是来回调用处理的比较多,就挂了

使用特权

评论回复
地板
xxlin1984| | 2012-8-29 18:05 | 只看该作者
F5438有16KB的RAM吧,LZ先看看用了多少?

IAR设置中的stack/heap 默认为80/80,单位字节。
stack用于函数调用产生的堆栈需求(怀疑堆栈溢出,就改这个);
heap用于函数运行时所需的动态内存(即临时的局部变量);

使用特权

评论回复
5
dota_yy| | 2014-1-13 13:12 | 只看该作者
看看大家以前遇到的问题,学习下解决方法

使用特权

评论回复
6
xuetudou| | 2015-3-4 10:27 | 只看该作者
老帖子了,但还是要顶一下,我遇到的是全局变量被莫名其妙的修改自减之前和之后都进行一次数据打印,发现变量自减之后本应该是0,变成了167,也是仔细检查了很长时间都没发现问题,后来看了下map文件,把堆栈从80改成了100,正常了,但是根据map文件信息里堆栈改成100好像还是不够用,继续研究下堆栈和map文件,看看有收获没。

使用特权

评论回复
7
zhijun1988| | 2015-3-5 11:28 | 只看该作者
好老了的帖子。。

使用特权

评论回复
8
风清扬mxz| | 2015-3-5 15:24 | 只看该作者
虽然是很老的帖子了,还是要顶一下,我也遇到这样的问题。全局变量被莫名其妙的修改,不知道该如何解决,也不知道是哪里出了问题,希望有遇到同样问题的大神出来分享一下经验

使用特权

评论回复
9
aaronjedi| | 2015-7-15 13:47 | 只看该作者
希望有人分享下经验

使用特权

评论回复
10
smilingangel| | 2015-7-18 15:22 | 只看该作者
这个对战问题的还是需要多注意的,多优化下程序的吧。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

75

主题

539

帖子

1

粉丝