加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

BANK_BASE(i)的理解

发布时间:2020-12-15 06:55:43 所属栏目:百科 来源:网络整理
导读: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_B
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了解很深。但个人觉得在实际项目中真写很多类似这样的代码,维护代码的同事可要受苦了!

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读