MARCO $HandlerLabel HANDLER $HandleLabel

MARCO $HandlerLabel HANDLER $HandleLabel

MACRO
$HandlerLabel HANDLER $HandleLabel

$HandlerLabel
sub sp,sp,#4             ;减少sp(用于存放转跳地址)
stmfd sp!,{r0}            ;把工作寄存器压入栈(lr does not push because it return to original address)
ldr     r0,=$HandleLabel   ;将HandleXXX的址址放入r0
ldr     r0,[r0]                ;把HandleXXX所指向的内容(也就是中断程序的入口)放入r0
str     r0,[sp,#4]           ;把中断服务程序(ISR)压入栈
ldmfd   sp!,{r0,pc}      ;用出栈的方式恢复r0的原值和为pc设定新值(也就完成了到ISR的转跳)
MEND

        不知道这个宏干翻多少学习启动代码的哥们,嘿嘿,反正我是看了很久才算是看明白了,现在试着和大家分享下,如果有不对的地方还望多多指教!

        首先要注意这个宏的两个参数,其中一个是$HandlerLabel,它是个跳转的标号;另外的一个是$HandleLabel,它是个函数的入口地址。

        还要了解下ARM的堆栈:arm堆栈的组织结构是 满栈降 (fd)的形式,满栈即sp是要停留在最后一个进栈元素,降:就是堆栈的增长方向是从高地址向低地址发展。arm对于堆栈的操作一般采用 LDMFD(pop)和STMFD (push) 两个命令。

        ===================================================================

b ResetHandler ;设成FALSE的话就来到这了,转跳到复位程序入口
b HandlerUndef ;转跳到Undefined mode程序入口
b HandlerSWI ;转跳到SWI 中断程序入口
b HandlerPabort ;转跳到PAbort(指令异常)程序入口
b HandlerDabort ;转跳到DAbort(数据异常)程序入口
b . ;保留
b HandlerIRQ ;转跳到IRQ 中断程序入口
b HandlerFIQ ;转跳到FIQ 中断程序入口

=================================================================


HandleReset #   4
HandleUndef #   4
HandleSWI #   4
HandlePabort    #   4
HandleDabort    #   4
HandleReserved #   4

关于以上三部分,我是这样理解的,不知道是否正确,只是希望大家共同学习。

b HandlerUndef ,我认为类似B要跳转的这个函数是需要我们自己来写的。而我们要实现的中断函数的首地址放在哪呢?放在HandleUndef(注意没有“r”)定义的地方,一般在sdram的高地址。而执行 b HandlerUndef命令,就跳到我们定义的中断函数了。为什么呢?原因应该就是关于那个很烦人的宏定义。也就是以下这段:
MACRO
$HandlerLabel HANDLER $HandleLabel

$HandlerLabel
sub sp,sp,#4 ;减少sp(用于存放转跳地址)
stmfd sp!,{r0} ;把工作寄存器压入栈(lr does not push because it return to original address)
ldr     r0,=$HandleLabel;将HandleXXX的址址放入r0
ldr     r0,[r0] ;把HandleXXX所指向的内容(也就是中断程序的入口)放入r0
str     r0,[sp,#4]      ;把中断服务程序(ISR)压入栈
ldmfd   sp!,{r0,pc}     ;用出栈的方式恢复r0的原值和为pc设定新值(也就完成了到ISR的转跳)
MEND

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值