C 试图理解位ram地址
我正试图理解这段代码来处理位:C 试图理解位ram地址,c,embedded,bit,ram,pic,C,Embedded,Bit,Ram,Pic,我正试图理解这段代码来处理位: /* GPIO bits */ static bit GP5 @ (unsigned)&GPIO*8+5; static bit GP4 @ (unsigned)&GPIO*8+4; static bit GP3 @ (unsigned)&GPIO*8+3; static bit GP2 @ (unsigned)&GPIO*8+2; static bit GP1 @ (unsigned)&GPIO*8+1;
/* GPIO bits */
static bit GP5 @ (unsigned)&GPIO*8+5;
static bit GP4 @ (unsigned)&GPIO*8+4;
static bit GP3 @ (unsigned)&GPIO*8+3;
static bit GP2 @ (unsigned)&GPIO*8+2;
static bit GP1 @ (unsigned)&GPIO*8+1;
static bit GP0 @ (unsigned)&GPIO*8+0;
GPIO的定义如下:
static volatile unsigned char GPIO @ 0x06;
为什么GPIO地址乘以8,然后再加上位数?这个宏的结果是什么?我如何处理该位 上面的代码是针对PIC微控制器的XC8编译器的。Atmel在使用宏IOPORT\u CREATE\u PIN时使用相同的方法。此宏的定义如下:
#define IOPORT_CREATE_PIN(port, pin) ((IOPORT_##port)*8 + (pin))
因为每个特殊功能寄存器有8位(取决于微控制器)。
GP0
的地址是0x06*8+0=0x30
。寻址位的方式也取决于微控制器。对不起,我不熟悉这张照片。你可以自己解决
因为每个特殊功能寄存器有8位(取决于微控制器)。
GP0
的地址是0x06*8+0=0x30
。寻址位的方式也取决于微控制器。对不起,我不熟悉这张照片。你可以自己解决
“为什么GPIO地址乘以8,然后再加上位数?此宏的结果是什么?如何寻址位?”
它是最低地址的位计数:每个字节8位加上字节的偏移量
您可以通过该名称对位进行寻址,例如,GP3=1代码>。编译器知道它是一个位。如前所述,这是PIC的一个特定编译器扩展 “为什么GPIO地址乘以8,然后再加上位数?此宏的结果是什么?如何寻址位?”
它是最低地址的位计数:每个字节8位加上字节的偏移量
您可以通过该名称对位进行寻址,例如,GP3=1代码>。编译器知道它是一个位。如前所述,这是PIC的一个特定编译器扩展 看一下零件的文档,应该很明显。检查I/O寄存器的大小,以便读取端口和/或端口内的引脚。这应该可以解释地址的计算。我不希望这在供应商之间是一致的,尤其是从microchip到atmel,这只是一个巧合。编译器很有趣,但我们需要的更重要的细节是零件号。您的问题对于该部件或系列非常具体。这种语法与其说是C,不如说是XC8,您可能需要相应地调整标记。@BrianCain,这种语法可以在这里解释:@DanielGrillo,我理解语法,但它不是合法的C,因此,你可能会发现,对于那些不完全是C的东西,so不赞成使用“C”标记。看看这个部分的文档,这应该是很明显的。检查I/O寄存器的大小,以便读取端口和/或端口内的引脚。这应该可以解释地址的计算。我不希望这在供应商之间是一致的,尤其是从microchip到atmel,这只是一个巧合。编译器很有趣,但我们需要的更重要的细节是零件号。您的问题对于该部件或系列非常具体。这种语法与其说是C,不如说是XC8,您可能需要相应地调整标记。@BrianCain,这种语法可以在这里解释:@DanielGrillo,我理解语法,但它不是合法的C,所以你可能会发现,对于那些不完全是C的东西,so不赞成使用C标签。这就是问题所在。PIC和AVR都没有提到引用。@DanielGrillo因为GPx(例如GP0)已经被定义,所以我认为可以直接解决它。如下所示:GP0=1;//设置GP0
但为什么它由地址0x30而不是0x06访问?@DanielGrillo它不是字节地址。PIC编译器也使用位地址。这就是问题所在。PIC和AVR都没有提到引用。@DanielGrillo因为GPx(例如GP0)已经被定义,所以我认为可以直接解决它。如下所示:GP0=1;//设置GP0
但为什么它由地址0x30而不是0x06访问?@DanielGrillo它不是字节地址。PIC编译器也使用位地址。