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编译器也使用位地址。