单片机程序跑飞的三种现象、原因及解决方法
今天在编写单片机程序的时候,由于中断服务程序写的不好,导致单片机程序总是跑飞,最后费了好长时间,花了很大功夫才找到问题原因,由此总结了单片机程序跑飞的三种现象、原因及解决方法。
一、数组越界(数组溢出)
现象 :单片机程序在函数中运行时,总是在运行到函数末尾,要跳出函数时,程序跑飞。
原因 :数组越界(数组溢出),函数中定义的数组元素的个数小于程序中实际使用的数组元素的个数,例如在函数中定义了一个数组ucDataBuff[10],这个数组只有10个元素,但是在函数中却有这样的语句ucDataBuff[10]=0x1a,这个语句是给数组的第11个元素赋值,:由于定义的数组只有10个元素,从而导致赋值语句中不知道把0x1a放到什么地方,从而导致程序跑飞。
解决方法 :如果在调试程序时,发现程序总是在函数执行完毕时跑飞,多数情况是发生了数组越界(数组溢出)的错误,仔细检查函数中调用的数组是否存在越界(溢出)的情况。
二、中断服务程序缺失
现象 :程序运行过程中总是跑飞。
原因 :程序中打开了某个中断,但是却没有相应的中断服务程序,从而导致在中断发生后,找不到中断服务程序入口,从而导致程序跑飞。
解决方法 :检查程序中是否存在打开了某个中断,但是没有相对应的中断服务程序。
三:看门狗复位
现象 :在执行一段较为好费时间的程序时,程序跑飞,并且总是跳到复位位置处。
原因 :程序中使用了看门狗,但是没有及时“喂狗”,从而导致看门狗复位,使程序直接跳到复位位置。
解决方法 :根据程序运行时间,尤其是一定要计算清楚最耗时的那段程序的运行时间,然后准确设置看门狗的复位时长,定时“喂狗”,尤其是如果有死循环的情况,一定要在死循环中记得“喂狗”。
单片机程序死机跑飞原因分析
单片机程序死机,跑飞了可以从以下几个方面查找原因:
配图与内容无关
1. 意外中断。是否打开了某个中断,但是没有响应和清除中端标志,导致程序一直进入中断,造成死机假象
2. 中断变量处理不妥。若定义某些会在中断中修改的全局变量,这时要注意两个问题:首先为了防止编译器优化中断变量,要在这些变量定义时前加volatile,其次在主循环中读取中断变量前应该首先关闭全局中断,防止读到一半被中断给修改了,读完之后再打开全局中断;否则出现造成数据乱套。
配图与内容无关
3. 地址溢出,常见错误为指针操作错误。我要着重说的是数组下标使用循环函数中循环变量,如果循环变量没控制好则会出现数组下标越界,意外修改系统的寄存器造成死机,这种情况下如果死机说明运气好,否则后面不知道发生什么头疼的事。
4. 无条件的死循环;比如使用while(x);等待电平变化,正常情况下x都会变成0,就怕万一,因此最好加上时间限制;
5. 看门狗没有关闭。有的单片机即使没使用看门狗开机时也有可能意外自动开启了最小周期的看门狗,导致软件不断复位,造成死机,这个要看芯片手册,最好在程序复位后首先应该显式清除看门狗再关闭看门狗;
配图与内容无关
6. 堆栈溢出。最难查找的问题,对于容量小的单片机,尽量减少函数调用层级,减少局部变量,从而减少压栈的时候所需的空间。当你把以上几条都试过不能解决问题,试一试把你的被调用少函数直接内置到调用的地方并且把占用RAM大的局部变量改成全局变量,试一试说不定就可以了。
相关问答
什么叫 单片机 的 程序 “ 跑飞 ”?程序本来是按设定运行的,如你编的程序在存储器中的地址是0-1000,由于某种原因(干扰或程序漏洞),程序运行在了1000之后的区域,就是程序“跑飞”这里面可...
51 单片机程序跑飞 什么意思?怎么解决?程序跑飞就是程序执行错误,程序不知道运行到哪里,这就需要设定标志位,寻找跑飞的地方,再改程序跑飞就是程序执行错误,程序不知道运行到哪里,这就需要设定标志...
单片机 的电源供电不足会出现 程序跑飞 吗?-ZOL问答会啊,单片机对电源要求比较高了电压,或电流的不稳定都是可以造成这个情况的.我...(电压要高于单片机额顶的电压然后在稳压)就可以了不知道不看程序不好讲,可能...
单片机跑程序 是什么意思?程序本来是按设定运行的,如你编的程序在存储器中的地址是0-1000,由于某种原因(干扰或程序漏洞),程序运行在了1000之后的区域,就是程序“跑飞”这里面...
单片机 为什么防止 程序飞跑 ?一般是用在环境恶劣电磁干扰下启动看门狗防止程序跑飞,这样才能让单片机按照我们的意愿工作。一般是用在环境恶劣电磁干扰下启动看门狗防止程序跑飞,这样才能...
单片机 如何利用中断进行复位?谢谢邀请:1.题主你提出的问题好像本身就有问题,首先通过按压一个按键使单片机复位的方法,这个跟中断没有关系,每一个单片机系统都可以设计一个复位电路,这个...2...
c51 单片机 编程?南邻更可念,布破冬未赎。白毛浮绿水,红掌拨清波。窗含西岭千秋雪,门泊东吴万里船。月下飞天镜,云生结海楼。月出惊山鸟,时鸣春涧中.千山鸟飞绝,万径人...
单片机程序 里看门狗程序重要吗?重要。看门狗(WDT)是一个定时器。看门狗是用来防止万一单片机程序出错造成重大损失的。防错的原理很简单,它在硬件上就是一个定时器,当它溢出的时候就会让单片...
单片机 不能开机了,断开电池再加上电池后又能开机了,这是什么原因?应"悟空小秘书"邀答!单片机不能开机了,断开电池再加上电池后又能开机了,这是什么原因?现在的高科技就高在集成芯片,题主人指的单片机,就是里面装有数据...应"...
单片机 可以直接上电么!不复位可不可以啊!有什么区别么!我的板子也没有复位电路啊!也运行的很好啊?可以直接上电,但是在电路上电时候或电压波动不稳定的时候,当给单片机上电那一瞬间,电压有在几微秒内(有的是几毫秒内)不是直接跳变到5V的而是一个直线上升的...