首页 > 解决方案 > 访问嵌套结构

问题描述

我有一个嵌套结构,如下所示:

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结构不同的属性,那么为什么在这种情况下我们需要结构呢?

标签: cdata-structuresembeddedstm32

解决方案


self->state并且self->regs是 2 个不同的指针。代码可能会初始化这些字段以指向相同结构的部分。


推荐阅读