首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 嵌入开发 >

宏定义MARO的应用有关问题

2012-02-16 
宏定义MARO的应用问题MACRO$HandlerLabel HANDLER $HandleLabel$HandlerLabelsubsp,sp,#4decrement sp(to

宏定义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的操作来实现中断服务程序的跳转和返回。

热点排行