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了解很深。但個人覺得在實際項目中真寫很多類似這樣的代碼,維護代碼的同事可要受苦了!


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com