В настоящее время я пишу код для микроконтроллера STM32 для работы с периферийным устройством, чтобы упростить доступ к отдельным битам, я использовал структуру с разбивкой по битам следующим образом:
typedef struct
{
uint8_t ch3_unreadconv : 1; // 0
uint8_t ch2_unreadconv : 1; // 1
uint8_t ch1_unreadconv : 1; // 2
uint8_t ch0_unreadconv : 1; // 3
uint8_t not_used_01 : 2; // 4-5
uint8_t drdy : 1; // 6
uint8_t not_used_02 : 2; // 7-8
uint8_t err_alw : 1; // 9
uint8_t err_ahw : 1; // 10
uint8_t err_wd : 1; // 11
uint8_t not_used_03 : 2; // 12-13
uint8_t err_chan : 2; // 14-15
} fdc_status_reg_t;
fdc_status_reg_t statusReg;
// Assign value 13 to the register.
*((uint16_t*) &statusReg) = 0xD;
Но когда я делаю sizeof(statusReg);
Я получаю 3
в качестве ответа. Когда я присваиваю значения всему регистру с помощью кода, биты устанавливаются правильно, за исключением последних 2 битов, т. Е. err_chan
. Я попробовал то же самое на G CC и получил аналогичные результаты, чтобы проверить, является ли проблема, связанная со спецификацией STM c. После дальнейшего изучения я обнаружил, что установка 7-го и 8-го битов на два отдельных бита, похоже, решает проблему, т. Е.
typedef struct
{
uint8_t ch3_unreadconv : 1; // 0
uint8_t ch2_unreadconv : 1; // 1
uint8_t ch1_unreadconv : 1; // 2
uint8_t ch0_unreadconv : 1; // 3
uint8_t not_used_01 : 2; // 4-5
uint8_t drdy : 1; // 6
uint8_t not_used_02 : 1; // 7
uint8_t not_used_02_01 : 1; // 8
uint8_t err_alw : 1; // 9
uint8_t err_ahw : 1; // 10
uint8_t err_wd : 1; // 11
uint8_t not_used_03 : 2; // 12-13
uint8_t err_chan : 2; // 14-15
} fdc_status_reg_t;
Дает правильный вывод для sizeof
как 2 байта. А также дает прогнозируемое поведение для назначения. Это (для меня) выглядит как проблема выравнивания / выравнивания памяти, но я не понимаю, как, я был в состоянии воссоздать это всякий раз, когда uint8_t
использовался через 7-й и 8-й бит, но отлично работает, когда используется uint16_t
через 7-8. Пожалуйста, посоветуйте, в чем проблема, и возможно, лучше обойти эту проблему, чем разделять биты на 7-й бит. Заранее спасибо.