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 #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])
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]
#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])
(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了解很深。但个人觉得在实际项目中真写很多类似这样的代码,维护代码的同事可要受苦了! (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |