Я не понимаю поведение этого кода C (объединение с 2 структурами битового поля, словом и байтовым массивом) - PullRequest
0 голосов
/ 27 марта 2019

У меня есть следующий фрагмент кода на C:

typedef union _REG_CiFIFOCON {
    struct {
        uint32_t RxNotEmptyIE : 1;
        uint32_t RxHalfFullIE : 1;
        uint32_t RxFullIE : 1;
        uint32_t RxOverFlowIE : 1;
        uint32_t unimplemented1 : 1;
        uint32_t RxTimeStampEnable : 1;
        uint32_t unimplemented2 : 1;
        uint32_t TxEnable : 1;
        uint32_t UINC : 1;
        uint32_t unimplemented3 : 1;
        uint32_t FRESET : 1;
        uint32_t unimplemented4 : 13;
        uint32_t FifoSize : 5;
        uint32_t PayLoadSize : 3;
    } rxBF;

    struct {
        uint32_t TxNotFullIE : 1;
        uint32_t TxHalfFullIE : 1;
        uint32_t TxEmptyIE : 1;
        uint32_t unimplemented1 : 1;
        uint32_t TxAttemptIE : 1;
        uint32_t unimplemented2 : 1;
        uint32_t RTREnable : 1;
        uint32_t TxEnable : 1;
        uint32_t UINC : 1;
        uint32_t TxRequest : 1;
        uint32_t FRESET : 1;
        uint32_t unimplemented3 : 5;
        uint32_t TxPriority : 5;
        uint32_t TxAttempts : 2;
        uint32_t unimplemented4 : 1;
        uint32_t FifoSize : 5;
        uint32_t PayLoadSize : 3;
    } txBF;
    uint32_t word;
    uint8_t byte[4];
} REG_CiFIFOCON;

Обе структуры 32-битные, поэтому это переменная слова и байтовый массив (так как он состоит из 4 байтов. 4x8 = 32биты).

Моя проблема: я не понимаю поведение этого союза.Я знаю, как получить доступ к битам в каждой структуре, а также к слову и массиву, но как они связаны?Я знаю, что если бы была только 1 структура и слово, установка слова в какое-то значение изменила бы соответственно битовые поля (и наоборот), но я не знаю, что происходит в этом случае.

Спасибои хорошего дня!

1 Ответ

1 голос
/ 27 марта 2019

У вас есть 4 типа в одном союзе.Все они используют одну и ту же память.

Неважно, какую из них вы меняете - это повлияет на другие.

Размер вашего типа составляет 32 байта - который вваш случай также размер каждого типа внутри него.В противном случае - это будет размер самого большого типа внутри.

...