ARM 异常及中断

本文详细阐述了ARM架构下的七种异常类型及其在VectorTable中的偏移,并以S3C6410处理器为例,解释了如何通过VectorTable实现中断处理函数的自动调用,包括初始化中断和在IROM模式下的具体实现。

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 的反汇编代码,可以在网上搜索到。或者也可以自己提取进行反汇编。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值