BANK_BASE(i)的理解 phys_addr_t
来源:互联网 发布:sql server error 编辑:程序博客网 时间:2024/06/01 10:49
- 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了解很深。但个人觉得在实际项目中真写很多类似这样的代码,维护代码的同事可要受苦了!
0 0
- BANK_BASE(i)的理解 phys_addr_t
- BANK_BASE(i)的理解
- ++i 和 i++ 的理解
- i++的理解
- 关于 ++i*--i 问题自己的理解
- ++i和i++ (自己的理解)
- 我所理解的i++和++i
- 我所理解的i++和++i
- 对于i=i++的理解
- 关于i = i++的理解
- 对i++和++i的理解
- i++等自己的理解
- I/Q信号的理解
- 理解 i++ 和++i
- 对window.setTimeout("sTimer(" + i + ")", i * 1000)的理解
- 【JAVA面试题】i++,++i 的深刻理解
- java中i++和++i的深层理解
- 从汇编层次理解 i++ 与 ++i 的区别
- SOA与ESB的关系
- java工具类 获取包下所有类
- Cocos2d-x教程 CocoStudio篇 (3) UICheckBox 复选框控件
- 数据库导出CSV格式,并压缩成ZIP的形式导出
- main函数
- BANK_BASE(i)的理解 phys_addr_t
- LIBUSB 介绍
- C#使用GDAL计算某点的高程值
- explicit关键字的作用
- 持续集成 最佳实践 研讨会(1月25日 广州)
- hadoop配置过程中出错的地方
- Makefile详解和实例
- C#--工作笔记(直方图Page页)
- 双缓冲绘图