读书人

宏定义MARO的应用有关问题

发布时间: 2012-02-16 21:30:36 作者: rapoo

宏定义MARO的应用问题

MACRO
$HandlerLabel HANDLER $HandleLabel
$HandlerLabel
subsp,sp,#4 ;decrement sp(to store jump address)
stmfdsp!,{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_HANDLERHANDLERUdfInsVector
UDF_INS_HANDLERHANDLERUdfInsVector
SWI_SVC_HANDLERHANDLERSwiSvcVector
INS_ABT_HANDLERHANDLERInsAbtVector
DAT_ABT_HANDLERHANDLERDatAbtVector
IRQ_SVC_HANDLERHANDLERIrqSvcVector
FIQ_SVC_HANDLERHANDLERFiqSvcVector
不知道这段程序里的哪是宏名 哪是宏参数,特别是对 :
UDF_INS_HANDLERHANDLERUdfInsVector
SWI_SVC_HANDLERHANDLERSwiSvcVector
INS_ABT_HANDLERHANDLERInsAbtVector
DAT_ABT_HANDLERHANDLERDatAbtVector
IRQ_SVC_HANDLERHANDLERIrqSvcVector
FIQ_SVC_HANDLERHANDLERFiqSvcVector
的应用一点都看不明白,希望各位高手能给小弟详细介绍一下,在此先谢过了!

[解决办法]
是把宏的第一个参数$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的操作来实现中断服务程序的跳转和返回。

读书人网 >嵌入开发

热点推荐