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
版权声明:本文标题:IMX6ULL 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.betaflare.com/web/1686983855a52921.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论