Chinaunix首页 | 论坛 | 博客
  • 博客访问: 583904
  • 博文数量: 119
  • 博客积分: 6010
  • 博客等级: 准将
  • 技术积分: 1583
  • 用 户 组: 普通用户
  • 注册时间: 2008-08-15 09:18
文章分类

全部博文(119)

文章存档

2011年(3)

2010年(21)

2009年(44)

2008年(51)

我的朋友

分类: C/C++

2008-08-27 15:18:03

当我们在看嵌入式系统的头文件时经常会看见这样的定义方式:
#define rUTXH0  (*(volatile unsigned char *)0x1d00020)
 
但是为什么要这样写呢?
这样写是有好处的,因为是用宏定义所以是在编译过程中处理的,他是不占用任何的RAM与ROM资源的,
其次,抛开volatile 对于(*(unsigned char *))
首先 unsigned char *是强制类型转换,这里是转换成指向无符号字符型的指针(注意这里是转换成指针,不是指针变量,一个地址可以看做指针,而存放指针的是指针变量,这两点一定不要弄混了。)
然后 *(unsigned char *)这个操作是相当于取该指针的值,这里既是0x1d00020 地址对应处的值,因为之前
已经转换成指向 无符号型字符的类型了,那么这里得出的值就是一个 无符号类型的值,即8bit的数据。这样如果你做操作  i=rUTXH0 ,则系统就会将该地址对应的8位值,取出来复给i,而不会错将16位或是32位的值复给i。  
 
但是有人又要问了,为什么我在用51的时候,怎么头文件里没有这样定义呢?
这是因为,在51里是用SFR这个关键字来定义特殊功能寄存器的,但是这个通过这个关键字默认都是对字节(8bit)操作 不能对字操作。对于16bit的寄存器他只能 分开定义,如:
sfr DPL    = 0x82;
sfr DPH    = 0x83;
而如果在嵌入式系统里我们直接可以这样来写:
#define DP (*(volatile unsigned int *)0x82) (对于16位系统而言)
阅读(1024) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~