程序跑飞通常是由于干扰信号导致CPU无法按正常状态执行程序,从而引起混乱。恢复程序的方法有以下几种:
人工复位
最简单的方法是让CPU复位,让程序从头开始重新运行。这种方法虽然简单,但需要人的参与,并且复位不及时。人工复位一般是在整个系统已经瘫痪,无计可施的情况下才不得已而为之的。
指令冗余
在关键的地方人为地插入一些单字节的空操作指令NOP。当程序跑飞到某条单字节指令上时,就不会发生将操作数当成指令来执行的错误。对于MCS 51单片机来说,所有的指令都不会超过3个字节,因此在某条指令前面插入两条NOP指令,则该条指令就不会被前面冲下来的失控程序拆散,而会得到正确的执行,从而使程序重新纳入轨道。
监视定时器
利用监视定时器去发现程序是否跑飞,当程序跑飞后,定时器会产生中断,中断后由定时器中断服务子程序完成系统复位,从而使系统恢复到正常的程序运行状态。
硬件复位
通过看门狗芯片等硬件设备来实现复位。例如,微处理器每隔一段时间给看门狗芯片一个输入脉冲,看门狗的RESET引脚保持在低电位,微处理器正常运行。当程序跑飞时,输入脉冲会消失,此时RESET引脚会变成高电平,微处理器被强行复位。
软件复位
在程序中设置一个计数单元,利用定时器定时时间常数刷新操作一次,如果主程序正常运行,定时器就不会产生定时中断。当主程序跑飞后,定时器定时时间常数刷新失效,定时器就会产生中断,中断后执行复位操作。
检查数组越界和中断服务程序
仔细检查程序中是否存在数组越界或没有相应的中断服务程序的情况。例如,函数中定义的数组元素的个数小于程序中实际使用的数组元素的个数,或者程序中打开了某个中断,但没有相应的中断服务程序。
避免死循环
如果程序中存在死循环,一定要在死循环中记得“喂狗”,即定时给看门狗芯片输入脉冲,以防止看门狗复位导致程序跳到复位位置。
建议在设计程序时就要考虑到抗干扰措施,比如使用指令冗余和看门狗复位等技术,以减少程序跑飞的可能性。同时,在调试过程中,仔细检查程序中可能存在的数组越界和中断服务程序缺失等问题,也是恢复程序正常运行的关键。