当前位置: 代码迷 >> 嵌入开发 >> 宏定义MARO的应用有关问题
  详细解决方案

宏定义MARO的应用有关问题

热度:4244   发布时间:2013-02-26 00:00:00.0
宏定义MARO的应用问题

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的操作来实现中断服务程序的跳转和返回。
  相关解决方案