一. 中断向量表
中断向量表是存放中断向量的表。中断服务程序的入口地址或存放中
断服务程序的首地址成为中断向量,因此中断向量表是一系列中断服务程序入口地址组成的表。
当有中断事件发生时,处理器通过中断向量表进入相关的中断服务程序处理事件。
二. 添加中断向量表
1. start.S 文件添加中断向量表
通过正点原子提供的 ARM ArchitectureReference Manual ARMv7-A and ARMv7-R edition.pdf 文档。该文档在参考资料目录下。
找到中断向量表如下:
我们根据以上的中断向量的顺序,在汇编文件 start.S 中添加中断向量表。
start.S 汇编文件中添加的中断向量表如下:
.global _start
.global _bss_start
_bss_start:
.word _bss_start
.global _bss_end
_bss_end:
.word _bss_end
_start:
ldr pc, =Reset_Handler /* 复位中断 */
ldr pc, =Undefined_Handler /* 未定义中断 */
ldr pc, =SVC_Handler /* SVC(Supervisor)中断 */
ldr pc, =PrefAbort_Handler /* 预取终止中断 */
ldr pc, =DataAbort_Handler /* 数据终止中断 */
ldr pc, =NotUsed_Handler /* 未使用中断 */
ldr pc, =IRQ_Handler /* IRQ中断 */
ldr pc, =FIQ_Handler /* FIQ(快速中断)未定义中断 */
2. start.S 文件添加中断服务函数
这一篇文章暂时对中断服务函数不做实现。中断服务函数内部暂时都为循环执行。中断服务函数也是汇编实现,也是添加到 start.S 汇编文件中。
如下为添加到 start.S 文件的中断服务函数:
/* 复位中断服务函数 */
Reset_Handler: //暂时写为循环执行
ldr r0, =Reset_Handler
bx r0
/* 未定义中断服务函数 */
Undefined_Instruction_Handler:
ldr r0, =Undefined_Instruction_Handler
bx r0
/* SVC中断服务函数 */
SVC_Handler:
ldr r0, =SVC_Handler
bx r0
/* 预取终止中断服务函数 */
Prev_Abort_Handler:
ldr r0, =Prev_Abort_Handler
bx r0
/* 数据终止中断 */
Data_Abort_Handler:
ldr r0, =Data_Abort_Handler
bx r0
/* 未使用的中断 */
Not_Used_Handler:
ldr r0, =Not_Used_Handler
bx r0
/* IRQ中断!重点!!!!! */
IRQ_Handler:
ldr r0, =IRQ_Handler
bx r0
/* FIQ中断 */
FIQ_Handler:
ldr r0, =FIQ_Handler
bx r0
以上写好了中断服务函数的框架。
重点是设置中断向量偏移操作,复位中断服务函数 和 IRQ中断服务函数的具体实现。
复位中断服务函数大体需要做的工作如下:
(1) 关闭 I-Cache,D-Cache 和 MMU。
关闭以上的模块需要用到 CP15 协处理器的一些指令操作。
(2) 设置处理器的 9 种工作模式下对应的SP指针。
(3) 清除 bss段。
(4) 跳到 C 函数,也就是 main() 函数。
接下来的博文说明设置中断向量偏移操作,复位中断服务函数 和 IRQ中断服务函数的具体实现。