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,至于这个地址放的是什么,也没资料说明”
还是没有能理解。请各位高手帮分析一下这个宏的格式、结构~ (((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),表示调用上述函数时所传入的参数;
最后灰色括号对:将整个宏体用括号括起来,防止宏展开时产生意外的歧义。 谢谢楼上解答 一层一层拔 2楼解释很清楚~受教了 学习了。
页:
[1]