量表的跳转指令的编码。
以上具体操作通过程序 6.6 实现下面的 C 程序。其中参数 routine 是中断处理程序
的地址,vector 为中断向量的地址。
程序 6.6 使用跳转指令的中断向量表
Unsigned install_handler (unsigned routine ,unsigned *vector)
{ unsigned vec, oldvec;
vec=((routine-(unsigned)vector-0x8)>>2);
If (vec & 0xff000000)
{
Printf(“Installation of handler failed” )
exit (2);
}
vec=0xea000000|vec;
oldvec=^vector;
*vector=vec;
return (oldvec);
}
2. 中断向量表中使用数据读取指令的情况
当中断向量表中使用数据读取指令时,在 C 程序中安装异常中断处理程序的操作序列如下
所示:
(1) 读取中断处理程序的地址。
(2) 从上一步得到的地址中减去该异常中断对应的中断向量的地址。
(3) 从上一步得到的地址中减去 8,允许指令预取。
(4) 将上一步得到的地址与数据 0xe59f000 作逻辑或,从而得到将要写到中断向量
表中的数据读取指令的编码。
(5) 将中断处理程序的地址放到相应的存储单元。
程序 6.7中的 C 程序实现了上面的操作序列。其中参数 location 是一个存储单元,其中
保存了中断处理程序的地址;vector 为中断向量的地址。
程序6.7 数据读取指令的中断向量表
Unsigned Install_Handler (unsigned location ,unsigned *vector)
{ unsigned vec ,oldvec;
Vec=((unsigned)location-(unsigned)vector-0x8) | (0xe59ff0000 oldvec -
*vector;
*vector=vec;
Return (oldvec);
}
下面的语句调用上面的代码,在 C 程序中安装中断处理程序。
Unsigned *irqvec=(unsigned *)0x18;
Install_Handler ((unsigned)IRQHandler,irqvec);
6.3 其它种类的异常中断
1.数据访问中止异常中断处理程序
如果系统不包含 MMU,数据访问中止异常中断处理程序只是简单地报告错误,然后退出。如
果系统中包含 MMU,数据访问中止异常中断处理程序要处理该数据访问中止。当发生数据访
问中止异常中断的指令时。LR_abt 寄存器已经被更新,它指向引起数据访问中止异常中断
的指令后面第 2 条指令。此时要返回到引起数据访问中止异常中断的指令。即(LR_abt)处。
下面3 种情况可能引起数据访问中止异常中断。
① LDR/STR 指令
对于 ARM 数据访问中止异常中断发生时,LR_abt 寄存器已经被更新,它指向引起数据访问
中止异常中断的指令后面第 2 条指令,此时要返回到引起数据访问中止异常中断的指令。
对于 ARM9、ARM10、strongARM 处理器,数据访问中止异常中断发生后,处理器将程序计数
器设置称引起数据访问中止异常中断的指令的地址,不需要用户来完成这种程序计数器的设
置操作。
② SWAP 指令
SWAP 指令执行时,未更新及存取 LR_abt.
③ LDM/STM 指令
对于 ARM6及 ARM7 处理器,如果写回机制使能的话,基址寄存器将被更新。对于 ARM9、ARM10
及 strongARM 处理器,如果写回机制使能的话,数据访问中止异常中断发生时,处理器将恢
复基址寄存器的值。
3.指令预取中止异常中断处理程序
如果系统不包含 MMC,指令预取中止异常中断处理程序只是简单地报告错误,然后退出。
如果系统中包含 MMU,则发生错误的指令触发虚拟地址失效,在该失效处理程序中重新
读取该指令。指令预取中止异常中断是有错的指令执行时被触发是,这时 LR_abt 寄存
器还没有被更新,它指向该指令的下面一条指令。因为该有问题的指令要被重新读取,
因而应该返回到该有问题的指令,即返回到(LR_abt-4)处。
4.未定义指令异常中断
当 CPU 不认识当前指令时,它将该指令发送到协处理器。如果所以的协处理器都不认识
该指令,这时将产生未定义指令异常中断。在未定义指令异常中断进行响应的处理。可
以看出这种机制可以用来通过软件仿真系统中一些部件的功能。比如,如果系统中不包
含浮点运算部件,CPU 遇到浮点运算指令时。将发生未定义指令异常中断,在该未定义
指令异常中断的处理程序中可以通过其他指令序列仿真该浮点运算指令。
这种仿真的处理过程类似有 SWI异常中断的功能调用。在 SWI 异常中断的功能调用中
通过读取 SWI 指令中的 24 位的立即数。判断具体请求的 SWI 功能。这种仿真机制的操
作过程如下:
① 将仿真程序设置成未定义指令异常中断的中断处理程序(链接到未定义指令异常中