MACRO
$HandlerLabel HANDLER $HandleLabel
$HandlerLabel
sub sp,sp,#4 ;decrement sp(to store jump address)
stmfd sp!,{r0} ;PUSH the work register to stack(lr does not push because it return to original address)
ldr r0,=$HandleLabel;load the address of HandleXXX to r0
ldr r0,[r0] ;load the contents(service routine start address) of HandleXXX
str r0,[sp,#4] ;store the contents(ISR) of HandleXXX to stack
ldmfd sp!,{r0,pc} ;POP the work register and pc(jump to ISR)
MENDUDF_INS_HANDLER HANDLER UdfInsVector
UDF_INS_HANDLER HANDLER UdfInsVector
SWI_SVC_HANDLER HANDLER SwiSvcVector
INS_ABT_HANDLER HANDLER InsAbtVector
DAT_ABT_HANDLER HANDLER DatAbtVector
IRQ_SVC_HANDLER HANDLER IrqSvcVector
FIQ_SVC_HANDLER HANDLER FiqSvcVector
不知道这段程序里的哪是宏名 哪是宏参数,特别是对 :
UDF_INS_HANDLER HANDLER UdfInsVector
SWI_SVC_HANDLER HANDLER SwiSvcVector
INS_ABT_HANDLER HANDLER InsAbtVector
DAT_ABT_HANDLER HANDLER DatAbtVector
IRQ_SVC_HANDLER HANDLER IrqSvcVector
FIQ_SVC_HANDLER HANDLER FiqSvcVector
的应用一点都看不明白,希望各位高手能给小弟详细介绍一下,在此先谢过了!
------解决方案--------------------------------------------------------
是把宏的第一个参数$HandlerLabel 转变为一个标号,然后让程序跳转到第二个参数 $HandleLabel (第二个参数应该为一个地址)对应的值的地址去。
IRQ_SVC_HANDLER HANDLER IrqSvcVector
等价于
IRQ_SVC_HANDLER
sub sp,sp,#4
stmfd sp!,{r0}
ldr r0,=IrqSvcVector
ldr r0,[r0]
str r0,[sp,#4]
ldmfd sp!,{r0,pc}
------解决方案--------------------------------------------------------
楼上说的没错,主要是实现模式的跳转和返回。用的最多的是IRQ中断的跳转,通过对PC的操作来实现中断服务程序的跳转和返回。