ARM 异常及中断

ARM 有七种异常,当异常发生时,ARM core 会自动执行 Vector Table 中的指令。

ARM 的七种异常及在 Vector Table 种的偏移:   

异常

模式

向量表偏移

复位(reset)

SVC

+0x00

未定义指令

UND

+0x04

软件中断(SWI)

SVC

+0x08

预取指终止

ABT

+0x0c

数据终止

ABT

+0x10

未分配

--

+0x14

IRQ

IRQ

+0x18

FIQ    

FIQ

+0x1c

ARM V4 以下版本 Vector Table 的地址为 0x00000000,V4 以上版本 Vector Table 地址可在 0x00000000 ,0xFFFF0000 间进行选择。

ARM 构架下,中断为异常的一种。以中断为例,当接收到中断后,ARM core 首先将当前模式下的 CPSR,PC 寄存器分别保存到异常模式下的 SPSR,LR 寄存器,然后将目标模式的 PC 寄存器值设为地址 0x00000018(或0xFFFF0018),最后切换到目标模式----即 IRQ 模式。切换到目标模式后执行的第一条指令便是地址 0x00000018(或0xFFFF0018)上的指令。此处一般为一个跳转指令,用于跳转执行中断处理函数。其它异常处理方式相似。

S3C6410 中有个 32KB IROM(internel ROM),里面固化了一段程序。其开头就是一个 Vector Table。以 IROM 模式启动时,IROM 被映射到 0x00000000 位置,所以执行的第一条指令便是 Vector Table 中的 Reset 异常跳转指令(ARM core 上电时在 0 地址取第一条指令)。我们可以利用此 IROM 的异常向量表实现 u-boot 下的中断处理。

刚上电,初始化中断,使S3C6410 能接收并处理中断。中断发生后,先执行 0x00000018 中的异常跳转,转去执行 IROM 中的中断处理函数。此处理函数很简单:将 0x0C001FF8 (落于 SRAM 地址范围)处的值赋给 PC。所以,我们可将我们自己的中断处理函数的入口地址存于 0x0C001FF8 处,当中断发生后,便会自动调用我们的中断处理函数。其它异常的实现方法类似,只是 0x0C001FF8 要改成别的值。具体为何值,需分析 IROM 中的代码。

S3C6410 IROM 的反汇编代码,可以在网上搜索到。或者也可以自己提取进行反汇编。

你可能感兴趣的:(c,汇编,vector,table)