BANK_BASE(i)的理解 phys_addr_t

[cpp]  view plain copy
  1. typedef unsigned long phys_addr_t;  
  2. #define CONFIG_SYS_MAX_FLASH_BANKS      1  
  3. # define CFI_MAX_FLASH_BANKS CONFIG_SYS_MAX_FLASH_BANKS  
  4. #define CONFIG_SYS_FLASH_BASE      0x10000000  
  5. #define CONFIG_SYS_FLASH_BANKS_LIST  { CONFIG_SYS_FLASH_BASE}  
  6. #define BANK_BASE(i)    (((phys_addr_t [CFI_MAX_FLASH_BANKS])CONFIG_SYS_FLASH_BANKS_LIST)[i])  



刚开始看到这段代码的时候很疑惑,这个BANK_BASE(i)表示什么,以前没见过这样的代码啊。经过一番推敲,它的意思是这样的:

[cpp]  view plain copy
  1. typedef unsigned long phys_addr_t;  
  2. #define CONFIG_SYS_MAX_FLASH_BANKS      1  
  3. # define CFI_MAX_FLASH_BANKS CONFIG_SYS_MAX_FLASH_BANKS  
  4. #define CONFIG_SYS_FLASH_BASE      0x10000000  
  5. static phys_addr_t bankList[CONFIG_SYS_MAX_FLASH_BANKS] = { CONFIG_SYS_FLASH_BASE};  
  6. #define BANK_BASE(i)  bankList[i]  



其它就是取得一个数组变量的索引值。



举一个例子,假如有两片FLASH:
常用的写法是:

[cpp]  view plain copy
  1. #define CONFIG_SYS_MAX_FLASH_BANKS      2    
  2. # define CFI_MAX_FLASH_BANKS CONFIG_SYS_MAX_FLASH_BANKS     
  3. #define CONFIG_SYS_FLASH1_BASE      0x10000000     
  4. #define CONFIG_SYS_FLASH2_BASE      0x20000000     
  5. static phys_addr_t bankList[CONFIG_SYS_MAX_FLASH_BANKS] = { CONFIG_SYS_FLASH1_BASE, CONFIG_SYS_FLASH2_BASE};    
  6. #define BANK_BASE(i)  bankList[i]  

BANK_BASE(i)就是第i片falsh的地址。

在uboot中:

[cpp]  view plain copy
  1. typedef unsigned long phys_addr_t;  
  2. #define CONFIG_SYS_MAX_FLASH_BANKS      2  
  3. # define CFI_MAX_FLASH_BANKS CONFIG_SYS_MAX_FLASH_BANKS  
  4. #define CONFIG_SYS_FLASH1_BASE      0x10000000  
  5. #define CONFIG_SYS_FLASH2_BASE      0x20000000  
  6. #define CONFIG_SYS_FLASH_BANKS_LIST  { CONFIG_SYS_FLASH1_BASE, CONFIG_SYS_FLASH2_BASE}  
  7. #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了解很深。但个人觉得在实际项目中真写很多类似这样的代码,维护代码的同事可要受苦了!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值