typedef unsigned long phys_addr_t; #define CONfig_SYS_MAX_FLASH_BANKS 1 # define CFI_MAX_FLASH_BANKS CONfig_SYS_MAX_FLASH_BANKS #define CONfig_SYS_FLASH_BASE 0x10000000 #define CONfig_SYS_FLASH_BANKS_LIST { CONfig_SYS_FLASH_BASE} #define BANK_BASE(i) (((phys_addr_t [CFI_MAX_FLASH_BANKS])CONfig_SYS_FLASH_BANKS_LIST)[i])
刚开始看到这段代码的时候很疑惑,这个BANK_BASE(i)表示什么,以前没见过这样的代码啊。经过一番推敲,它的意思是这样的:
typedef unsigned long phys_addr_t; #define CONfig_SYS_MAX_FLASH_BANKS 1 # define CFI_MAX_FLASH_BANKS CONfig_SYS_MAX_FLASH_BANKS #define CONfig_SYS_FLASH_BASE 0x10000000 static phys_addr_t bankList[CONfig_SYS_MAX_FLASH_BANKS] = { CONfig_SYS_FLASH_BASE}; #define BANK_BASE(i) bankList[i]
其它就是取得一个数组变量的索引值。
举一个例子,假如有两片FLASH:
常用的写法是:
#define CONfig_SYS_MAX_FLASH_BANKS 2 # define CFI_MAX_FLASH_BANKS CONfig_SYS_MAX_FLASH_BANKS #define CONfig_SYS_FLASH1_BASE 0x10000000 #define CONfig_SYS_FLASH2_BASE 0x20000000 static phys_addr_t bankList[CONfig_SYS_MAX_FLASH_BANKS] = { CONfig_SYS_FLASH1_BASE,CONfig_SYS_FLASH2_BASE}; #define BANK_BASE(i) bankList[i]
BANK_BASE(i)就是第i片falsh的地址。
在uboot中:
typedef unsigned long phys_addr_t; #define CONfig_SYS_MAX_FLASH_BANKS 2 # define CFI_MAX_FLASH_BANKS CONfig_SYS_MAX_FLASH_BANKS #define CONfig_SYS_FLASH1_BASE 0x10000000 #define CONfig_SYS_FLASH2_BASE 0x20000000 #define CONfig_SYS_FLASH_BANKS_LIST { CONfig_SYS_FLASH1_BASE,CONfig_SYS_FLASH2_BASE} #define BANK_BASE(i) (((phys_addr_t [CFI_MAX_FLASH_BANKS])CONfig_SYS_FLASH_BANKS_LIST)[i])
(1) (phys_addr_t [CFI_MAX_FLASH_BANKS])是一个类型,它是一个数组类型;
(2) CONfig_SYS_FLASH_BANKS_LIST这个宏展开就是“{ CONfig_SYS_FLASH1_BASE,CONfig_SYS_FLASH2_BASE}”;
(3) “((phys_addr_t [CFI_MAX_FLASH_BANKS])CONfig_SYS_FLASH_BANKS_LIST)”就是将(2)中的两个大括号之间的内容强制转换成(1)所述的数组类型;
(4) “[i]”的意思就是取这个数组的索引值。
GCC竟然支持这样的语法,写出这种语句的作者一定对GCC了解很深。但个人觉得在实际项目中真写很多类似这样的代码,维护代码的同事可要受苦了!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。