exilefox 发表于 2012-3-10 23:31:55

uboot中CopyMovitoMem这个函数的定义好别扭,请高手来分析一下

在mmc_boot.c里面有这么一个宏函数

#define copy_sd_mmc_to_mem(a,b,c,d,e)    (((int(*)(uint, ushort, uint *, uint, int))(*((uint *)(TCM_BASE + 0x8))))(a,b,c,d,e));

那么多括号的把我给看晕了,不太习惯linux里面这种用宏来定义函数的还那么多类型转换啦指针啦的。
在网上找到一些说明
“这个定义实际上是调用了位于TCM_BASE+%2B+0x8这个地址的函数指针,其中TCM_BASE的值为0x0C004000,至于这个地址放的是什么,也没资料说明”
还是没有能理解。请各位高手帮分析一下这个宏的格式、结构~

eduhf_123 发表于 2012-3-11 01:27:50

(((int(*)(uint, ushort, uint *, uint, int))(*((uint *)(TCM_BASE + 0x8)))) (a,b,c,d,e))


首先红色字部分:(*((uint *)(TCM_BASE + 0x8))),取出存于TCM_BASE + 0x8这个地址的一个32位数据;
其次蓝色字部分:(int(*)(uint, ushort, uint *, uint, int)),使用一个指向函数的指针(该指针所指向的函数原型为:返回值为int型、五个参数依次为uint、ushort、uint*、uint、int)进行强制类型转换,将上述32位的数据转换为一个指向函数的指针;
再次黄色括号对:将上述两部分括起来,表示调用该指针所指向的函数;
然后绿色字部分:(a,b,c,d,e),表示调用上述函数时所传入的参数;
最后灰色括号对:将整个宏体用括号括起来,防止宏展开时产生意外的歧义。

kongan 发表于 2012-3-11 08:12:04

谢谢楼上解答

cht-rtos 发表于 2012-3-11 08:50:26

一层一层拔

exilefox 发表于 2012-3-11 09:25:26

2楼解释很清楚~受教了

ljmdzyx 发表于 2012-3-11 09:30:00

学习了。
页: [1]
查看完整版本: uboot中CopyMovitoMem这个函数的定义好别扭,请高手来分析一下