HandlerFIQ HANDLER HandleFIQ ,HANDLER是一个宏名,它的作用就是将HandleFIQ处的四个字节的内容放到PC中,从而实现程序的转移。在HandleFIQ处放的是中断服务程序的入口地址。
解释:
启动代码有如下的宏定义:
MACRO
$HandlerLabel HANDLER $HandleLabel ;宏定义,请仔细理解
$HandlerLabel
;由于ADS仅支持FD(满递减)型堆栈
sub sp,sp,#4 ;将堆栈退一个字用于保存下面用到的R0
stmfd sp!,{r0} ;将R0压入堆栈
ldr r0,=$HandleLabel ;将HandleLabel的地址赋给R0
ldr r0,[r0] ;将HandleLabel的地址指向的内容
;(实际的执行地址)赋给R0
str r0,[sp,#4] ;将对应的中断函数首地址入栈保护
ldmfd sp!,{r0,pc}
;将中断函数的首地址出栈,放入PC中,系统将跳转到对应中断处理函数
MEND
HANDLER 是宏名。$HandlerLabel 是宏展开后要被别的字符替换掉的标号,不过不叫参数。
例如: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 HANDLER HandleFIQ
HandlerIRQ HANDLER HandleIRQ
HandlerUndef HANDLER HandleUndef
HandlerSWI HANDLER HandleSWI
HandlerDabort HANDLER HandleDabort
HandlerPabort HANDLER HandlePabort
等等
这些语句在编译时都将会被替换。
该宏定义的代码用于将对应中断服务程序ISR的入口地址装载到PC中,可称之为“加载程序”。