-2

我正在尝试使用嵌套结构将寄存器分组到设备端口,然后将所有端口分组到微控制器实例,在 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;
}
4

1 回答 1

1

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

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

您将不得不使用指针:

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

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

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

意思是“这个指针的const值不能改变”,这就是你想要的指针建模寄存器。

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

于 2013-07-12T10:59:30.560 回答