[方案相关] 三种跑飞现象分析

[复制链接]
 楼主| kkzz 发表于 2025-2-25 10:55 | 显示全部楼层 |阅读模式
1 数组越界/溢出
现象:
单片机程序在函数中运行时,总是在运行到函数末尾,要跳出函数时,程序跑飞。
原因:
数组越界(数组溢出),函数中定义的数组元素的个数小于程序中实际使用的数组元素的个数,例如在函数中定义了一个数组ucDataBuff[10],这个数组只有10个元素,但是在函数中却有这样的语句ucDataBuff[10]=0x1a,这个语句是给数组的第11个元素赋值,:由于定义的数组只有10个元素,从而导致赋值语句中不知道把0x1a放到什么地方,从而导致程序跑飞。
解决方法:
如果在调试程序时,发现程序总是在函数执行完毕时跑飞,多数情况是发生了数组越界(数组溢出)的错误,仔细检查函数中调用的数组是否存在越界(溢出)的情况。
2 中断服务程序缺失
现象:
程序运行过程中总是跑飞。
原因:
程序中打开了某个中断,但是却没有相应的中断服务程序,从而导致在中断发生后,找不到中断服务程序入口,从而导致程序跑飞。
解决方法:
检查程序中是否存在打开了某个中断,但是没有相对应的中断服务程序。
3 看门狗复位
现象:
在执行一段较为耗费时间的程序时,程序跑飞,并且总是跳到复位位置处。
原因:
程序中使用了看门狗,但是没有及时“喂狗”,从而导致看门狗复位,使程序直接跳到复位位置。
解决方法:
根据程序运行时间,尤其是一定要计算清楚最耗时的那段程序的运行时间,然后准确设置看门狗的复位时长,定时“喂狗”,尤其是如果有死循环的情况,一定要在死循环中记得“喂狗”。

chenqianqian 发表于 2025-2-25 20:37 来自手机 | 显示全部楼层
正常情况下,大多数时候跑飞都是第一种情况。
wyde518 发表于 2025-2-26 10:44 | 显示全部楼层
数据越界 很烦人,但有时候还不好发现 ,我一直纳闷诸如KEIL之类为什么没办法发现此类错误
suncat0504 发表于 2025-2-26 22:01 | 显示全部楼层
1是非常不好找的,不仔细分析程序和处理逻辑,有时候真找不出来。
suncat0504 发表于 2025-2-26 22:02 | 显示全部楼层
3的问题,得经过测试才能找出来。而且要把中断的各种分支都得走到、测试。
suncat0504 发表于 2025-2-26 22:03 | 显示全部楼层
作为程序员,有时候真的感觉需要很细心才行。处理逻辑越复杂、互相打架的地方越多,越容易出纰漏。所以程序员是烧脑的一个行业,导致头发减少。
suncat0504 发表于 2025-2-26 22:05 | 显示全部楼层
在有图形界面的,采用某个框架的,还得考虑界面上不同处理之间会不会打架、产生冲突。
结合国际经验 发表于 2025-2-27 14:37 | 显示全部楼层
确保每个启用的中断都有对应的中断服务程序。

g36xcv 发表于 2025-2-28 00:37 | 显示全部楼层
如果数组的大小是动态的,可以使用动态内存分配(例如使用 malloc)并确保不越界。
地瓜patch 发表于 2025-2-28 08:31 来自手机 | 显示全部楼层
wyde518 发表于 2025-2-26 10:44
数据越界 很烦人,但有时候还不好发现 ,我一直纳闷诸如KEIL之类为什么没办法发现此类错误 ...

越界会进入硬件错误
电子星辰 发表于 2025-2-28 10:08 | 显示全部楼层
请问不同的跑飞,复位位置有什么不一样呢?
gejigeji521 发表于 2025-2-28 15:07 | 显示全部楼层
没遇到过内,代码要严谨。不能操作不存在的内容
yangjiaxu 发表于 2025-2-28 15:25 | 显示全部楼层
跑飞的话,就用个看门狗就好了
wilhelmina2 发表于 2025-3-9 20:14 | 显示全部楼层
单片机程序在函数中运行时,总是在运行到函数末尾、要跳出函数时程序跑飞。
janewood 发表于 2025-3-9 21:55 | 显示全部楼层
根据程序运行时间,尤其是最耗时的那段程序的运行时间,准确设置看门狗的复位时长。
houjiakai 发表于 2025-3-10 11:32 | 显示全部楼层
根据程序的实际运行情况,合理设置看门狗定时器的预分频系数和计数值。确保在正常情况下,程序能够在看门狗定时器超时之前完成“喂狗”操作。同时,也要注意不要将定时器设置得过于宽松,以免失去监控作用。
kmzuaz 发表于 2025-3-10 14:41 | 显示全部楼层
在调试程序时,如果发现程序总是在函数执行完毕时跑飞,应首先检查函数中调用的数组是否存在越界或溢出的情况。
51xlf 发表于 2025-3-10 17:46 | 显示全部楼层
排除外部干扰源,如加强电磁屏蔽、稳定电源供应等。同时,检查硬件电路是否存在故障或异常,如晶振是否正常工作、电源是否稳定等。
adolphcocker 发表于 2025-3-11 13:59 | 显示全部楼层
在关键位置手动添加边界检查逻辑,虽然会增加少量开销,但对于调试非常有用。
lzbf 发表于 2025-3-11 15:53 | 显示全部楼层
在访问数组之前,进行边界检查              
您需要登录后才可以回帖 登录 | 注册

本版积分规则

332

主题

11219

帖子

13

粉丝
快速回复 在线客服 返回列表 返回顶部