協(xié)處理器及其他指令之:異常產生指令
中斷服務程序的主要工作放在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),它常被用來設置軟件斷點,在調試程序時十分有用。當系統(tǒng)中存在調試硬件時,該指令被忽略。
指令的編碼格式如圖9.13所示。
圖9.13 BKPT指令編碼格式
2.指令的語法格式
BKPT immediate>
immediate>
16位的立即數(shù)。該立即數(shù)可以用來保存額外的斷點信息。
注意 | 16位立即數(shù)在指令的編碼格式中并不是連續(xù)存放的。前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 /*執(zhí)行在ARM狀態(tài)*/
/*CPSR[6] is unchanged*/
CPSR[7] = 1 /*禁止正常中斷*/
If high vectors configured then
PC = 0x0000000c
4.指令的使用
要正確的使用BKPT指令,必須和具體的調試系統(tǒng)相結合。一般說來,BKPT有兩種使用方法。
(1)如果當前使用的系統(tǒng)調試硬件沒有屏蔽BKPT指令,那么在此系統(tǒng)中預取指令異常和軟件調試命令同時使用一個中斷向量。這樣當異常發(fā)生時,就要依靠系統(tǒng)自身來判斷是真正的預取異常還是軟件調試命令。判斷的方法,根據系統(tǒng)的不同,而有所不同。
(2)如果當前的系統(tǒng)調試硬件屏蔽了BKPT指令,那么系統(tǒng)會跳過BKPT指令順序執(zhí)行該指令下面的程序代碼。
注意 | BKPT指令總是無條件執(zhí)行的,當指令的編碼格式中的條件域不被解析為AL時,指令的執(zhí)行結果不可預知。 |
評論