У меня есть вложенная структура, как показано ниже:
struct stm32fxxx_state {
struct stm32fxxx_gpio_state {
union {
uint32_t regs[10];
struct {
uint32_t MODER;
uint32_t OTYPER;
uint32_t OSPEEDR;
uint32_t PUPDR;
uint32_t IDR;
uint32_t ODR;
uint32_t BSRR;
uint32_t LCKR;
uint32_t AFRL;
uint32_t AFRH;
};
};
} GPIO[STM32FXXX_NUM_GPIOS];
struct stm32fxxx_spi_regs {
union {
uint16_t regs[9];
struct {
uint16_t CR1;
uint16_t CR2;
uint16_t SR;
uint16_t DR;
uint16_t CRCPR;
uint16_t RXCRCR;
uint16_t TXCRCR;
uint16_t I2SCFGR;
uint16_t I2SPR;
};
};
} SPI[STM32FXXX_NUM_SPIS];
uint32_t PWR_CR;
uint32_t PWR_CSR;
};
Эта структура была создана в функции main
в структуре, как показано ниже:
struct stm32fxxx_gpio {
SysBusDevice parent;
MemoryRegion mmio;
qemu_irq irq;
uint8_t port_id, _port_id;
struct stm32fxxx_state *state;
struct stm32fxxx_gpio_state *gregs;
};
Где-то далее в коде структура доступна следующим образом:
uint32_t valx = val ^ self->state->GPIO[self->port_id].MODER;
и
uint32_t valx = val ^ self->gregs->OTYPER;
Где self
объявлено как struct stm32fxxx_gpio *self
Мой вопрос: чем self->state
отличается от self->gregs
? Как эти два доступа к структуре отличаются.
Код скомпилирован и работает нормально. Я хочу знать, как эти два доступа возвращают разные данные? Или какая польза от таких вложенных структур?
Насколько я понимаю, state
также содержит атрибуты gpio_state
. Но структура state
не имеет атрибутов, отличных от структуры gpio_state
, тогда зачем нам структуры в этом случае?