现在的位置: 首页 > 综合 > 正文

使用volatile

2013年07月15日 ⁄ 综合 ⁄ 共 1227字 ⁄ 字号 评论关闭

unsigned long *p

p=((unsigned long *) 0x80001000);

上面2句可以写成

unsigned long *p=((unsigned long *) 0x80001000);

*p=0x55555555, 就是给地址 0x80001000 写 0x55555555

#define AT91C_SDRAM ((unsigned int *) 0x 20000000) // 根据sdram的地址进行修改

unsinged int *pTemp =AT91C_SDRAM ,指针pTemp 的地址为 0x 20000000

/* Pin Connect Block */
#define PINSEL0        (*((volatile unsigned long *) 0xE002C000))
#define PINSEL1        (*((volatile unsigned long *) 0xE002C004))
#define PINSEL2        (*((volatile unsigned long *) 0xE002C014))

PINSEL0 = 0x00050000;    地址0xE002C000 的值为 0x00050000

首先(volatile unsigned long *) 0x48000000的意思是把0x48000000强制转换成volatile unsigned long类型

的指针,即对指针的操作的范围是从0x48000000开始的4个字节(long型).暂记为p,那么就是

#define A   *p,即A为P指针指向位置的内容了。这里就是通过内存寻址访问到寄存器A,可以读/写操作!

如果将一个变量定义为volatile,相当于告诉编译器该变量可能随时被该变,被操作系统或硬件所改变。因为带有volatile的变量可以在任 何时刻改变,该变量的物理地址可能评频繁地访问。这就意味着编译器不能对这些变量实现优化。相反,如果一个变量没有被定义为volatile,则编译器认 为该变量不能在应用程序之外改变,因此编译器可以对这种变量实行优化。

当一个变量地值可能在应用程序不知道地情况下可能改变其值,为了避免优化带来地问题,需要将其定义为volatile类型。一般有以下情况时,变量需要被定义为volatile类型:

(1)访问内存映射地的外围设备;

(2)在不同的进程之间共用的全局变量;

(3)在中断服务程序中访问的全局变量;

C语言关键字volatile 表明某个变量的值可能随时被外部改变(例如,外设端口寄存器值),因此对这些变量的存取不能缓存到寄存器,每次使用时需要重新读取。

 该关键字在多线程环境下经常使用,因为在编写多线程的程序时,同一个变量可能被多个线程修改,而程序通过该变量同步各个线程。对于C语言编译器来 说,他并不知道这个值会被其他线程修改,自然就把他缓存到寄存器里面。Volatile的本意是指这个值可能会在当前线程外部被改变,此时编译器知道该变 量的值会在外部改变,因此每次访问该变量时会重新读取。

【上篇】
【下篇】

抱歉!评论已关闭.