为了防止软件在跑飞到非程序区,或者跑飞后能够回到程序开头运行,可以采取以下措施:
1.设置监视器:在程序的关键位置设置监视器(如看门狗定时器),一旦程序运行异常,监视器可以自动将程序复位或重启。
2.中断管理:确保每个开启的中断都有相应的中断服务程序,并正确处理中断返回,避免因中断处理不当导致程序跑飞。
3.内存保护:使用内存保护机制,如内存锁或其他硬件支持的功能,防止程序访问非法内存区域。
4.数据隔离:设计程序进行空间分配时,确保程序中的数据区域和代码区域分开,避免数据操作影响到代码执行。
5.指针检查:对数组和指针操作进行严格的边界检查,避免越界访问,这可以通过在编译时加入额外的检查或者运行时进行检查来实现。
6.错误处理:在程序中加入错误处理机制,如异常捕获和错误检测代码,一旦检测到异常,能够引导程序安全地恢复到正常流程。
7.冗余指令:在程序的关键部分插入冗余指令,如果程序跑飞,这些冗余指令可以帮助程序重新回到正常的执行路径上。比如,在关键地方人为地插入一些单字节指令NOP,或将有效单字节指令重写。当CPU受到干扰后,可能会将一些操作数当作指令码来执行,从而引起程序混乱。在这些对系统工作状态至关重要的指令前插入NOP指令,可以确保它们被正确执行。这种方法有助于消除随机干扰,提高测控系统工作的可靠性。
8.软件陷阱技术:当程序跑飞到非程序区时,例如E2PROM中未使用的空间和未使用的中断向量区等,指令冗余可能无法使程序回到正轨。此时,可以使用软件陷阱来拦截跑飞的程序,并将其迅速引向某一指定位置。具体做法是,用一条引导指令强行捕获到已跑飞的程序,并将其引向复位入口地址(如0000H)。在此处,程序会转向专门处理程序出错的程序,从而使其回到正轨。软件陷阱一般由一条跳转指令和空操作指令组成。
9.代码优化:优化代码逻辑,减少不必要的复杂性和潜在的错误点,提高代码的健壮性。
10.模块化设计:采用模块化设计,使得每个模块都能够独立地进行错误检测和恢复,减少整体系统受单个模块错误影响的风险。
11.硬件保护:利用硬件特性,如内存保护机制,确保程序只能在指定的内存区域内运行。当程序尝试访问非授权区域时,硬件会触发中断或异常,从而可以将程序重新引导回开头。
12.定期测试:通过定期的系统测试和审查,及时发现和修复可能导致程序跑飞的问题。
以上措施是实践中较常用的,通过上述措施的综合应用,可以大大降低软件跑飞的风险,并确保软件能够在异常情况下恢复正常运行。同时,在实际应用中,需要根据具体的软硬件环境和程序特点来选择合适的方法和技术。