admin管理员组

文章数量:1122851

IMX6ULL

一.  中断向量表

中断向量表是存放中断向量的表。中断服务程序的入口地址或存放中 断服务程序的首地址成为中断向量,因此中断向量表是一系列中断服务程序入口地址组成的表。

当有中断事件发生时,处理器通过中断向量表进入相关的中断服务程序处理事件。

二.  添加中断向量表

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_Handlerbx r0/* 未定义中断服务函数 */
Undefined_Instruction_Handler:ldr r0, =Undefined_Instruction_Handlerbx r0/* SVC中断服务函数 */
SVC_Handler:ldr r0, =SVC_Handlerbx r0/* 预取终止中断服务函数 */
Prev_Abort_Handler:ldr r0, =Prev_Abort_Handlerbx r0/* 数据终止中断 */
Data_Abort_Handler:ldr r0, =Data_Abort_Handlerbx r0/* 未使用的中断 */
Not_Used_Handler:ldr r0, =Not_Used_Handlerbx r0/* IRQ中断!重点!!!!! */
IRQ_Handler:ldr r0, =IRQ_Handlerbx r0/* FIQ中断 */
FIQ_Handler:ldr r0, =FIQ_Handlerbx r0

以上写好了中断服务函数的框架。

重点是设置中断向量偏移操作,复位中断服务函数 和 IRQ中断服务函数的具体实现。

复位中断服务函数大体需要做的工作如下:

(1)  关闭 I-Cache,D-Cache MMU

关闭以上的模块需要用到 CP15 协处理器的一些指令操作。

(2)  设置处理器的 9 种工作模式下对应的SP指针。

(3)  清除 bss段。

(4)  跳到 C 函数,也就是 main() 函数。

接下来的博文说明设置中断向量偏移操作,复位中断服务函数 和 IRQ中断服务函数的具体实现。

本文标签: IMX6ULL