打印
[资源共享]

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

[复制链接]
2414|19
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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,其次在主循后再打开全局中断;否则出现造成数据乱套。

使用特权

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

使用特权

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

使用特权

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

使用特权

评论回复
8
V853| | 2022-11-5 09:42 | 只看该作者
程序跑飞情况很多,如果真遇到,需要调试程序才能发现。

使用特权

评论回复
9
chenjun89| | 2022-11-5 12:54 | 只看该作者
跑飞一般就进入hardfault错误

使用特权

评论回复
10
Alina艾| | 2023-1-29 16:31 | 只看该作者
单片机跑飞课太多原因了,不仅仅是三种呀

使用特权

评论回复
11
Alina艾| | 2023-2-1 07:05 | 只看该作者
其实还有静电之类的,这种原因可太多了

使用特权

评论回复
12
Belle1257| | 2023-2-1 08:02 | 只看该作者
看门狗复位靠谱,这个有时候超时喂狗,就这样了

使用特权

评论回复
13
Carina卡| | 2023-2-1 09:08 | 只看该作者
数组越界出问题的还少,就是看门狗出问题的多

使用特权

评论回复
14
Estelle1999| | 2023-2-1 10:12 | 只看该作者
其实数组越界一般都是数组设小了,没啥办法,多调试就好了

使用特权

评论回复
15
Charlene沙| | 2023-2-1 11:15 | 只看该作者
中断这种冲突也有可能会这样

使用特权

评论回复
16
Annie556| | 2023-2-1 13:04 | 只看该作者
其实你说的这三种,一般仿真就能看出来的

使用特权

评论回复
17
Betty996| | 2023-2-1 14:03 | 只看该作者
跑飞还不好找原因,真的麻烦

使用特权

评论回复
18
Candic12e| | 2023-2-2 07:36 | 只看该作者
楼主有空讲讲硬件问题导致的跑飞呗,比如静电之类的

使用特权

评论回复
19
Emily999| | 2023-2-2 12:21 | 只看该作者
看门狗这块,一般需要调试的时候先关掉,之后实际的时候再加上,这样才行

使用特权

评论回复
20
lgm_sz| | 2023-2-2 13:55 | 只看该作者
你这个跑飞都是人为的

使用特权

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

本版积分规则

549

主题

2383

帖子

4

粉丝