历史上的今天
今天是:2024年12月19日(星期四)
2018年12月19日 | ARM中断向量程序实例
2018-12-19 来源:eefocus
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
上一篇:关于s3c2410 中断异常处理
下一篇:ARM 中断函数定义
史海拾趣
|
想把在别处写的博客全导过来(因为好多博客都不支持php,所以没法用本站的“博客导入”功能),只好一篇一篇的黏贴过来,但是又出现了别的问题“两次发布操作太快了,请等 xxx秒钟再试” 如果是为了防止恶意灌水的话,那在提交前弄一个验证码就行 ...… 查看全部问答> |
|
WinCE下的触摸屏较准 用Windows的API函数在自己的界面上实现 不用windows 自带的较准程序 我能查到的信息就是以下信息了: Call TouchPanelEnable to start the screen sampling. Call TouchPanelGetDeviceCaps to request the number of sampling points. For every calibration point, perform the following steps: Call TouchP ...… 查看全部问答> |
|
各位大侠,小弟是第一次发帖,还请各位多多指教!最近在linux2.6下开发基于S3C2440的camera驱动,视频数据通过lcd显示,现在的问题是camera数据无法显示到lcd上面,可以确定lcd驱动是正常的;现贴出一些相关程序: #define VIDEOMEMSIZE &nb ...… 查看全部问答> |
|
dwRet = WNetAddConnection2(&stNetResource,\"Administrator\",\"123\",CONNECT_UPDATE_PROFILE); if(dwRet != NO_ERROR) {   ...… 查看全部问答> |
|
STM32软件复位问题。系统运行中我想软件复位,看了CortexM3手册上说明:代码如下下面:*(unsigned long*)0xE000ED0C |= 0x04;但是系统仍然不复位CortexM3手册上相关说明P6-7System resetA system or warm& ...… 查看全部问答> |
|
我从市场上买来的dm642型号为:tms320dm642agdk,芯片上没有代表主频的数字,并且A的位置也于手册上的命名规则不符 dm642手册上给出的命名规则 是 : TMS 320 DM642 GDK A 500 能告诉我我买的芯片是500Mhz,还是600Mhz的吗? … 查看全部问答> |
|
最近在编程lauchpad,但发现每次使用math.h里的数学函数如sin(),sqrt()等总会debug出错,提示如图,附带程序代码段。后来我找到了出错的地方,并且注释掉了,debug通过,不知是何原因,请大大们解答下。 另外上次做正弦波发生时是查表做的,也是因 ...… 查看全部问答> |




