Jump to content

    
ViKo

Битовые поля

Recommended Posts

8 часов назад, ViKo сказал:

Я правильно понимаю, что такое объединение делать не стоит, потому что расположение битовых полей не гарантируется?

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

Share this post


Link to post
Share on other sites
8 hours ago, artemkad said:

расположение бит однозначно

Выходит, что нет. Тыц. Впрочем, там ссылка на тот же пункт, что привёл уважаемый @Arlleex. К слову лишь скажу, что использовал битовые поля, и проблем пока не было. При этом использовались IAR и GCC. Видимо, всё-таки логичнее делать сверху младшие биты, а внизу - старшие. Так сказать неформальный стандарт. Но на то он и неформальный, что ничего не гарантирует. Такие поля использовались у меня на Cortex-M4F (IAR) и AVR8 (GCC). Данные между микроконтроллерами передавались через последовательный интерфейс другу другу.

Share this post


Link to post
Share on other sites
58 minutes ago, haker_fox said:

Выходит, что нет. Тыц. Впрочем, там ссылка на тот же пункт, что привёл уважаемый @Arlleex. К слову лишь скажу, что использовал битовые поля, и проблем пока не было. При этом использовались IAR и GCC. Видимо, всё-таки логичнее делать сверху младшие биты, а внизу - старшие. Так сказать неформальный стандарт. Но на то он и неформальный, что ничего не гарантирует. Такие поля использовались у меня на Cortex-M4F (IAR) и AVR8 (GCC). Данные между микроконтроллерами передавались через последовательный интерфейс другу другу.

Пользуйтесь компилятором, а не ерундой всякой, и получите, то что:

Quote

Yeah, the GCC, for instance, specifically notes that bitfields are arranged as per the ABI, not the implementation

Голосуйте, так сказать, рублём за нормальные решения.

Edited by one_eight_seven

Share this post


Link to post
Share on other sites
7 minutes ago, one_eight_seven said:

Пользуйтесь компилятором, а не ерундой всякой, и получите, то что:

Потрудитесь объяснить, что Вы имеете в виду.

7 minutes ago, one_eight_seven said:

Голосуйте, так сказать, рублём за нормальные решения.

И этот Ваш посыл неясен.

З.Ы. Компиляторы не я выбирал. Проекты мне передали. С AVR8 предпочитаю не связываться.

Share this post


Link to post
Share on other sites

Хорошо. GCC явно заялвяют, что в этом плане они ориентируются на ABI, а не дают решения по желанию левой пятки. Вас устравивает, что ваши структуры и битфилды будут отвечать ABI? Если да - то вам по пути с GCC и другими компиляторами, которые уважают ABI.

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

Edited by one_eight_seven

Share this post


Link to post
Share on other sites
21 minutes ago, one_eight_seven said:

Хорошо. GCC явно заялвяют, что в этом плане они ориентируются на ABI, а не дают решения по желанию левой пятки.

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

Share this post


Link to post
Share on other sites
3 часа назад, one_eight_seven сказал:

Пользуйтесь компилятором, а не ерундой всякой, и получите, то что...

Зависит все от того, что и под что пишется. Вот в протокольно-зависимых вещах, как я считаю, желательно писать без бит-полей (если планируется отдать исходники потом другому челу, который будет ими пользоваться на другой машине/архитектуре/под другими тулзами и т.д.). А вот какие-то флажки локальной бизнес-логики или логики драйвера упаковать - вполне себе нормально. Да даже в тех самых протокольных исходниках - думаю, можно, если ты стыкуешься сам с собой в плане разработки ПО.

На прошлой работе коллеги пишут под MIPS, так там и big endian, и порядок битовых полей от старшего к младшему. Ну и о чем речь?

Если известно на веки веков, что будешь пользоваться одном набором тулзов (например, GCC), то достаточно один раз "проверить" на деле, как в нем биты нумеруются и забыть. Потому что писать "универсальные" исходники под все что можно (и под все implementation-defined behavior фичи Си/компилятора) почти нереально, да и не нужно. А таких implementation-defined behavior в язкыке полно: я еще пользуюсь сдвигом вправо >> целых знаковых, полагая, что знак будет расширен (удобно для получения масок 0/-1, например), однако согласно стандарту Си, реализация определяет, какой сдвиг будет выполнен - арифметический или логический. Так что в ту же копилку - проверяю на своем компиляторе и дальше не парюсь.

Share this post


Link to post
Share on other sites
54 минуты назад, Arlleex сказал:

я еще пользуюсь сдвигом вправо >> целых знаковых, полагая, что знак будет расширен (удобно для получения масок 0/-1, например), однако согласно стандарту Си, реализация определяет, какой сдвиг будет выполнен - арифметический или логический.

Разве?  :scratch_one-s_head:

Share this post


Link to post
Share on other sites
3 часа назад, jcxz сказал:

Разве?

К сожалению, да (п. 6.5.7 Bitwise shift operators)

Цитата

5 The result of E1 >> E2 is E1 right-shifted E2 bit positions. If E1 has an unsigned type or if E1 has a signed type and a nonnegative value, the value of the result is the integral part of the quotient of E1 / 2E2. If E1 has a signed type and a negative value, the resulting value is implementation-defined.

P.S. О, даже без уточнения насчет арифметического/логического. Но, думаю, в данном случае другого не дано.

Для ARM Compiler 6

Цитата

The results of some bitwise operations on signed integers (6.5).
In the bitwise right shift E1 >> E2, if E1 has a signed type and a negative value, the value of the result is the integral part of the quotient of E1 / 2^E2, except that shifting the value –1 yields result –1.

Share this post


Link to post
Share on other sites

Я пользуюсь Keil uVision, поэтому все это описано в документации на tools: ARM Compiler Version 6.16 Reference Guide.
У ARM есть их стандарт AAPCS, в котором тоже их требования к работе с битовыми полями четко описаны. Полистайте.

Share this post


Link to post
Share on other sites

Чудики. Есть конкретный нюанс. Это архитектура "Интел"/"Моторолла" LSB & MSB.  это то как 32бита int располагается в памяти. Посему сиё не сильно переносимо. И если это битовое чудо наложить на int  будут "чудеса" (ну это если не знать про lsb & msb).

Share this post


Link to post
Share on other sites
3 часа назад, Alex77 сказал:

это то как 32бита int располагается в памяти.

Ну прям откровение... Может потому топикстартер и не пользовался int-ом от слова совсем?

Share this post


Link to post
Share on other sites
9 часов назад, Alex77 сказал:

это то как 32бита int располагается в памяти. Посему сиё не сильно переносимо. И если это битовое чудо наложить на int  будут "чудеса" (ну это если не знать про lsb & msb).

В теме конкретный вопрос про объединение битовых полей с байтом - читайте первое сообщение. При чём здесь int и lsb/msb?

Share this post


Link to post
Share on other sites

Вопрос был про то, с какого конца начинаются битовые поля, хоть в в байте, хоть в слове. Я уже набрал было нужное мне объединение (с использованием безымянных структур и объединений), скомпилировал, порадовался. А потом вспомнил... И переделал на битовые маски. Теперь это пройденный виток. ;-) 

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.