关于单片机死机跑飞的原因以及解决方案

    作者:小K更新于: 2018-05-04 10:14:50

      在电子电工行业中,目前我们避免不了要接触单片机程序,除了要熟悉掌握单片机的使用技巧,还要熟悉单片机出现故障的原因。什么情况会使单片机死机,这是一个很好的探讨话题,下面就和课课家小编一起来探讨吧。

    关于单片机死机跑飞的原因以及解决方案_单片机_嵌入式_flash_课课家教育
      单片机程序死机,跑飞了可以从以下几方面查找原因:
      1.意外中断。是否打开了某个中断,但是没有响应和清除中断标志,导致程序一直进入中断,造成死机假象.
      2.中断变量处理不妥。若定义某些会在中断中修改的全局变量,这时要注意两个问题:首先为了防止编译器优化中断变量,要在这些变量定义时前加volatile,其次在主循环中读取中断变量前应该首选关闭全局中断,防止读到一半被中断给修改了,读完之后再打开全局中断;否则出现造成数据乱套。
      3.地址溢出,常见错误为指针操作错误。要着重说的是数组下标使用循环函数中循环变量,如果循环变量没有控制好则会出现数组下标越界,意外修改系统的寄存器造成死机,这种情况下如果死机说明运气好,否则后面不知发生什么头疼的事。
      4.无条件的死循环,比如使用while(x);等待电平变化,正常情况下x都会变成0,就怕万一,因此最好加上时间限制。
      5.看门狗没有关闭。有的单片机即使没有使用看门狗开机时也有可能意外自动开启了最小周期的看门狗,导致软件不断复位,造成死机,这个要看芯片手册,最好在程序复位后首先应该显式清除看门狗再关闭看门狗。
      6. 堆栈溢出。最难查找的问题,对于容量小的单片机,尽量减少函数调用层级,减少局部变量,从而减少压栈的时候所需的空间。当你把以上几条都试过不能解决问题,试一试把你的被调用少函数直接内置到调用的地方并且把占用RAM大的局部变量改成全局变量,试一试说不定就可以了.
      综上所述:设计电路时应该注意:
      1.电源稳定
      2.IO保护
      3.振荡器PCB布线要注意
      4.复位电路设计和PCB布线
      5.电源,信号线干扰路径的保护,加滤波YVS等
      6.高速信号输出远离信号输入端,如SPI总线,I2C总线布线要远离ADC,复位,时钟等布线处,以及其他模拟前端
      文中的一写相关概念理解:
      1、“跑飞”是因为程序隐患或外部干扰引起的误动作,致使PC被写入“出界”数据,跑到了RAM区,或者跑到了flash的空白区。如果PC指向了RAM区,哪情况就不好说了!因为程序译码器可能得到任意译码结果。如果PC指向了FLASH空白区,则可以事先将所有FLASH空白区填入某个你想要的数据,迫使程序译码器在这里翻译出你想要的指令,从而进行相应的处理。在IAR Workbench中好象有在空白区填充数据的设置。
      2、“死机”是指PC进入了“死循环”,或者是MCLK等于近似为零的值。此时,要想救活MCU,非外狗不可。
      *程序运行过程中,如果MCU电源出现问题(电源供电问题,或其它外部电路引起的电源扰动),比较容易出现“跑飞”现象。
      程序跑飞应该是PC出错;软件和硬件都可能出这样的问题。
      死机应该是CPU根本没有运行,多是硬件方面的问题造成的,比如POR复位不成功,430比较容易出现掉电不完全后重新上电。
      如果下次单片机出现死机的情况,那根据上述的进行排查吧。

课课家教育

未登录