
单片机如何有效防止程序跑飞?
一、常见现象及原因
1、数组越界/溢出:函数中定义的数组元素个数小于实际使用的个数,导致赋值时数据不知存放何处,从而引发程序跑飞,定义了ucDataBuff[10],却使用ucDataBuff[10]=0x1a给第11个元素赋值。

2、中断服务程序缺失:程序打开了某个中断,但没有相应的中断服务程序,当中断发生后,找不到入口,导致程序运行异常。
3、看门狗复位:使用了看门狗但未及时“喂狗”,使得看门狗在超时后触发复位,程序直接跳到复位位置。
4、外设未初始化:硬件IIC、串口等外设在上电或休眠唤醒后,未执行初始化操作,便进行发送或读取等操作,可能导致死机。
5、指针使用出错:如指针未正确初始化、指针越界访问等,会破坏内存数据的完整性,使程序出现不可预测的行为,进而导致跑飞。
6、内存泄露:不断分配内存空间却未及时释放,导致可用内存逐渐减少,最终可能使系统无法正常运行,引发程序跑飞。
7、蓝牙连接广播异常:蓝牙连接广播间隔过小,可能造成屏幕显示异常、I2C通信异常等问题。
二、应对方法
1、检查数组边界:仔细检查函数中调用的数组是否存在越界情况,确保数组元素的访问在合法范围内。
2、完善中断服务程序:为每个打开的中断编写对应的中断服务程序,保证中断发生时能够正确响应。

3、合理设置看门狗:根据程序运行时间,尤其是最耗时的程序段,准确设置看门狗的复位时长,并定时“喂狗”,对于死循环等情况,务必在循环中记得“喂狗”。
4、初始化外设:在使用外设之前,确保对其进行正确的初始化操作,避免因未初始化而导致的错误。
5、谨慎使用指针:在使用指针时,要确保其正确初始化,并严格检查指针的指向范围,防止越界访问。
6、优化内存管理:养成良好的内存使用习惯,及时释放不再使用的内存空间,避免内存泄露。
7、调整蓝牙广播间隔:将蓝牙连接广播间隔设置成1.5s2s,以减少异常情况的发生。
三、关键代码保护措施
1、关闭中断:在通过硬件SPI或者IIC跟外设通信开始前,关闭总中断;通信结束后,再打开总中断,以此保护关键代码运行不受干扰。
2、进入临界区:采用进入临界区和退出临界区的方式(如enter_critical() / exit_critical()),来保护关键代码不被其他中断抢占。
单片机程序跑飞的原因多种多样,需要从多个方面进行检查和预防,通过以上措施的综合运用,可以有效提高单片机程序的稳定性和可靠性,降低程序跑飞的风险。
作者:豆面本文地址:https://www.jerry.net.cn/articals/29980.html发布于 2025-02-09 21:24:03
文章转载或复制请以超链接形式并注明出处杰瑞科技发展有限公司