Программирование ARM IAR, битовые поля (bitfields) Sat, July 22 2017  

Поделиться

нашли опечатку?

Пожалуйста, сообщите об этом - просто выделите ошибочное слово или фразу и нажмите Shift Enter.


IAR, битовые поля (bitfields) Печать
Добавил(а) microsin   

В стандарте ISO/ANSI C типы int, signed int, и unsigned int могут использоваться как базовый тип для целых битовых полей (integer bitfields).

Реализация битовых полей, заданных через int та же самая, как и для signed int или unsigned int. В компиляторе IAR C/C++ для ARM, битовые поля, заданные через int, интерпретируются как заданные через unsigned int. Кроме того, любой тип целого числа может быть использован в качестве основного типа, когда разрешены расширения языка. Битовые поля в выражениях будут иметь тот же тип данных, что и базовый целый тип.

Компилятор размещает битовые поля в носителе, базируясь на используемом порядке байт (имеется в виду режим little-endian или big-endian). Если по умолчанию работает порядок байт little-endian, и компилятор размещает поля бит от младшего значащего бита (least significant) до старшего (most significant) в байтах переменной контейнера. Если по умолчанию режим big-endian, то компилятор раскладывает битовые поля в контейнере от старших бит до младших. Битовое поле помещается назначенное на последнее доступное место в контейнере, так чтобы все поле уместилось в этот контейнер целиком. Это означает, что контейнер битового поля может накладываться на другие поля структуры, пока порядок полей в структуре сохраняется. Например, в режиме big-endian имеется структура:

struct example
{
   char a;
   short b : 10;
   int c : 6;
};

Здесь первая декларация создаст unsigned char, который разместится в битах от 24
до 31. Вторая декларация создаст поле signed short integer размером 10 бит. Это поле займет биты от 15 до 6 включительно, поскольку он не поместится в оставшиеся 8 бит первого контейнера short integer. Последнее поле будет размещено в биты от 0 до 5. Получится 32-битное значение, и структура будет размещена в памяти следующим образом:

IAR-bitfields-example-big-endian-mode

Размещение битовых полей структуры в памяти, режим big-endian.

Используйте директиву #pragma bitfields=disjoint_types, чтобы принудительно разъединить контейнеры битовых полей, или другими словами, сделать так, чтобы контейнеры не перекрывались. В этом случае структура вышеуказанного примера будет выглядеть так:

IAR-bitfields-example-big-endian-mode-forced-disjoint

Размещение битовых полей структуры в памяти, режим big-endian, применена директива disjoint_types.

Используйте директиву #pragma bitfields=reversed_disjoint_types для размещения битовых полей от наименее значащего бита (least significant bit) к наиболее значащему (most significant bit) в неперекрывающихся контейнерах.

 

Добавить комментарий


Защитный код
Обновить

Top of Page