ARM中断向量程序实例

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值