我正在尝试使用嵌套结构组织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;
}
答案 0 :(得分:1)
问题在于,您所做的声明只会为您提供所提及类型的本地(通常是堆叠的)变量。
在建模寄存器时,这不是你想要的,因为每个寄存器的绝对地址根本不在堆栈中,它是常数且众所周知。
你将不得不使用指针:
volatile GPIO * const gpio_a = (GPIO *) 0x008a4200;
它使用完全虚构的地址,但你明白了。
volatile
是必需的,因此编译器会得到“是的,你真的应该对每次访问进行读写操作,即使它对你来说毫无意义”。
const
表示“无法更改此指针的值”,这是您为寄存器建模指针所需的内容。
此外,双重(和三重)检查您在使用位域时得到的结果,它们可能很棘手。您将不得不阅读生成的程序集。