将结构实例分配给C中的内部嵌套结构

将结构实例分配给C中的内部嵌套结构,c,struct,nested,C,Struct,Nested,我试图用C语言组织微控制器的结构,使用嵌套结构将寄存器分组到设备端口,然后将所有端口分组到微控制器实例 typedef struct { volatile unsigned char bit0:1, bit1:1, bit2:1, bit3:1, bit4:1, bit5:1, bit6:1, bit7:1; }REG; typedef struct { REG addr; REG ctl; REG data; }PORT; typedef struct { PORT porta; PORT

我试图用C语言组织微控制器的结构,使用嵌套结构将寄存器分组到设备端口,然后将所有端口分组到微控制器实例

typedef struct {
volatile unsigned char bit0:1, bit1:1, bit2:1, bit3:1, bit4:1, bit5:1, bit6:1, bit7:1;
}REG;

typedef struct {
REG addr;
REG ctl;
REG data;
}PORT;

typedef struct {
PORT porta;
PORT portb;
PORT portc;
}GPIO;

typedef struct {
GPIO gpio;
ADC adc;
UART uart;
}micro;

int main(void){
GPIO m_gpio;
micro m;
m.gpio = m_gpio;
return 0;
}

问题是,您所做的声明只会为您提供上述类型的局部(通常是堆叠的)变量

在对寄存器建模时,这不是您想要的,因为每个寄存器的绝对地址根本不在堆栈上,它是常量且众所周知

您必须使用指针:

volatile GPIO * const gpio_a = (GPIO *) 0x008a4200;
那是一个完全虚构的地址,但你明白了

volatile
是必需的,因此编译器会得到提示“是的,您确实应该在每次访问时执行读或写操作,即使它对您来说似乎毫无意义”

const
表示“此指针的值无法更改”,这是指针模拟寄存器所需的值


此外,在使用位字段时,请双重(和三重)检查您是否得到了预期的结果,这可能会很棘手。您必须读取生成的程序集。

为什么要使用
*
,它将成为指针声明。你知道吗?确切的问题在哪里/什么地方?我的问题是我应该如何在main中实例化struct micro并设置起始地址,以及如何访问成员结构以设置单个寄存器位,比如我想设置micro.gpio.porta.addr=0x01。。。和micro.gpio.porta.ctl.bit0=1;这是一个指向项目中主.h文件的链接我正在编写我只需要演示嵌套结构是如何工作的,每个寄存器使用单个结构我的代码工作得很好,我使用UART通信进行了测试,我不知道如何执行嵌套结构,我想它可以使代码组织良好。这是一个有用的答案,micro类型如何,如何将其成员设备gpio设置为*gpio_a?只是一个例子。顺便说一句,我对bitfield没什么意见,只要我使用“volatile unsigned char”,它们就会被分配,并且读起来很好。