【TI BLE】CC254x系统运行跑飞问题

1、背景

作为软件设计师,大家应该都遇到过系统莫名挂死或跑飞,今天笔者就该问题做一下总结,如果开发过程遇到可以作为参考。

2、问题梳理

2.1、意外中断

是否打开了某个中断,但是没有响应和清除中端标志,导致程序一直进入中断,造成死机假象或跑飞。

2.1.1、中断服务程序缺失

现象:

程序运行过程中总是跑飞。

原因:

程序中打开了某个中断,但是却没有相应的中断服务程序,从而导致在中断发生后,找不到中断服务程序入口,从而导致程序跑飞。

解决方法:

检查程序中是否存在打开了某个中断,但是没有相对应的中断服务程序。

2.2、中断变量处理不妥

若定义某些会在中断中修改的全局变量,这时要注意两个问题:首先为了防止编译器优化中断变量,要在这些变量定义时前加volatile,其次在主循环中读取中断变量前应该首先关闭全局中断,防止读到一半被中断给修改了,读完之后再打开全局中断;否则出现造成数据乱套。

2.3、地址溢出

常见问题为指针操作错误。

例如:

数组下标使用循环函数中的循环变量,如果循环变量没控制好则会出现数组下标越界,意外修改系统的寄存器造成死机。

2.3.1、数组越界导致的跑飞

现象:

程序在函数中运行时,总是在运行到函数末尾,要跳出函数时,程序跑飞;

原因:

数组越界(数组溢出),函数中定义的数组元素的个数小于程序中实际使用的数组元素的个数;

解决方法:

如果在调试程序时,发现程序总是在函数执行完毕时跑飞,多数情况是发生了数组越界(数组溢出)的错误,仔细检查函数中调用的数组是否存在越界(溢出)的情况。

2.4、无条件的死循环

例如:

使用 while(i); 等待电平变化,正常情况下变量 i 都会变成 0,如果出现问题系统就会挂死,因此最好加上时间限制。

2.5、看门狗没有关闭

有时即使没使用看门狗,开机也有可能意外自动开启了最小周期的看门狗,导致软件不断复位造成死机,需要查看芯片手册,最好在程序复位后显式清除看门狗后再关闭看门狗。

2.5.1、看门狗复位

现象:

在执行一段较为费时的程序时,程序跑飞并且总是跳到复位位置处。

原因:

程序中使用了看门狗,但是没有及时“喂狗”,从而导致看门狗复位,使程序直接跳到复位位置。

解决方法:

根据程序运行时间,需要计算清楚最耗时的那段程序的运行时间,然后准确设置看门狗的复位时长,定时“喂狗”,尤其是如果有死循环的情况,一定要在死循环中记得“喂狗”。

2.6、堆栈溢出

最难查找的问题,对于容量小的单片机,尽量减少函数调用层级,减少局部变量,从而减少压栈的时候所需的空间。

如果你把以上几条都试过,还不能解决问题,试一试把你的被调用函数直接内置到调用的地方,把占用 RAM 大的局部变量改成全局变量。


猜你喜欢

转载自blog.csdn.net/liwei16611/article/details/78633397
TI
今日推荐