Перейти к содержанию
    

Массив полей в структуре

Для работы с битами переменных способом bit-band в Cortex-M3 можно использовать структуру, где биты описаны в виде однобитовых полей. Например, так:

typedef struct {
  int b0: 1;
  int b1: 1;
  int b2: 1;
  int b3: 1;
  ...
} bb_t __attribute__((bitband));

Можно ли заменить описание этих полей массивом внутри структуры, чтобы не набирать вручную все 32 бита?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Нет. Массив битовых полей в Си создать нельзя. Внутри структыры прийдётся забивать их все вручную. Не так уж и долго.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В си массив можно организовать из типа, размер которого удовлетворяет условию (sizeof(some_t)>=sizeof(char))

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

прийдётся забивать их все вручную.

Или написать генератор кода.

Лучше день потерять, зато потом... ©

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

"упростил" :)

typedef struct {
  int b00:1, b01:1, b02:1, b03:1, b04:1, b05:1, b06:1, b07:1;
  int b08:1, b09:1, b10:1, b11:1, b12:1, b13:1, b14:1, b15:1;
  int b16:1, b17:1, b18:1, b19:1, b20:1, b21:1, b22:1, b23:1;
  int b24:1, b25:1, b26:1, b27:1, b28:1, b29:1, b30:1, b31:1;
} b_t __attribute__((bitband));

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

"упростил" :)

Так сделайте union c лонгом и инициализируйте так

x.all = 0xFFFF;

а обращайтесь так

x.bits.b00 = x.bits.b01;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Так сделайте union c лонгом...

Нельзя. В DUI0205I_rvct_comp_user_guide.pdf для bit-band написано:

The following restrictions apply:

• Bit-banding can only be used with struct types. Any union type or other

aggregate type with a union as a member cannot be bit-banded.

• Members of structs cannot be bit-banded individually.

• Bit-banded accesses are generated only for single-bit bitfields.

• Bit-banded accesses are not generated for const objects, pointers, and local

objects.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Нельзя. В DUI0205I_rvct_comp_user_guide.pdf

Я проморгал то, что разговор идёт в контексте Cortex ядра с его 4Гб адресным пространством.

Такое ограничение неудивительно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Такое ограничение неудивительно.

А мне так не очень понятно, чем могло помешать объединение битов и int для bit-band операций.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А мне так не очень понятно, чем могло помешать объединение битов и int для bit-band операций.
Разные адреса начала структуры для обычных и bit-операций?

Видать, пока не побороли это в компиляторе - может, просто не решили как.

Адрес long-поля в union должен оказаться в обычной области, а адрес всей структуры с битами где?

Попробуйте выдать на имеющуюся индикацию адрес объекта с типом своей структуры.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Можно ли заменить описание этих полей массивом внутри структуры, чтобы не набирать вручную все 32 бита?

А что мешает объявить массив DWORD'ов в bit-bang регионе?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А что мешает объявить массив DWORD'ов в bit-bang регионе?

Компилятор Keil :)

объявить-то можно, но обращаться к ним методом bit-band компилятор не будет. Только к однобитовым полям в структуре. Которая, кстати, не обязательно должна состоять из однобитовых полей, можно иметь и любые другие типы, и int32_t, естественно. К остальным членам структуры будет обычное обращение по адресам bit-band региона. А к однобитовым - по адресам из bit-band alias региона.

Скорее всего, такое ограничение введено, чтобы ограничить доступ к переменной единственно возможным способом. Видимо, так компилятору "легче жить".

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

К остальным членам структуры будет обычное обращение по адресам bit-band региона. А к однобитовым - по адресам из bit-band alias региона.

...

Видимо, так компилятору "легче жить".

Видимо. Так как если доступ и так уже любой, обычная работа с другими полями есть, то достаточно сделать атрибут для размещения в определёной области памяти распространяющимся на любой охватывающий объект и всё.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Мои эксперименты показали, что достаточно задать __attribute__((bitband)), и никакого конкретного размещения с помощью __attribute__((at())) не требуется.

Ох, и наставили скобок разработчики...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...