Chinaunix首页 | 论坛 | 博客
  • 博客访问: 244890
  • 博文数量: 49
  • 博客积分: 1595
  • 博客等级: 上尉
  • 技术积分: 497
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-21 15:22
文章分类

全部博文(49)

文章存档

2011年(19)

2010年(30)

我的朋友

分类: 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所指向地址的内容。
阅读(3687) | 评论(0) | 转发(0) |
0

上一篇:volatile

下一篇:内核定时器(2.6.23)

给主人留下些什么吧!~~