Каково практическое использование битовых полей в языке C?

Я читаю учебник по C (на французском языке), и в абзаце они говорят о битовых полях, и они дали следующий пример без особых объяснений:

struct register {
   unsigned int mask : 3;
   signed int privilege : 6;
   unsigned int : 6; /* not used */
   unsigned int ov : 1;
};
  1. Каков результат этого определения на уровне памяти?

  2. Есть ли педагогическая причина назвать структуру в примере register (это напоминает мне электронику)?

  3. Зачем кому-то объявлять член, подобный тому, который прокомментирован как «не используется» в примере?

  4. Каковы преимущества этой структуры на практике?

  5. Почему битовое поле не имеет адреса? Соответствует ли это спецификации в реестре?


person loulou    schedule 15.08.2013    source источник
comment
Они не так полезны на ПК, как в MCU.   -  person Eddy_Em    schedule 15.08.2013
comment
Спасибо за эту информацию. Можешь мне сказать почему?   -  person loulou    schedule 15.08.2013
comment
Обычно у вас много памяти на вашем ПК. Также операции с битовыми флагами выполняются медленнее, чем операции с байтовыми флагами. Вот почему на ПК вы обычно используете байтовые (uint8_t, uint16_t, uint32_t или даже uint64_t) флаги. Но процессоры имеют очень мало памяти. Также многие из них могут работать с одиночными битами. Вот почему на ЦП вы обычно делаете битовые флаги.   -  person Eddy_Em    schedule 15.08.2013


Ответы (2)


Это особенно полезно в оборудовании, где вы хотите создать регистр модуля.

Теперь в Register есть много bit-fields, которые могут быть разного размера в bits. Итак, вы создаете структуру для представления Register и bit-fields. В основном аппаратные регистры — это структуры, в которых хранится информация о модуле.

Например, для USB-модуля регистры внутри USB-оборудования хранят информацию о состоянии USB-устройства и многое другое.

Ограничивая длину элементов данных внутри struct до bits вместо резервирования uints(or any other primitive data types) для bit-fields, поскольку он занимает очень меньше памяти.

Кроме того, фиктивное объявление unsigned int : 6; используется для заполнения структуры, чтобы объекты структуры и доступы были word aligned в соответствии с архитектурой машины. Следовательно, доступ к объектам регистра не требует больше времени, если доступ выровнен по границе слова процессора. По сути, если слово, полуслово или байт выровнены по адресу, который кратен размеру слова процессора, то они доступны очень эффективно за один раз.

Например, в вашем случае Register равно 16-bits и имеет 3 битовых поля: маска, привилегия и ov. В то время как остальные 6-bits зарезервированы для будущего использования. Вот так выглядит Register,

bit-position     15  14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
                ---------------------------------------
                |ov |    reserved    | privilege |mask|
                ---------------------------------------

Таким образом, сделав структуру размером 16 бит, объекты этой структуры могут быть легко доступны на процессоре с 8,16,32 .... битными АЛУ.

person Uchia Itachi    schedule 15.08.2013
comment
Довольно хорошее объяснение, :), я поднимаю палец вверх! спасибо за это усилие! Однако у меня есть несколько вопросов: 1/ Я действительно не понял, что вы имели в виду под словом «выровнено». 2/ Я ожидал, что 16-битный регистр может быть доступен только для 8- или 16-битного ALU,... как вообще возможно 32-битное? 3/Я сделал редактирование и добавил вопрос 5/. Заранее большое спасибо. - person loulou; 15.08.2013
comment
Это возможно и для 32 bit, потому что 16-bit — это полуслово в 32-битной архитектуре. Таким образом, при доступе, если эти 16-bit данные присутствуют в младших 2 байтах или более высоких 2 байтах в 32bit слове, происходит следующее: доступ ко всему слову (32-bit) и нежелательные байты либо выше 2-bytes, либо ниже 2-bytes отсекаются. выключен, и правильные данные возвращаются обратно. Для получения дополнительной информации о выравнивании слов перейдите по этой ссылке: ibm.com/developerworks/ библиотека/pa-dalign - person Uchia Itachi; 15.08.2013
comment
Очень красивая ссылка! Большое спасибо! - person loulou; 15.08.2013
comment
Битовые поля были бы хороши для таких вещей, как аппаратные регистры, если бы их поведение было на самом деле осмысленно классифицировано. Как бы то ни было, я не совсем уверен, что получается, если сказать гораздо больше, чем реализации делают все, что хотят, с битовыми полями существующей формы, и определить новый синтаксис для явного псевдонима идентификатора с переменной или полем в той же области, который будет занимать определенный битовый диапазон в последнем [например. в структуре порта ввода-вывода PIN3_OPTS := OPTREG0:12:4; заставит PIN3_OPTS ссылаться на биты 12-15 из OPTREG0]. Код, который работает на конкретном компиляторе... - person supercat; 16.08.2013
comment
... будет продолжать делать это, и будущий код, написанный с использованием нового стандарта, будет переносимым среди компиляторов, которые ему следуют. - person supercat; 16.08.2013

Одним из примеров того, где можно использовать структуру, подобную той, что указана в вопросе, является эмуляция битов аппаратного регистра (что, судя по названию, является вероятным использованием этой структуры).

Для многих небольших и встраиваемых систем могут существовать аппаратные регистры, напрямую адресуемые в памяти, поэтому подобные структуры можно использовать для доступа к битам непосредственно в этих регистрах.

person Some programmer dude    schedule 15.08.2013