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 的反汇编代码,可以在网上搜索到。或者也可以自己提取进行反汇编。
本文详细阐述了ARM架构下的七种异常类型及其在VectorTable中的偏移,并以S3C6410处理器为例,解释了如何通过VectorTable实现中断处理函数的自动调用,包括初始化中断和在IROM模式下的具体实现。
1653

被折叠的 条评论
为什么被折叠?



