CC430单片机诡异问题求助

楼主
CC430单片机诡异问题求助
最近用CC430F5137单片机做一个东西,使用的IAR的编译器,出现了很诡异的东西:
1.系统中有一个128*64的LCD,之前我想做一个cache也就是一个全局二维数组和这128*64个点阵一一对应,结果程序直接挂掉;当时没在意;
2.昨天程序定义了一个结构体,然后定义了一个全局的结构体数组,结果操作这个结构体数组,程序也直接挂掉:
  A、我看了map文档,看了这个结构体数组确实是落在RAM区域并且也没有溢出;
  B、打开List输出在list文件中看反汇编,看上去也是对的。
不知道哪位大虾有这样的解决经验?
1楼
    本着对别人和自己负责的有始有终的原则,说说现在的更新或者状态:
    我发现只要把操作那个数组的语句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 的大小,但我没有找到对应的地方,如果有哪位大虾知道,请指点一下。
2楼
。。。开眼界了,你居然已经到了从RAM、汇编和编译器的层面研究程序了。。。我们大多数人还停留在IAR下调试C语言程序的程度。。。老兄你在这方面如果还有新的进展和心得,发上来大家一起学习学习吧~呵呵
3楼
[QUOTE][B]下面引用由[U]北夜星辰[/U]发表的内容:[/B]

。。。开眼界了,你居然已经到了从RAM、汇编和编译器的层面研究程序了。。。我们大多数人还停留在IAR下调试C语言程序的程度。。。老兄你在这方面如果还有新的进展和心得,发上来大家一起学习学习吧~呵呵[/QUOTE]

大哥,没有那么深奥的,单片机的东西,往往一通百通,msp430+IAR我才玩了一个多月而已。现在我还是不确定这个问题到底是什么问题,所以还是很关注,期望真正的大虾出手解惑。
另外,对于用仿真器调试,其实我是一直不喜欢的,我的做法是,拿到新的东西,先把串口调试出来,然后自己在写模块的时候通过串口测试。用仿真器容易引起惰性,有些问题也就放弃深究了。不用仿真器,可以强迫自己把程序写得很健壮,很容易修改,很容易测试……
4楼
是系统的看门狗溢出了,自己复位,貌似dangji了。
5楼
多谢楼上的兄弟:
这个问题是因为的你的使用RAM超过4K,芯片无法启动的问题, 是因为MSP430一上电,看门狗就启动了, 但是RAM使用过大, 程序在初始化RAM的过程中时间过长,看门狗就溢出了,使得单片机复位了。 解决办法是是把 关闭看门狗的语句WDTCTL = WDTPW + WDTHOLD;  放在__low_level_init() 里面,因为这个函数要优先于RAM初始化的程序运行。

--------------------------------------------------------------------------------

这个问题我想我今天上午应该真的解决了,找问题的过程有些复杂,另外我还得花时间来更换原先利尔达的程序,所以暂时不在这里描述了,等我整理完毕再和大家讨论。

电脑版 Page created in 0.1543 seconds width 3 queries.