地址宏定义
来源:互联网 发布:java入门视频百度网盘 编辑:程序博客网 时间:2024/04/30 09:16
在写嵌入式设备驱动时,需要对寄存器端口进行设置,常常有如下的定义方式:
#define VHPIC_R *((volatile __u32 *)(0x00 + HPI_R_BASE))
当然后面的 HPI_R_BASE是通过ioremap_nocache函数映射得到的。
作为一个宏定义语句,define是定义一个变量或常量的伪指令。首先(volatile __u32 *)的意思是将后面的那个地址强制转换成 (volatile __u32 *),__u32是无符号32位整形,volatile 是一个类型限定符,如const一样,当使用volatile限定时,表示这个变量是依赖系统实现的,以为着这个变量会被其他程序或者计算机硬件修改,由于地址依赖于硬件,volatile就表示他的值会依赖于硬件。
就象大家更熟悉的const一样,volatile是一个类型修饰符(type specifier)。它是被设计用来修饰被不同线程访问和修改的变量。如果没有volatile,基本上会导致这样的结果:要么无法编写多线程程序,或者编译器无法进行优化。
volatile 类型是这样的,其数据确实可能在未知的情况下发生变化。比如,硬件设备的终端更改了它,现在硬件设备往往也有自己的私有内存地址,比如显存,他们一般是通过映象的方式,反映到一段特定的内存地址当中,这样,在某些条件下,程序就可以直接访问这些私有内存了。另外,比如共享的内存地址,多个程序都对它操作的时候。你的程序并不知道,这个内存何时被改变了。如果不加这个voliatile修饰,程序是利用catch当中的数据,那个可能是过时的了,加了voliatile,就在需要用的时候,程序重新去那个地址去提取,保证是最新的。归纳起来如下:
1. volatile变量可变 允许除了程序之外的比如硬件来修改他的内容
2. 访问该数据任何时候都会直接访问该地址处内容,即通过cache提高访问速度的优化被取消
对于*((volatile __u32 *)(0x00 + HPI_R_BASE))为随硬件需要定义的一种地址,前面加上“*”指针,为直接指向该地址,整个定义约定符号VHPIC_R代替,调用的时候直接对指向的地址寄存器写内容既可。
- 地址宏定义
- vxworks一些宏定义地址
- socket常用地址定义
- 取自定义数据类型 地址
- Linux 地址定义
- arm中宏定义地址关键字volatile解析
- arm linux中一些重要的宏及地址定义
- arm linux中一些重要的宏及地址定义
- arm linux中一些重要的宏及地址定义
- arm linux中一些重要的宏及地址定义
- arm linux中一些重要的宏及地址定义
- socket 地址结构体定义
- STM32外设寄存器地址定义
- 用" #include<absacc.h> “ 即可使用其中定义的宏来访问绝对地址
- armlinux中一些重要的宏-如unlikely、container_of及地址定义
- 与struct相关的宏定义(成员变量偏移和获取struct起始地址)
- 转载_armlinux中一些重要的宏-如unlikely、container_of及地址定义
- 用C语言宏定义寄存器地址解释 和 关键字 volatile
- day28_struts2(全天)のPPT学习——06 使用Struts2的输入校验
- hadoop-2.X启动后用JPS命令查看,resourcemanger无法启动:地址已被使用
- Spring 4.x+Spring MVC 4.x+MyBatis 3.x 整合(四)Spring 3.1.0 整合
- HDU5183Negative and Positive (NP)(哈希表)
- POJ2965 The Pilots Brothers' refrigerator(枚举+思维题)
- 地址宏定义
- 通过jni实现c++和java互调
- LightOJ 1422 - Halloween Costumes(区间DP)
- The container 'Android Dependencies' references non existing library
- 莀莂蚈肃腿莄螄蝿聿莇袀羈
- 羆膁葿蚁羅芄芁薇肄羃蒇蒃
- 衿膅肇蚆袁芁芆蒆螄袄莅莅
- 2015.3.17图书馆的管理系统
- 螀肈芀蚄袃袀膆蚃薂肆肂蚂