打印
[经验分享]

单片机程序跑飞的原因

[复制链接]
2272|83
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
vivilyly|  楼主 | 2025-3-29 16:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
数组越界/溢出
现象

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

原因

数组越界(数组溢出),函数中定义的数组元素的个数小于程序中实际使用的数组元素的个数,例如在函数中定义了一个数组ucDataBuff[10],这个数组只有10个元素,但是在函数中却有这样的语句

ucDataBuff[10] = 0x1a
这个语句是给数组的第11个元素赋值,由于定义的数组只有10个元素,从而导致赋值语句中不知道把 0x1a 放到什么地方,从而导致程序跑飞。

解决方法

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

中断服务程序缺失
现象

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

原因

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

解决方法

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

看门狗复位
现象

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

原因

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

解决方法

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

使用特权

评论回复
沙发
pentruman| | 2025-4-4 11:27 | 只看该作者
电压波动、噪声干扰导致单片机内部逻辑电平混乱。

使用特权

评论回复
板凳
ccook11| | 2025-4-4 11:41 | 只看该作者
电源稳定,加入足够的滤波电容和稳压电路;选用可靠的时钟源,并合理设计时钟电路;采取屏蔽和隔离措施,减少外部干扰。

使用特权

评论回复
地板
bestwell| | 2025-4-4 13:12 | 只看该作者
指针操作错误或数组下标越界,导致意外修改系统寄存器。

使用特权

评论回复
5
chenjun89| | 2025-4-5 21:37 | 只看该作者
程序跑飞大部分原因是指针操作溢出,也有可能是外部环境干扰导致。

使用特权

评论回复
6
juliestephen| | 2025-4-6 08:13 | 只看该作者
避免长导线传输高频信号。              

使用特权

评论回复
7
robincotton| | 2025-4-6 08:29 | 只看该作者
动态分配内存超出定义范围。              

使用特权

评论回复
8
phoenixwhite| | 2025-4-8 11:09 | 只看该作者
程序跑飞可能导致系统不稳定              

使用特权

评论回复
9
primojones| | 2025-4-8 14:57 | 只看该作者
电源不稳定、晶振失振或外部干扰等硬件问题。

使用特权

评论回复
10
janewood| | 2025-4-8 15:09 | 只看该作者
检查晶振匹配电容(如 22pF)是否正确。

使用特权

评论回复
11
saservice| | 2025-4-8 15:20 | 只看该作者
电源线路设计不合理,未加入足够的滤波电容或稳压电路。

使用特权

评论回复
12
averyleigh| | 2025-4-9 21:59 | 只看该作者
地址溢出可能导致系统寄存器被修改,引发严重后果,如程序崩溃、数据丢失或异常行为

使用特权

评论回复
13
weifeng90| | 2025-4-9 22:05 | 只看该作者
大部分原因都是编码问题导致的内存溢出,进入hardfualt。

使用特权

评论回复
14
modesty3jonah| | 2025-4-9 23:38 | 只看该作者
电源噪声干扰单片机正常运行。              

使用特权

评论回复
15
sanfuzi| | 2025-4-10 01:47 | 只看该作者
使用未初始化的指针或变量,导致不可预知的内存访问。

使用特权

评论回复
16
albertaabbot| | 2025-4-10 02:00 | 只看该作者
数组定义的大小小于实际使用时的访问范围,导致数据溢出,可能会覆盖程序计数器或其他重要数据,使程序跑飞。

使用特权

评论回复
17
alvpeg| | 2025-4-10 13:27 | 只看该作者
堆栈溢出会覆盖关键数据或代码,导致程序执行不可预知的指令。

使用特权

评论回复
18
louliana| | 2025-4-10 14:00 | 只看该作者
堆栈空间不足,导致返回地址被覆盖。

使用特权

评论回复
19
primojones| | 2025-4-10 15:02 | 只看该作者
中断正确处理,全局变量使用volatile关键字,防止地址溢出

使用特权

评论回复
20
gygp| | 2025-4-10 15:34 | 只看该作者
函数调用层次过深或局部变量占用过多堆栈空间,导致堆栈溢出,破坏程序计数器

使用特权

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

本版积分规则

89

主题

1838

帖子

1

粉丝