您的位置:首页 > 其它

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: