地址宏定义

来源:互联网 发布: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代替,调用的时候直接对指向的地址寄存器写内容既可。

0 0