|
回复 31# dxf520
#define XREG(addr) ((unsigned char volatile __xdata *) 0)[addr] 用起来就是这样的:
XREG(0XFFFF)=0X12;
作用:把0X12这个值写进地址为0xFFFF的八位存储空间(寄存器,不过对于Xdata而言,应该只是SRAM而不是register)里面。
分析:
(unsigned char volatitle __xdata*),(unsigned char *) ()是什么意思知道吧?用来把括号里的内容转化成指向八位char型变量的指针(类型)。
加上volatitle意味着叫编译器不要优化对该存储变量的读取代码,即每次读取都要到内存空间中读取,而不是只读一次并放到寄存器中keep住,以后要读的时候直接从寄
存器中读取(寄存器操作速度快)。为什么?因为这意味着该存储区可能被非CPU逻辑机构所修改,好比如DMA等。
而加上__xdata的意识是告诉编译器,这指针所指向的区域位于xdata存储区,不要用针对8051的IO总线(0X00~0XFF)访问指令来访问,而用外部总线访问指令来访
问。
(unsigned char volatitle __xdata*)的意思明白了,那么((unsigned char volatitle __xdata*)0)的意思就是把0强制转换成unsigned char volatitle
__xdata*类型的指针咯,最后加上[]形成((unsigned char volatitle __xdata*)0)[]时,则把0变成了一维数组的首地址了,括号里面的值就是该数据的偏移地址。而又因为这个数组是char*指针,一个字节,故对该“数组”的访问可完全等效成对xdata的某个地址的访问。
有错请指正。 |
|