协处理器及其他指令之:异常产生指令
中断服务程序的主要工作放在C_SWI_Handler中,由C语言完成,用swich_case结构判断中断类型。典型的程序如下。
void C_SWI_Handler( int swi_num, int *regs )
{
switch( swi_num )
{
case 0:
regs[0] = regs[0] * regs[1];
break;
case 1:
regs[0] = regs[0] + regs[1];
break;
case 2:
regs[0] = (regs[0] * regs[1]) + (regs[2] * regs[3]);
break;
case 3:
{
int w, x, y, z;
w = regs[0];
x = regs[1];
y = regs[2];
z = regs[3];
regs[0] = w + x + y + z;
regs[1] = w - x - y - z;
regs[2] = w * x * y * z;
regs[3] =(w + x) * (y - z);
}
break;
}
}
9.5.2 断点中断指令BKPT
1.指令编码格式
断点中断指令BKPT(BreakPoint)产生一个预取异常(prefetch abort),它常被用来设置软件断点,在调试程序时十分有用。当系统中存在调试硬件时,该指令被忽略。
指令的编码格式如图9.13所示。
图9.13 BKPT指令编码格式
2.指令的语法格式
BKPT immediate>
immediate>
16位的立即数。该立即数可以用来保存额外的断点信息。
注意 | 16位立即数在指令的编码格式中并不是连续存放的。前12位放在bits[19∶8],而后4位放在bits[3∶0]。 |
3.指令操作的伪代码
指令操作的伪代码如下面程序段所示。
If (not overridden by debug hard)
R14_abt = address of BKPT instruction + 4
SPSR_abt = CPSR
CPSR[4:0] = 0b10111 /*进入异常模式*/
CPSR[5] = 0 /*执行在ARM状态*/
/*CPSR[6] is unchanged*/
CPSR[7] = 1 /*禁止正常中断*/
If high vectors configured then
PC = 0x0000000c
4.指令的使用
要正确的使用BKPT指令,必须和具体的调试系统相结合。一般说来,BKPT有两种使用方法。
(1)如果当前使用的系统调试硬件没有屏蔽BKPT指令,那么在此系统中预取指令异常和软件调试命令同时使用一个中断向量。这样当异常发生时,就要依靠系统自身来判断是真正的预取异常还是软件调试命令。判断的方法,根据系统的不同,而有所不同。
(2)如果当前的系统调试硬件屏蔽了BKPT指令,那么系统会跳过BKPT指令顺序执行该指令下面的程序代码。
注意 | BKPT指令总是无条件执行的,当指令的编码格式中的条件域不被解析为AL时,指令的执行结果不可预知。 |
评论