分类: C/C++
2010-08-14 20:23:13
以前对形如#define MCF_UART0_USR (*(volatile unsigned char *) (0xFC060004))这样
的定义感到很奇怪,也没有对这个问题进行深究,今天下午特地下从网上搜了相关资料,
现整理如下:
首先, #define MCF_UART0_USR 是一个宏定义,这一点好理解,关键是如何理解
(*(volatile unsigned char *) (0xFC060004)).
嵌入式系统编程,要求程序员能够利用C语言访问固定的内存地址。既然是个地址,
那么按照C语言的语法规则,这个表示地址的量应该是指针类型。
所以,知道要访问的内存地址后,比如0xFC060004,下面分几步进行讲解:
1) 强制转换为指针类型 (volatile unsigned char *) (0xFC060004)是把内存地址
0xFC060004强制转换为指针类型, MCF52277UARTDE USR寄存器是八位寄存器,
所以把0xFC060004强制转换为指向unsigned char类型,volatile(可变的)这个关键字
说明这变量可能会被意想不到地改变,加上它编译器就不会去假设这个变量的值了。
如此看来,(volatile unsigned char *) (0xFC060004)其实相当于定义了
一个指向0xFC060004地址的指针,我们可以简化理解成unsigned char *p;
2)在指针变量前再加*,就成了对指针变量解引用,就能操作指针所指向的地址的内容了,
这其实与其他普通定义的指针一样,如int *p; *p=3;
其中int *p是定义了一个指针变量p,而*p则存放了p所指向地址的内容。