打印
[技术问答]

单片机程序又跑飞?

[复制链接]
1082|30
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
uptown|  楼主 | 2024-12-18 12:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在编写单片机程序的时候,由于中断服务程序写的不好,导致单片机程序总是跑飞,最后费了好长时间,花了很大功夫才找到问题原因,由此总结了单片机程序跑飞的三种现象、原因及解决方法。



1数组越界/溢出

现象:

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

原因:

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

解决方法:

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



2中断服务程序缺失

现象:

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

原因:

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

解决方法:

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



3看门狗复位

现象:

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

原因:

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

解决方法:

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

使用特权

评论回复
沙发
pixhw| | 2025-1-7 15:18 | 只看该作者
电源电压波动可能导致单片机工作异常。例如,当电源的纹波过大或者电源芯片的输出电压在负载变化时出现较大波动,单片机可能会因为供电电压超出正常工作范围而出现程序跑飞的情况。

使用特权

评论回复
板凳
febgxu| | 2025-1-7 22:26 | 只看该作者
采用屏蔽、接地等措施,减少电磁干扰对系统的影响。

使用特权

评论回复
地板
saservice| | 2025-1-8 00:56 | 只看该作者
如果中断优先级设置不当或者在中断服务程序中没有正确处理中断嵌套,可能会导致程序跑飞。例如,当一个高优先级中断不断地打断低优先级中断的执行,而在低优先级中断服务程序中没有采取适当的保护措施,就可能会出现数据丢失、栈溢出等问题。

使用特权

评论回复
5
hhdhy| | 2025-1-8 15:40 | 只看该作者
单片机程序“跑飞”是指程序执行过程中,程序计数器(PC)跳转到非预期的地址,导致程序无法按照设计逻辑正常运行。这种现象通常会导致系统崩溃、死循环或异常行为。

使用特权

评论回复
6
wamed| | 2025-1-8 16:43 | 只看该作者
堆栈空间不足,导致函数调用或中断嵌套时,堆栈数据覆盖了其他内存区域。常见于递归调用、中断嵌套过深或局部变量过多的情况

使用特权

评论回复
7
tiakon| | 2025-1-8 17:55 | 只看该作者
野指针(未初始化或已释放的指针)或数组越界访问,导致程序跳转到非法地址

使用特权

评论回复
8
清芯芯清| | 2025-1-8 19:12 | 只看该作者
中断服务程序(ISR)未正确处理,导致中断嵌套或资源竞争。中断优先级设置不当,导致高优先级中断打断低优先级中断的关键操作

使用特权

评论回复
9
gra22ce| | 2025-1-8 21:30 | 只看该作者
电源不稳定、晶振失效、电磁干扰等硬件问题导致程序跑飞。

使用特权

评论回复
10
nqty| | 2025-1-9 08:34 | 只看该作者
看门狗定时器未及时喂狗,导致系统复位。

使用特权

评论回复
11
pe66ak| | 2025-1-9 10:03 | 只看该作者
编译器优化导致某些代码被错误地优化掉,或者变量值被错误地覆盖。

使用特权

评论回复
12
hight1light| | 2025-1-9 11:25 | 只看该作者
降低编译器优化级别,或使用volatile关键字修饰关键变量。检查生成的汇编代码,确认优化是否符合预期。

使用特权

评论回复
13
eleg34ance| | 2025-1-9 12:49 | 只看该作者
动态内存分配未释放,导致内存耗尽。也会导致死机的

使用特权

评论回复
14
canfeil| | 2025-1-9 15:02 | 只看该作者
单片机程序跑飞的原因可能涉及软件、硬件或环境因素。可以通过以下方法排查和解决问题

使用特权

评论回复
15
ewyu| | 2025-1-9 20:22 | 只看该作者
代码中存在未定义行为(如除以零、未初始化的变量、非法内存访问等)。

使用特权

评论回复
16
gygp| | 2025-1-11 20:33 | 只看该作者
检查编译器和链接器的设置,确保它们与硬件和代码兼容。
尝试不同的编译器优化级别。

使用特权

评论回复
17
belindagraham| | 2025-1-11 20:56 | 只看该作者
单片机程序在函数中运行时,总是在运行到函数末尾,要跳出函数时,程序跑飞。

使用特权

评论回复
18
cemaj| | 2025-1-11 21:43 | 只看该作者
数组越界/溢出现象              

使用特权

评论回复
19
weifeng90| | 2025-1-11 21:58 | 只看该作者
为防止跑分必须得加看门狗才行。

使用特权

评论回复
20
janewood| | 2025-1-11 22:04 | 只看该作者
如果指针变量没有被正确初始化或者在使用后没有及时释放内存,就可能变成野指针。野指针指向的是一个不确定的内存地址,当程序通过野指针访问内存时,可能会读取到错误的数据或者修改不该修改的内存区域,导致程序跑飞。

使用特权

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

本版积分规则

45

主题

3556

帖子

2

粉丝