ARM中断向量程序实例
2016-04-24 19:17
288 查看
ARM中断处理程序一般是通过异常向量表来处理各种异常情况,中断也是一种异常事件,当有异常发生时,ARM会自动跳到向量表指定的地址去执行相应的处理函数。
/创建向量表文件vector_table.S/
/首先创建异常向量表,并把此向量表地址映射到0x00000000或0xffff0000/
.text
.align 2
.global vector_start
vector_start:
ldr pc, __reset //复位0x00000000
ldr pc, __undef //未定义指令0x00000004
ldr pc, __svc //管理员模式0x00000008
ldr pc, __pabort //指令异常0x0000000c
ldr pc, __dabort //数据异常0x0000010
nop
ldr pc, __irp //普通中断0x00000018
ldr pc, __firp //快速中断0x00000020
/因为ldr指令只能跳转当前PC开始的4KB范围,B指令能跳转当前PC开始的32MB指令,所以向量表中通过调用一个字节,此字节存放相应处理函数的首地址,然后跳到该字节内的地址处/
__reset:
.word reset //分配一个字节的空间存放相应处理函数首地址,下同
__undef:
.word undef
__undef:
.word svc
__undef:
.word pabort
__undef:
.word dabort
__undef:
.word irp
__undef:
.word irp
.text
.align 2
.global vector_end
vector_end: /无具体内容,只是标明向量表结束/
/下面是具体的异常处理函数,如reset_handler()可直接用C程序写/
reset:
ldr sp, =0xfffffffc /分配栈/下同
stmfd sp!, {r0-r12, lr} /保存当前状态及地址/下同
b reset_handler /调用处理函数/下同
ldmfd sp!, {r0-r12, lr} /异常处理结束后返回/下同
undef:
b undef_handler
svc:
b svc_handler
pabort:
b pabort_handler
dabort:
b dabort_handler
irp:
b irp_handler
firp:
b firp_handler
/创建向量表文件vector_table.S/
/首先创建异常向量表,并把此向量表地址映射到0x00000000或0xffff0000/
.text
.align 2
.global vector_start
vector_start:
ldr pc, __reset //复位0x00000000
ldr pc, __undef //未定义指令0x00000004
ldr pc, __svc //管理员模式0x00000008
ldr pc, __pabort //指令异常0x0000000c
ldr pc, __dabort //数据异常0x0000010
nop
ldr pc, __irp //普通中断0x00000018
ldr pc, __firp //快速中断0x00000020
/因为ldr指令只能跳转当前PC开始的4KB范围,B指令能跳转当前PC开始的32MB指令,所以向量表中通过调用一个字节,此字节存放相应处理函数的首地址,然后跳到该字节内的地址处/
__reset:
.word reset //分配一个字节的空间存放相应处理函数首地址,下同
__undef:
.word undef
__undef:
.word svc
__undef:
.word pabort
__undef:
.word dabort
__undef:
.word irp
__undef:
.word irp
.text
.align 2
.global vector_end
vector_end: /无具体内容,只是标明向量表结束/
/下面是具体的异常处理函数,如reset_handler()可直接用C程序写/
reset:
ldr sp, =0xfffffffc /分配栈/下同
stmfd sp!, {r0-r12, lr} /保存当前状态及地址/下同
b reset_handler /调用处理函数/下同
ldmfd sp!, {r0-r12, lr} /异常处理结束后返回/下同
undef:
b undef_handler
svc:
b svc_handler
pabort:
b pabort_handler
dabort:
b dabort_handler
irp:
b irp_handler
firp:
b firp_handler
相关文章推荐
- 探究如何求两数的最大公约数(两种方法)
- 在糖尿病患者信息管理系统中,交流区模块想模仿论坛那样几楼几楼的!
- 相关记录(待整理)
- 三维结构模型DXF文件绘制技巧
- window窗口-button(按钮)-dialog(对话框,带按钮)
- ACM学习历程—HDU5666 Segment(数论)
- Spring框架核心
- 链表反转
- 滚粗有感
- 在Linux上安装Chef工作站
- 本周学习进度
- 安装saltstack
- Struts数据回显技术(附加防表单重复提交)
- ssm+maven+bootstrap尝试
- sdau-2 1015
- 148. Sort List
- Struts2标签之<s:iterator/>标签详解
- js之事件冒泡和事件捕获详细介绍
- 计算机视觉和图像处理常用的一些标准图片
- 第八周学习进度情况