本着对别人和自己负责的有始有终的原则,说说现在的更新或者状态:
我发现只要把操作那个数组的语句mark掉,结果就不会死掉;仔细看最后生成的map文件,发现因为没有操作和使用,这个数组被优化掉了,于是我想到一个方法就是把这个数组的大小减小到1或者2,然后把别的文件中的数组也减小,最后居然发现不会死掉!
我的第一反应就是这些数据和堆栈有冲突,于是转而去研究msp430的堆栈。msp430的堆栈老实说,资料说得不清楚,或者说具有二义性(有些地方看上去说是向下生长,有些地方看上去说是向上生长),我通过程序测试,发现是向下生长的,也就是说,最初把堆栈设在RAM的Top位置,这种设计其实比向上增长要好,不需要例外设置SP了,除了程序用到的RAM,其它都给了堆栈;但是程序员要自己保证堆栈不会盖到数据区。CC430F5137是有4K RAM的,我看了很明显是足够的,所以不是数据和堆栈引起的问题。
然后我继续做测试,终于发现有些规律,也就是全局变量超过256个才会出问题,再看map文档,发现定义的全局变量分为三种:
DATA16_N:不需要初始化的
DATA16_I:初始化为非0的
DATA16_Z: 初始化为0的(包括定义没有初始化,会自动初始化为0)
如果不加修饰就会认为是需要初始化为0的,通过看IAR的帮助文档,可以用 no_init来修饰这些变量成为不要初始化的。现在我的解决方法是把一些用到的buffer定义成 no_init的,使得整个DATA16_Z 的size小于256.问题得以解决。
个人猜想应该是IAR的启动程序限定了 DATA16_I 和 DATA16_Z 的大小,但我没有找到对应的地方,如果有哪位大虾知道,请指点一下。