Следует ли использовать битовые поля для отображения поступающих последовательных данных?
Нет.Битовые поля во многом зависят от реализации, что делает их использование кошмарным.
Будут ли данные1 всегда представлять правильное значение, как и ожидалось, независимо от порядка байтов.
Да, но это потому, что uint8_t
- это наименьшая возможная адресуемая единица: байт.Для больших типов данных вам нужно позаботиться о байтовом порядке байтов.
Могут ли данные2 и зарезервированы быть неправильными, с данными2, представляющими старшие 4 бита вместо младших 4 бит?
Да.Они также могут быть на разных байтах.Кроме того, компилятор не должен поддерживать uint8_t
для битовых полей, даже если он будет поддерживать тип иначе.
Зависит ли порядковый номер бита (как правило) от порядкового номера байта или они могут отличатьсяполностью?
Наименьший значащий бит всегда будет в младшем значащем байте, но невозможно определить в C , где в байте будет бит.
Операторы сдвига битов дают надежную абстракцию порядка, который достаточно хорош: для типа данных uint8_t
(1u << 0)
всегда наименее значимый и (1u << 7)
старший бит для всех компиляторов и для всех архитектур.
С другой стороны, битовые поля настолько плохо определены, что вы не можете определить порядок битов по порядку определенных вами полей.
Является ли битовая последовательность, определяемаяаппаратное обеспечение или компилятор?
Компилятор определяет, как типы данных отображаются на реальные биты, но аппаратное обеспечение сильно влияет на него.Для битовых полей два разных компилятора для одного и того же оборудования могут размещать поля в разном порядке.
Есть ли простой способ определить в компиляторе, какой путь есть, и зарезервировать битовые полязаписи при необходимости?
Не совсем.Это зависит от вашего компилятора, как это сделать, если это вообще возможно.
Хотя битовые поля - это самый лучший способ, с точки зрения кода, для отображения входящих данных, я думаю, мне просто интересноесли гораздо безопаснее просто отказаться от них и использовать что-то вроде:
Определенно отказаться от битовых полей, но я бы также рекомендовал вообще отказаться от структур для этой цели, потому что:
Вам необходимо использовать расширения компилятора или ручную работу для обработки порядка байтов.
Вам необходимо использовать расширения компилятора, чтобы отключить заполнение, чтобы избежать пробелов из-за ограничений выравнивания.Это влияет на производительность доступа к элементам в некоторых системах.
Вы не можете иметь переменную ширину или дополнительные поля.
Очень просто иметь строгие нарушения псевдонимовесли вы не знаете об этих проблемах.Если вы определяете байтовый массив для фрейма данных и приводите его к указателю на структуру, а затем разыменовываете его, во многих случаях у вас возникают проблемы.
Вместо этого я рекомендую сделать это вручную.Определите байтовый массив, а затем запишите каждое поле в него вручную, разбив их на части, используя сдвиг битов и маскировку при необходимости.Вы можете написать простые многоразовые функции преобразования для основных типов данных.