本文将为大家分析关于ARM中断宏定义的相关介绍。MACRO
本文引用地址://m.amcfsurvey.com/article/201611/319275.htm$HandlerLabel HANDLER $HandleLabel
$HandlerLabel
sub sp,sp,#4;decrement sp(to store jump address)存贮PC跳转地址
stmfd sp!,{r0};PUSH the work register to stack(lr does not push because it return to original address)
ldrr0,=$HandleLabel;load the address of HandleXXX to r0
ldrr0,[r0];load the contents(service routine start address) of HandleXXX
strr0,[sp,#4];store the contents(ISR) of HandleXXX to stack
ldmfdsp!,{r0,pc};POP the work register and pc(jump to ISR)
MEND
上面是在汇编语言2440vectors.s中的一段完整的宏定义
MACRO相当于c中的#define
而$HandlerLabel 和$HandleLabel是两个参数,大家注意,第一个参数和第二个参数是不一样的,中间少了个r
而第一个参数在本宏中是一个标号,而第二个函数是一个入口地址
以下有定义:
HandlerFIQHANDLER HandleFIQ
HandlerIRQHANDLER HandleIRQ
HandlerUndefHANDLER HandleUndef
HandlerSWIHANDLER HandleSWI
HandlerDabortHANDLER HandleDabort
HandlerPabortHANDLER HandlePabort
拿HandlerSWIHANDLERHandleSWI说明:把它用宏给替换下来以后是:
$HandlerSWI
1:sub sp,sp,#4;decrement sp(to store jump address)存贮PC跳转地址
2:stmfd sp!,{r0};PUSH the work register to stack(lr does not push because it return to original address)
3:ldrr0,=$HandleSWI;load the address of HandleXXX to r0
4:ldrr0,[r0];load the contents(service routine start address) of HandleXXX
5:strr0,[sp,#4];store the contents(ISR) of HandleXXX to stack
6:ldmfdsp!,{r0,pc};POP the work register and pc(jump to ISR)
达内培训小提问:
这段宏定义的作用是什么呢?是安装SWI中断,如何安装的呢?
sub sp,sp,#4是把SP的地址减4字节,而这个地方需要存放跳转地址也就是第5行的HandleSWI指向的内容(ISR)
接下来是压栈所需要的寄存器r0,因为接下来需要使用r0所以先压栈r0,这也是为什么刚刚先把SP加四字节的原因,第6句话就是跳转到刚刚第5句所压栈的地址处,也就是HandleSWI指向的内容(ISR)处
VectorsAddr
LDRPC, Reset_Addr
LDRPC, Undefined_Addr
LDRPC, SWI_Addr
LDRPC, Prefetch_Addr
LDRPC, Abort_Addr
NOP; Reserved vector
LDRPC, IRQ_Addr
LDRPC, FIQ_Addr
EXPORT VectorsAddr
Reset_AddrDCDResetHandler;第一次地址转换
Undefined_AddrDCDHandlerUndef
SWI_AddrDCDHandlerSWI
Prefetch_AddrDCDHandlerPabort
Abort_AddrDCDHandlerDabort
IRQ_AddrDCDHandlerIRQ
FIQ_AddrDCDHandlerFIQ
评论