软件陷阱的实现方法主要包括以下几种:
未使用EPROM空间的填充
在程序存储器中未使用的EPROM空间首先填入窄操作指令NOP(无操作指令)。
在NOP指令后填入一条跳转指令LJMP,跳转到预设的跑飞处理程序(如FLY)。
若未使用空间较大,可均匀分布NOP指令和LJMP指令,形成“软件陷阱”。
数据表及子程序间的陷阱设置
在数据表的结尾处设置软件陷阱,确保程序跑飞到数据区时能及时转入正轨。
若数据表较大,可在中间位置也设置软件陷阱。
在每两个子程序之间设置一个软件陷阱,以捕获可能的程序跑飞。
中断服务程序中的陷阱
当使用的中断因干扰而开放时,在对应的中断服务程序中设置软件陷阱。
这样能够及时捕获错误的中断,避免程序进一步失控。
指令冗余
在关键地方人为插入一些单字节指令,或将有效单字节指令重写称为指令冗余。
通常是在双字节指令和三字节指令后插入两个字节以上的NOP。
这样即使乱飞程序飞到操作数上,由于空操作指令NOP的存在,避免了后面的指令被当作操作数执行,程序自动纳入正轨。
拦截技术
将乱飞的程序引向指定位置,再进行出错处理。
通常用软件陷阱来拦截乱飞的程序,因此先要合理设计陷阱,其次要将陷阱安排在适当的位置。
断言技术
在运行时检测程序中的错误并给出相应的处理方法。
C语言中常用的断言库是assert.h,该库中的assert()函数可以检测程序运行时的问题,并当程序运行时出现错误时,它会将错误信息打印出来,并停止程序的执行。
异常处理技术
使用setjmp()和longjmp()两个函数来实现异常处理。
setjmp()函数将程序中的某一位置注册为一个标记,并返回0;longjmp()函数则会跳转到该位置进行相应的处理。
空指针异常处理
在单片机软件开发过程中,空指针异常是比较常见的一种错误。
通过以上方法,可以在软件中设置陷阱,以捕获和处理程序跑飞或其他异常情况,从而提高软件的稳定性和可靠性。