历史上的今天
今天是:2026年02月02日(星期一)
2023年02月02日 | 单片机程序又跑飞?! 三种跑飞现象分析
2023-02-02 来源:zhihu
在编写单片机程序的时候,由于中断服务程序写的不好,导致单片机程序总是跑飞,最后费了好长时间,花了很大功夫才找到问题原因,由此总结了单片机程序跑飞的三种现象、原因及解决方法。
1 数组越界/溢出
现象:
单片机程序在函数中运行时,总是在运行到函数末尾,要跳出函数时,程序跑飞。
原因:
数组越界(数组溢出),函数中定义的数组元素的个数小于程序中实际使用的数组元素的个数,例如在函数中定义了一个数组ucDataBuff[10],这个数组只有10个元素,但是在函数中却有这样的语句ucDataBuff[10]=0x1a,这个语句是给数组的第11个元素赋值,:由于定义的数组只有10个元素,从而导致赋值语句中不知道把0x1a放到什么地方,从而导致程序跑飞。
解决方法:
如果在调试程序时,发现程序总是在函数执行完毕时跑飞,多数情况是发生了数组越界(数组溢出)的错误,仔细检查函数中调用的数组是否存在越界(溢出)的情况。
2 中断服务程序缺失
现象:
程序运行过程中总是跑飞。
原因:
程序中打开了某个中断,但是却没有相应的中断服务程序,从而导致在中断发生后,找不到中断服务程序入口,从而导致程序跑飞。
解决方法:
检查程序中是否存在打开了某个中断,但是没有相对应的中断服务程序。
3 看门狗复位
现象:
在执行一段较为耗费时间的程序时,程序跑飞,并且总是跳到复位位置处。
原因:
程序中使用了看门狗,但是没有及时“喂狗”,从而导致看门狗复位,使程序直接跳到复位位置。
解决方法:
根据程序运行时间,尤其是一定要计算清楚最耗时的那段程序的运行时间,然后准确设置看门狗的复位时长,定时“喂狗”,尤其是如果有死循环的情况,一定要在死循环中记得“喂狗”。
史海拾趣
|
最近发现了一个文章,供大家参考: 嵌入式Linux操作系统学习规划 ARM+LINUX路线,主攻嵌入式Linux操作系统及其上应用软件开发目标: (1) 掌握主流嵌入式微处理器的结构与原理(初步定为arm9) (2) 必须掌握一个嵌入式操作系统 (初步定为 ...… 查看全部问答> |
|
前段时间,我用Keil编写了一个密码键盘的程序,并利用伟福仿真器将程序烧进单片机内(我自己制作的一个密码键盘的板子)。但是老师现在要我用VC6.0作一个虚拟键盘的界面,想实现的功能是:我在硬件上按下按键,虚拟键盘上相应的按键有一定的反应, ...… 查看全部问答> |
|
本人现在设计一个基于80C51单片机的信号发生器,要求能够输出方波,正弦波及幅值可调,范围在(—10至+10)。我已经知道在单片机外接一个DA0832就可以输出波形,但如何使幅值的范围在(—10至+10)需要再外接一个DA0832,我查了相关书籍没有类似的 ...… 查看全部问答> |
|
在windows2000下如何区分USB audio device 我的USB audio 设备在XP下可以正确地显示出USB device name ,但是在windows2000下却显示成USB Audio Device XX . 而且别的USB audio 设备在windows2000下也显示成USB audio device XX . 那请问怎么区分我的USB audio 设备呢?我用waveI ...… 查看全部问答> |
|
AVR STUDIO模拟ATMEGA16的TWI遇到问题,求高手赐教 用ICCAVR编译后,把COF文件调入AVR STUDIO进行模拟 发现程序进行到语句:twi_wait() {while(!(TWCR&(1<<TWINT)));} 的时候就进行不下去了, 这个语句是等 ...… 查看全部问答> |
|
我对着TI的参考设计焊接了2块CC2530.但是 32M 与32.768K的晶振都没有波形, 32.768K晶振的电平为3.3V ,32M的晶振电平为0.1V 不知道什么原因? 我查过器件的位置都没有焊错,晶振、负载电容应该也没问题。因为有一次32M的晶振出现了正确的波形 ...… 查看全部问答> |
|
我想用串行通信的液晶,以前用的诺基亚5110能否改为串口通信!!!???如果不能的话,大家能不能给推荐一个比较好用的串口通信的液晶。都是因为launchpad的IO口太少的原因啊!!!!… 查看全部问答> |
|
1:怎么将图像RGB的一个XY【i】【j】表格转换成灰度的 2:怎么将图像RGB的一个XY【i】【j】表格中的圆识别出圆心和半径来 3:一张靶子的图片,已采集了背景数据,已采集了帧数据,已通过相减得到了靶子上激光点的位置。怎么识别出靶的圆心和激光 ...… 查看全部问答> |




