使用MCU: MSP430F5438 编译环境: IAR V4.21
使用语言: C
现象: 正常销售的产品在更改了一些程序后测试过程中出现两次死机想象。
情况:
1.该程序很大,有50多K,程序有不太合理的地方,很多地方有清狗。因此怀疑死机是进入死循环,而循环中有清狗,导致死机而非看门狗复位。
经认真排查,未发现可疑死循环,或数值指针越界。
2.怀疑子程序嵌套太深,堆栈溢出。
IAR仿真再打开STACK提示总堆栈160个字节,使用142字节。没有堆栈溢出。
3.网上查资料看到,IAR中局部变量也使用堆栈,怀疑在很深的堆栈时用了较大局部变量导致溢出。
做实验,在怀疑的子程序中人为申请一个200字长度数值,单步调试发现堆栈的确溢出。全速调试,故障现象和那两次死机一致。
现在初步认为IAR中最大160,使用142的142是指嵌套堆栈的深度,而不包括局部变量。因此最差情况下,堆栈只有160-142=18字节的裕量,可能在申请大局部变量的时候堆栈溢出。
求证,请问我这个判断成立吗?还有别的可能吗?还有就是堆栈溢出死机但是看门狗没有复位,是因为程序大量地方清狗,导致溢出跑飞的地方还能清狗造成的吗? |