当我们在看嵌入式系统的头文件时经常会看见这样的定义方式:
#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位系统而言)
阅读(1057) | 评论(0) | 转发(0) |