首页 理论教育 嵌入式系统异常中断指令

嵌入式系统异常中断指令

时间:2023-11-23 理论教育 版权反馈
【摘要】:软件中断指令SWI 用于产生SWI 异常中断,用来实现在用户模式下对操作系统中特权模式的程序的调用;断点中断指令BKPT 主要用于产生软件断点,供调试程序用。SWI 指令用于产生软件中断,图3.8 中的24 位立即数域并不影响指令的操作,它被操作系统用来判断用户程序调用系统例程的类型,相关参数通过通用寄存器来传递。

嵌入式系统异常中断指令

软件中断指令SWI 用于产生SWI 异常中断,用来实现在用户模式下对操作系统中特权模式的程序的调用;断点中断指令BKPT 主要用于产生软件断点,供调试程序用。

(1)软件中断指令(SWI)

SWI(SoftWare Interrupt)代表“软件中断”,用于用户调用操作系统的系统程序,常称为“监控调用”。 它将处理器置于监控(SVC)模式,从地址0x08 开始执行指令。

如果存储器的这部分区域被适当保护,就有可能在ARM 上构建一个全面防止恶意用户的操作系统。 但是,由于ARM 很少用于多用户应用环境,通常不要求这种级别的保护。

SWI 指令用于产生软件中断,图3.8 中的24 位立即数域并不影响指令的操作,它被操作系统用来判断用户程序调用系统例程的类型,相关参数通过通用寄存器来传递。

图3.8 软件中断指令的二进制编码

如果条件通过,指令使用标准的ARM 异常入口程序进入监控(SVC)模式,具体地说,处理器的行为是:

①将SWI 后面指令的地址保存到r14_svc;

②将CPSR 保存到SPSR_svc;

③进入监控模式,将CPSR[4:0]设置为100112和将CPSR[7]设置为“1”,以便禁止IRQ(但不是FIQ);

④将PC 设置为0x08,并且开始执行那里的指令。

为了返回SWI 后的指令,系统的程序不但必须将r14_svc 拷贝到PC,而且必须由SPSR_svc 恢复CPSR。 这需要使用一种特殊形式的数据处理指令,这在前面介绍数据处理指令时已讲过。

监控程序调用是在系统软件中实现的,因此,监控程序调用从一个ARM 系统到另一个系统可能会完全不同。 尽管如此,大多数ARM 系统在实现特定应用所需的专门调用之外,还实现了一个共同的调用子集。 其中,最有用的是将r0 底部字节中的字符送到用户器件一端显示的程序:

另一个有用的调用是将控制从用户程序返回到监视程序:

1)指令格式

举例如下:

输出字符“A”(www.xing528.com)

输出调用语句之后的文本串的子程序:

为结束执行用户程序,返回到监控程序:

2)注意事项

①当处理器已经处于监控模式,只要原来的返回地址(在r14_svc)和SPSR_svc 已保存,就可以执行SWI;否则,当执行SWI 时,这些寄存器将被覆盖。

②24 位立即数代表的服务类型依赖于系统,但大多数系统支持一个标准的子集用于字符输入输出及类似的基本功能。 立即数可以指定为常数表达式,但是,通常最好是在程序的开始处为所需要的调用进行声明并设置它们的值,或者导入一个文件,该文件为局部操作系统声明它们值,然后在代码中使用它们的名字。

③在监控模式下执行的第一条指令位于0x08,一般是一条指向SWI 处理程序的转移指令,而SWI 处理程序则位于存储器内附近某处。 因为存储器中位于0x0C 的下一个字正是取指中止处理程序的入口,所以不能在0x08 处开始写SWI 处理程序。

(2)断点指令(BKPT——仅用于v5T 体系)

断点指令用于软件调试,它使处理器停止执行正常指令而进入相应的调试程序。 当适当配置调试的硬件单元时,本指令使处理器中止预取指。

1)指令格式

其中,immed_16 为表达式。 其值为范围在0 ~65 536 内的整数(16 位整数)。 该立即数被调试软件用来保存额外的断点信息。举例如下:

BKPT ;

BKPT 0XF02C;

2)注意事项

①只有实现v5T 体系结构的微处理器支持BKPT 指令。

②BKPT 指令是无条件的。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈