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的本意是指这个值可能会在当前线程外部被改变,此时编译器知道该变 量的值会在外部改变,因此每次访问该变量时会重新读取。