将一个立即数,强制转换一个指针,再以这个指针取出这个地址开始一个字节的内容。具体0x2f5f,是什么,那就要看芯片的数据手册了。比如说,如果A寄存器的地址是0x2f5f,那么,定义了 define A *(volatile unsigned char xdata *) 0x2f5f 那么就可能对寄存器A赋值,只要 A = 0xff;就可以了。去...
xdata是large存储类型,volatile是通过硬件来改变指针指向的内容。 #define XBYTE ((unsigned char volatile xdata *) 0) 定义 XBYTE 为 指向 xdata 地址空间unsigned char 数据类型的指针,指针值为0 这样,可以直接用XBYTE[0xnnnn]或*(XBYTE+0xnnnn)访问外部RAM了。
volatile unsigned char xdata xdata_junk; volatile unsigned char xdata *p = &xdata_junk; unsigned char t1, t2; t1 = *p; t2 = *p; } 编译的汇编为: 0000 7E00 R MOV R6,#HIGH xdata_junk 0002 7F00 R MOV R7,#LOW xdata_junk ;--- Variable 'p' assigned to Register 'R6/R7' --- 000...
我看到过其他的C编程,通常是这么用的: *(unsigned char volatile xdata *)(0x3000)=0xFF这类的方式来进行对外部绝对地址的字节访问。其实XBYTE就相当于一个指向外部数据区的无符号字符型变量的指针(的名称,且当前的指针指向外部RAM的0地址),而在C里面指针一般和数组是可以混用的。可以直接用XBYTE[0xnnnn]或*(X...
volatile unsigned char xdata *p = &xdata_junk; unsigned char t1, t2; t1 = *p; t2 = *p; } 编译的汇编为: 0000 7E00 R MOV R6,#HIGH xdata_junk 0002 7F00 R MOV R7,#LOW xdata_junk ;--- Variable 'p' assigned to Register 'R6/R7' --- 0004...
volatile unsigned char xdata xdata_junk; volatile unsigned char xdata *p = &xdata_junk; unsigned char t1, t2; t1 = *p; t2 = *p; } 编译的汇编为: 0000 7E00 R MOV R6,#HIGH xdata_junk 0002 7F00 R MOV R7,#LOW xdata_junk ;--- Variable 'p' assigned to Register 'R6/R7' --- 000...
xdata是large存储类型,volatile是通过硬件来改变指针指向的内容。 define XBYTE unsigned char volatile xdata 0 定义 XBYTE 为 指向 xdata 地址空间unsigned char 数据类型的指针,指针值为0 这样,可以直接用XBYTE 0xnnnn 或 XBYTE 0xnnnn 访问外部RAM了。 至于 volatile的作用就是让编译器不至于优化掉它的操作: vola...
这个是KeilC 这个是定义了一个端口I/O地址的意思。
//5被优化 j=3;//6j=3 } --- 例2. 函数: voidfunc(void) { unsignedcharxdataxdata_junk; unsignedcharxdata*p=&xdata_junk; unsignedchart1,t2; t1=*p; t2=*p; } 编译的汇编为:
//5被优化 j=3;//6j=3 } --- 例2. 函数: voidfunc(void) { unsignedcharxdataxdata_junk; unsignedcharxdata*p=&xdata_junk; unsignedchart1,t2; t1=*p; t2=*p; } 编译的汇编为: