IMX6ULL-IRQ中断之添加中断向量表

一.  中断向量表

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

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

二.  添加中断向量表

1.  start.S 文件添加中断向量表

通过正点原子提供的 ARM ArchitectureReference Manual ARMv7-A and ARMv7-R edition.pdf 文档。该文档在参考资料目录下。

找到中断向量表如下:

IMX6ULL-IRQ中断之添加中断向量表_第1张图片

我们根据以上的中断向量的顺序,在汇编文件 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中断服务函数的具体实现。

你可能感兴趣的:(linux,汇编)