[资源共享]

单片机程序又跑飞?!三种跑飞现象分析

[复制链接]
787|8
手机看帖
扫描二维码
随时随地手机跟帖
powerantone|  楼主 | 2022-10-20 15:29 | 显示全部楼层 |阅读模式
在编写单片机程序的时候,由于中断服务程序写的不好,导致单片机程序总是跑飞,最后费了好长时间,花了很大功夫才找到问题原因,由此总结了单片机程序跑飞的三种现象、原因及解决方法。

1 数组越界/溢出

现象:

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

原因:

    数组越界(数组溢出),函数中定义的数组元素的个数小于程序中实际使用的数组元素的个数,例如在函数中定义了一个数组ucDataBuff[10],这个数组只有10个元素,但是在函数中却有这样的语句ucDataBuff[10]=0x1a,这个语句是给数组的第11个元素赋值,:由于定义的数组只有10个元素,从而导致赋值语句中不知道把0x1a放到什么地方,从而导致程序跑飞。

解决方法:

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

2 中断服务程序缺失

现象:

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

原因:

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

解决方法:

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

3 看门狗复位

现象:

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

原因:

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

解决方法:

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

使用特权

评论回复
tpgf| | 2022-11-3 13:43 | 显示全部楼层
程序跑飞是指系统受到某种干扰后,程序计数器PC的值偏离了给定的唯一变化历程,导致程序运行偏离正常的运行路径.

使用特权

评论回复
qcliu| | 2022-11-3 14:10 | 显示全部楼层
意外中断。是否打开了某个中断,但是没有响应和清除中端标志,导致程序一直进入中断,造成死机假象。

使用特权

评论回复
drer| | 2022-11-3 15:17 | 显示全部楼层
若定义某些会在中断中修改的全局变量,这时要注意两个问题:首先为了防止编译器优化中断变量,要在这些变量定义时前加volatile,其次在主循后再打开全局中断;否则出现造成数据乱套。

使用特权

评论回复
coshi| | 2022-11-3 15:54 | 显示全部楼层
地址溢出,常见错误为指针操作错误。我要着重说的是数组下标使用循环函数中循环变量,如果循环变量没控制好则会出现数组下标越界,意外修改系统的寄存器造成死机,这种情况下如果死机说明运气好,否则后面不知道发生什么头疼的事。

使用特权

评论回复
kxsi| | 2022-11-3 17:08 | 显示全部楼层
无环中读取中断变量前应该首先关闭全局中断,防止读到一半被中断给修改了,读完之条件的死循环;比如使用while(x);等待电平变化,正常情况下x都会变成0,就怕万一,因此最好加上时间限制。

使用特权

评论回复
wiba| | 2022-11-3 17:17 | 显示全部楼层
看门狗没有关闭。有的单片机即使没使用看门狗开机时也有可能意外自动开启了最小周期的看门狗,导致软件不断复位,造成死机,这个要看芯片手册,最好在程序复位后首先应该显式清除看门狗再关闭看门狗。

使用特权

评论回复
V853| | 2022-11-5 09:42 | 显示全部楼层
程序跑飞情况很多,如果真遇到,需要调试程序才能发现。

使用特权

评论回复
chenjun89| | 2022-11-5 12:54 | 显示全部楼层
跑飞一般就进入hardfault错误

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则