ARM中#define EnterPWDN(clkcon) ((void
(*)(int))0x20)(clkcon))代表什么意思
1.首先,这是一个带参数宏定义,所以,如果有语句EnterPWDN(0x7fff4)则展开以后就是如下语句 ((void
(*)(int))0x20)(0xffff4))
2.(void(*)(int))0x20的意思
(void(*)(int))作为一个强制类型转换,将0x20转换为一个函数指针类型,这个函数的原型为 void
fun(int); 而后面的0xffff4就是代表的函数的参数,所以 ((void
(*)(int))0x20)(0xffff4))整句话的意思就是调用地址在0x20处的函数,参数为0xffff4.其实看后面实际上就是跳转到地址0x20处执行代码,并且把参数传到r0,ATPCS中规定1-4个参数对应的存储寄存器为r0-r3。
3.再看在2440init.s中对该部分的定义
b ResetHandler
b HandlerUndef ;handler for Undefined mode
b HandlerSWI ;handler for SWI interrupt
b HandlerPabort ;handler for PAbort
b HandlerDabort ;handler for DAbort
b . ;reserved
b HandlerIRQ ;handler for IRQ interrupt
b HandlerFIQ ;handler for FIQ interrupt
;@0x20
b EnterPWDN ; Must be @0x20.
EnterPWDN
mov r2,r0 ;r2=rCLKCON
tst r0,#0x8 ;SLEEP mode?
bne ENTER_SLEEP
b EnterPWDN ; Must be @0x20.这条语句,对应的指令地址为0x20,这就是前面((void
(*)(int))0x20)中0x20的意义,然后语句跳到EnterPWDN执行,单然,参数值就传给了r0,后面的东西查看硬件说明。