Доступ к вложенной структуре - PullRequest
2 голосов
/ 01 мая 2019

У меня есть вложенная структура, как показано ниже:

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, тогда зачем нам структуры в этом случае?

Ответы [ 2 ]

1 голос
/ 01 мая 2019

self->state и self->regs - это два разных указателя. Код, вероятно, инициализирует эти поля, чтобы указывать на части одной и той же структуры.

0 голосов
/ 01 мая 2019

Вы пытаетесь заново изобрести колесо, и вы сделали это неправильно.

  1. вы определили структуры с аппаратными регистрами.
  2. Ваши объявления не являются "общими", так как многие семейства имеют разные регистры.Например, F3xx имеет дополнительный регистр BRR.
  3. Порядок регистров неправильный.
  4. Некоторые периферийные устройства имеют неиспользуемое пространство между регистрами.Например,
     typedef struct
    {
      __IO uint32_t ACR;          /*!< FLASH access control register,              Address offset: 0x00 */
      __IO uint32_t KEYR;         /*!< FLASH key register,                         Address offset: 0x04 */
      __IO uint32_t OPTKEYR;      /*!< FLASH option key register,                  Address offset: 0x08 */
      __IO uint32_t SR;           /*!< FLASH status register,                      Address offset: 0x0C */
      __IO uint32_t CR;           /*!< FLASH control register,                     Address offset: 0x10 */
      __IO uint32_t AR;           /*!< FLASH address register,                     Address offset: 0x14 */
      uint32_t      RESERVED;     /*!< Reserved, 0x18                                                   */
      __IO uint32_t OBR;          /*!< FLASH Option byte register,                 Address offset: 0x1C */
      __IO uint32_t WRPR;         /*!< FLASH Write register,                       Address offset: 0x20 */

    } FLASH_TypeDef;

Если ваша идея - сохранить регистры в ОЗУ, достаточно:

GPIO_TypeDef savedGPIOs[NUMBER_OF_GPIOS];

и

savedGPIOs[0] = *GPIOA;

но я не вижу в этом особого смысла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...