c语言 保存函数入口地址,通过函数的入口地址来调用函数

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,后面的东西查看硬件说明。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值