mini2440启动代码分析之第二篇(着重理解$HandlerLabel HANDLER $HandleLabel宏)
来源:互联网 发布:淘宝卖的300狗狗可信吗 编辑:程序博客网 时间:2024/05/16 11:00
接下来的代码如下(注黑色为源程序,蓝色为解说部分代码):
MACRO
$HandlerLabel HANDLER $HandleLabel
$HandlerLabel
sub sp,sp,#4 ;减少sp(用于存放转跳地址)实质上是在计算返回地址,用来存储PC地址
stmfd sp!,{r0} ;把将要使用的r0寄存器入栈
ldr r0,=$HandleLabel;将HandleXXX的址址放入r0
ldr r0,[r0] ;把HandleXXX所指向的内容(也就是中断程序的入口)放入r0
str r0,[sp,#4] ;把中断服务程序(ISR)压入栈.
ldmfd sp!,{r0,pc} ;用出栈的方式恢复r0的原值和为pc设定新值(完成了到ISR的转跳)
MEND
$HandlerLabel HANDLER $HandleLabel
$HandlerLabel
sub sp,sp,#4 ;减少sp(用于存放转跳地址)实质上是在计算返回地址,用来存储PC地址
stmfd sp!,{r0} ;把将要使用的r0寄存器入栈
ldr r0,=$HandleLabel;将HandleXXX的址址放入r0
ldr r0,[r0] ;把HandleXXX所指向的内容(也就是中断程序的入口)放入r0
str r0,[sp,#4] ;把中断服务程序(ISR)压入栈.
ldmfd sp!,{r0,pc} ;用出栈的方式恢复r0的原值和为pc设定新值(完成了到ISR的转跳)
MEND
;首先这段程序是个宏定义,HANDLER是宏名,不要想歪了
;其次后面程序遇到的HandlerXXX HANDLER HandleXXX这些语句将都被下面这段程序展开
例如:HandlerFIQ HANDLER HandleFIQ 被上面那段程序展开后为:
HandlerFIQ
sub sp,sp,#4
stmfd sp!,{r0}
ldr r0,=HandleFIQ
ldr r0,[r0]
str r0,[sp,#4]
ldmfd sp!,{r0,pc}
HandlerFIQ
sub sp,sp,#4
stmfd sp!,{r0}
ldr r0,=HandleFIQ
ldr r0,[r0]
str r0,[sp,#4]
ldmfd sp!,{r0,pc}
;再次这段程序目的在于把中断服务程序的首地址装载到PC中,可以称之为“加载程序”
;本初始化程序定义了一个数据区(在文件最后),34个字空间,存放相应中断服务程序的首地址。每个字空间都有一个标号,以Handle***命名。
;本初始化程序定义了一个数据区(在文件最后),34个字空间,存放相应中断服务程序的首地址。每个字空间都有一个标号,以Handle***命名。
例如:HandlerFIQ HANDLER HandleFIQ
HandlerIRQ HANDLER HandleIRQ
HandlerUndef HANDLER HandleUndef
HandlerSWI HANDLER HandleSWI
HandlerDabort HANDLER HandleDabort
HandlerPabort HANDLER HandlePabort
HandlerIRQ HANDLER HandleIRQ
HandlerUndef HANDLER HandleUndef
HandlerSWI HANDLER HandleSWI
HandlerDabort HANDLER HandleDabort
HandlerPabort HANDLER HandlePabort
;在向量中断模式下使用“加载程序”来执行中断服务程序。
注释:向量中断模式是当CPU读取位于0x18处的IRQ中断指令的时候,系统自动读取对应于该中断源确定地址上的指令取代0x18处的指令,通过跳转指令,系统就直接跳转到对应地址函数中节省了中断处理时间提高了中断处理速度。例如:ADC中断的向量地址为0xC0,则在0xC0处放如下代码:ldr PC,=HandlerADC 当ADC 中断产生的时候系统会自动跳转到HandlerADC函数中处理中断。
非向量中断模式处理方式是一种传统的中断处理方法,当系统产生中断的时候,系统将中断状态寄存器中对应标志位置位然后跳转到位于0x18处的统一中断函数中该函数通过读取中断状态寄存器中对应标志位来判断中断源,并根据中断优先级寄存器中优先级关系再跳到对应中断源的处理代码中处理中断。
补充说明:
;细心的人会发现在_ISR_STARTADDRESS=0x33FF_FF00里定义的第一级中断向量表是采用型如Handle***的方式的,而在程序的ENTRY处(程序开始处)采用的是b Handler***的方式.在这里Handler***就是通过HANDLER这个宏和Handle***进立联系的.所以认为HANDLER这个宏是用于第一次查表过程的实现中断向量的重定向。那么这样做有什么优点呢?
这种方式的优点就是真正定义的向量数据放到内存空间RAM里,而不是在ENTRY(地址0x0)处的ROM(FLASH)空间里, 这样,我们就可以在程序里灵活的改动中断向量的数据了(因为ROM是只读的,而RAM为可读可写的),在这里HANDLER是一个宏,就负责查找中断处理程序的入口地址。这些中断入口地址存放在由HandleXXX指向的表项中,该表定位在RAM高端,它的基地址为_ISR_STARTADDRESS。
例如:_ISR_STARTADDRESS为0x800000000,当IRQ中断时,根据b HandlerFIQ,先跳转再根据_ISR_STARTADDRESS基地址+HandleIRQ的偏移地址(4*6)得到的中断地址0x80000000+0x00000024=0x80000024
- mini2440启动代码分析之第二篇(着重理解$HandlerLabel HANDLER $HandleLabel宏)
- mini2440启动代码分析之第二篇(着重理解$HandlerLabel HANDLER $HandleLabel宏)
- 理解$HandlerLabel HANDLER $HandleLabel 宏
- 理解$HandlerLabel HANDLER $HandleLabel宏
- ARM启动代码$HandlerLabel HANDLER $HandleLabel的理解
- $HandlerLabel HANDLER $HandleLabel
- MARCO $HandlerLabel HANDLER $HandleLabel
- mini2440启动代码分析之第九篇
- mini2440启动代码分析之第十篇
- mini2440启动代码分析之第三篇(IMPORT)
- mini2440启动代码分析之第三篇(IMPORT)
- mini2440启动代码分析之第十一篇(完结)
- mini2440启动代码分析之第四篇(入口程序分析)
- mini2440启动代码分析之第四篇(入口程序分析)
- mini2440启动代码分析
- mini2440启动代码分析之第五篇(中断向量表)
- mini2440启动代码分析之第六篇(DCD与二次查表判中断类型)
- mini2440启动代码分析之第八篇(清空SDRAM)
- meyclipse tomcat jdk 内存参数设置
- 谁的事情重要
- fedora下PAE扩展 以及virtualbox编译出现的问题的解决方法。
- -频谱剖析仪的感化以及应用功效先容
- OpenCV 视频监控(Video Surveilance)概述
- mini2440启动代码分析之第二篇(着重理解$HandlerLabel HANDLER $HandleLabel宏)
- haxe,想说爱你不容易
- git push简介
- OpenCV 视频监控(Video Surveilance)的架构
- mini2440启动代码分析之第三篇(IMPORT)
- OpenCV 视频监控(Video Surveilance)的算法体系
- git pull简介
- QT QNetworkAccessManager demo
- mini2440启动代码分析之第四篇(入口程序分析)