今天在编写单片机程序的时候,由于中断服务程序写的不好,导致单片机程序总是跑飞,最后费了好长时间,花了很大功夫才找到问题原因
单片机死机原因
一 振荡器停止振荡
又可以分为电源电压不稳,或者强干扰引起的振荡器停振。
二 pc指针跑飞
电源电压不稳或强干扰引起pc跑飞,如果看门狗不好,也会引起死机。
三 设计上对长引出线的io没有保护,静电打在io口上引起单片机死锁,破坏了硬件逻辑功能,导致死机。
四。 复位收到干扰,引起反复复位,在反复复位当中有可能会导致死机。
“跑飞”是因为程序隐患或外部干扰引起的误动作,致使pc被写入“出界”数据,跑到了ram区,或者跑到了flash的空白区。如果pc指向了ram区,哪情况就不好说了!因为程序译码器可能得到任意译码结果。如果pc指向了flash空白区,则可以事先将所有flash空白区填入某个你想要的数据,迫使程序译码器在这里翻译出你想要的指令,从而进行相应的处理。在iar workbench中好象有在空白区填充数据的设置。
死机”是指pc进入了“死循环”,或者是mclk等于近似为零的值。此时,要想救活mcu,非外狗不可。
程序运行过程中,如果mcu电源出现问题(电源供电问题,或其它外部电路引起的电源扰动),比较容易出现“跑飞”现象
程序跑飞应该是pc出错;软件和硬件都可能出这样的问题。
死机应该是cpu根本没有运行,多是硬件方面的问题造成的,比如por复位不成功,430比较容易出现掉电不完全后重新上电。
linkedin单片机程序死机,跑飞了可以从以下几个方面查找原因:
1. 意外中断。是否打开了某个中断,但是没有响应和清除中端标志,导致程序一直进入中断,造成死机假象
2. 中断变量处理不妥。若定义某些会在中断中修改的全局变量,这时要注意两个问题:首先为了防止编译器优化中断变量,要在这些变量定义时前加volatile,其次在主循环中读取中断变量前应该首先关闭全局中断,防止读到一半被中断给修改了,读完之后再打开全局中断;否则出现造成数据乱套。
3. 地址溢出,常见错误为指针操作错误。我要着重说的是数组下标使用循环函数中循环变量,如果循环变量没控制好则会出现数组下标越界,意外修改系统的寄存器造成死机,这种情况下如果死机说明运气好,否则后面不知道发生什么头疼的事。
4. 无条件的死循环;比如使用while(x);等待电平变化,正常情况下x都会变成0,就怕万一,因此最好加上时间限制;
5. 看门狗没有关闭。有的单片机即使没使用看门狗开机时也有可能意外自动开启了最小周期的看门狗,导致软件不断复位,造成死机,这个要看芯片手册,最好在程序复位后首先应该显式清除看门狗再关闭看门狗;
6. 堆栈溢出。最难查找的问题,对于容量小的单片机,尽量减少函数调用层级,减少局部变量,从而减少压栈的时候所需的空间。当你把以上几条都试过不能解决问题,试一试把你的被调用少函数直接内置到调用的地方并且把占用ram大的局部变量改成全局变量,试一试说不定就可以了。
iphone8什么时候上市?iphone8最新消息:苹果iPhone8概念机曝光,这外观华为三星努力追赶
火箭发动机可3D打印!NASA完成首次点火测试
Orcad出现“Duplicate Pin Name”代码错误怎么办
关于用3D打印打造汽车零件的可行性分析
无极灯的电磁兼容问题分析
单片机程序死机跑飞查错指南
电子元件常识之电容
【解决方案】安科瑞远程预付费管理系统在工厂的应用
优易数据“疫情防控数据采集分析系统”成功入选
什么是直驱电机
NMC电池在未来10年仍将保持主流地位,LFP阴极组成紧随其后
灌封胶使用问题解决方案
互联网企业如何玩转物联网技术
PCB如何布线 有哪些策略
C语言怎样向文件读写字符
如何使用项目模板用于PCB设计?
面向物联网应用的可信MCU
Vishay推出新款4线总线端口保护阵列
福特新蒙迪欧 VS 本田雅阁 谁会更优秀?
磁致伸缩位移传感器的连接注意事项有哪些?