MSP430中定义大数组存在的问题及解决方案

这两天利用MSP430做一个小系统,需要定义一个很大的全局数组,编译之后没有问题,但是调试的时候却遇到了问题。下面我们先来看下遇到的问题。

问题:

利用CCS软件将代码烧入430之后,在还没有点击开始运行时,程序就已经开始自动运行了如下图所示,在点击暂停之后,程序就报错了。在把那个数组元素个数改的很小之后,程序就正常了。所以可以断定,是由于定义大数组产生的问题。

问题分析:

通过查找资料,发现产生这个问题的原因是因为全局数组定义过大时,系统一上电,需要对这些数组初始化,初始化的时间过长,导致看门口溢出,从而一直进不了主函数,导致程序跑飞了。

解决方案:

(1)编写C启动函数

在TI官网找了有关CCS的资料之后,找到了解决方案。

除了主函数之外,我们需要再定义一个函数,函数名为的_system_pre_init(),在CCS编译器中,这是一个C启动函数,是在主函数开始执行之前执行的,所以在该函数里,加入关闭看门口的代码就可以解决这个问题了~

在IAR编译器中,也有类似的函数,为__low_level_init(),使用方法与上文提到的相同。

(2)将大数组放在RAM的不初始化区域

既然已经知道是初始化时间过长导致这个问题,我们可以把大数组定义在RAM的不初始化区域就行了。

在IAR编译器中,在定义变量之前,加上__no_initm命令即可,如__no_init char a; 即把a这个字符型变量放在RAM的不初始化区域。

在CCS编译器中,没有这样的命令,需要做类似的操作的话,有些繁琐,需要自己改写CMD文件,这里就不再赘述了。大家有兴趣的话,可以到TI官网下载相应的文档看一下。

永不止步步 发表于12-03 10:05 浏览65535次
分享到:

已有0条评论

暂时还没有回复哟,快来抢沙发吧

添加一条新评论

只有登录用户才能评论,请先登录注册哦!

话题作者

永不止步步
金币:67417个|学分:363741个
立即注册
畅学电子网,带你进入电子开发学习世界
专业电子工程技术学习交流社区,加入畅学一起充电加油吧!

x

畅学电子网订阅号