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

时间:2013-07-12 10:36:01

标签: 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 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;
}

1 个答案:

答案 0 :(得分:1)

问题在于,您所做的声明只会为您提供所提及类型的本地(通常是堆叠的)变量。

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

你将不得不使用指针:

volatile GPIO * const gpio_a = (GPIO *) 0x008a4200;

它使用完全虚构的地址,但你明白了。

volatile是必需的,因此编译器会得到“是的,你真的应该对每次访问进行读写操作,即使它对你来说毫无意义”。

const表示“无法更改此指针的值”,这是您为寄存器建模指针所需的内容。

此外,双重(和三重)检查您在使用位域时得到的结果,它们可能很棘手。您将不得不阅读生成的程序集。