ldmfd sp!,{r0,pc} ;用出栈的方式恢复 r0 的原值和为 pc 设定新值(完成了到 ISR
的转跳)
MEND
;首先这段程序是个宏定义,HANDLER 是宏名,不要想歪了
;其次后面程序遇到的 HandlerXXX HANDLER HandleXXX 这些语句将都被下面这
段程序展开
例如:HandlerFIQ HANDLER HandleFIQ 被上面那段程序展开后为:
HandlerFIQ
subsp,sp,#4
stmfdsp!,{r0}
ldrr0,=HandleFIQ
ldrr0,[r0]
strr0,[sp,#4]
ldmfd sp!,{r0,pc}
;再次这段程序目的在于把中断服务程序的首地址装载到 PC 中,可以称之为“加载
程序”
;本初始化程序定义了一个数据区(在文件最后),34 个字空间,存放相应中断服
务程序的首地址。每个字空间都有一个标号,以 Handle***命名。
例如:
HandlerFIQ HANDLER HandleFIQ
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
评论0
最新资源