宏定义MARO的应用问题

shenhongfeinuaa   2009-11-3 22:18 楼主

        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
的应用一点都看不明白,希望各位高手能给小弟详细介绍一下,在此先谢过了!

回复评论 (3)

是把宏的第一个参数$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}   
点赞  2009-11-9 15:13
楼上说的没错,主要是实现模式的跳转和返回。用的最多的是IRQ中断的跳转,通过对PC的操作来实现中断服务程序的跳转和返回。
点赞  2009-11-9 15:45
上面的问题基本是解决了,但是为什么我在调试s3c2410的时候开始提示的只有十几个问题,解决过后又在另一个文件是出现三十几个问题,好像永远都不能调试成功似的,郁闷得很!
点赞  2009-11-9 19:04
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复