打印

ARM异常时为什么都用$HandlerLabel HANDLER $HandleLabel ?

[复制链接]
3638|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
richardnee|  楼主 | 2010-5-13 22:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
如题,我看了很多的三星44B0,S3C2410的启动代码异常时都是用这个宏,这样异常处理函数执行完后,不就还处在异常处理器模式下吗,没有返回原处理器模式?求解疑,不胜感激。
MACRO
$HandlerLabel HANDLER $HandleLabel
$HandlerLabel
sub sp,sp,#4        ;decrement sp(to store jump address)
stmfd sp!,{r0}        ;PUSH the work register to stack(lr does not push because it return to original address)
ldr     r0,=$HandleLabel;load the address of HandleXXX to r0
ldr     r0,[r0]         ;load the contents(service routine start address) of HandleXXX
str     r0,[sp,#4]      ;store the contents(ISR) of HandleXXX to stack
ldmfd   sp!,{r0,pc}     ;POP the work register and pc(jump to ISR)
MEND

UDF_INS_HANDLER HANDLER UdfInsVector
SWI_SVC_HANDLER HANDLER SwiSvcVector
INS_ABT_HANDLER HANDLER InsAbtVector
DAT_ABT_HANDLER HANDLER DatAbtVector
IRQ_SVC_HANDLER HANDLER IrqSvcVector
FIQ_SVC_HANDLER HANDLER FiqSvcVector

相关帖子

沙发
centimetre| | 2010-5-14 07:07 | 只看该作者
ldmfd   sp!,{r0,pc}     OP the work register and pc(jump to ISR)
看这个宏的最后一句,只是跳转到$HandleLabel
至于返回到原cpsr等操作,需要去看$HandleLabel,应该在那个里面完成。
www.cmtekchina.com

使用特权

评论回复
板凳
richardnee|  楼主 | 2010-5-14 20:22 | 只看该作者
2# centimetre

谢谢您了,我有点明白了。
1. $HandleLabel一般在SDRAM中,我们是把异常的服务函数ISR的C语言的函数指针放在$HandleLabel所在的内存中(当然汇编也可以,可是一般写的是C),异常处理时就可以通过这段汇编跳到SDRAM的C中执行。
2.然后,返回到原cpsr就要在C中完成,而标准的C不会有模式转换的只是如下返回
MOV      pc,r14
3.如果加关键字__irq则可以SUBS     pc,r14,#4 实现模式转换
4.可是如果这样的话,不是所有的五个异常都可以这样返回啊,
Undef,SWI应该是 movs pc,r14
Dabort 是subs pc,r14_abt,#8

使用特权

评论回复
地板
ccxlslr| | 2010-5-14 20:22 | 只看该作者
就像51单片机一样,中断入口一般只放跳转语句,当然跳转到的地方,还可以再跳,

最后跑到中断处理程序,中间不管有多少级跳,只要跳完了,也就是处理完了中断,再中断返回就可以了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:It could be so simple !

0

主题

35

帖子

1

粉丝