Jump to content

    
Sign in to follow this  
ViKo

Битовые поля, кто ж вас выдумал?

Recommended Posts

3 минуты назад, jcxz сказал:

Спасёт голова программиста. Которая должна иметься в наличии. Программист, обладающий ею, будет подключать .h-файлы только в те .c(pp), где они реально нужны.

Так, не спасёт. Если .h нужен в нескольких .c, и в нём определена inline функция, она же, получается, будет неоднократно определена.
Или, всё-таки, содержимое .h файла будет использоваться однократно не только в каждом файле, но и во всех?

9 минут назад, jcxz сказал:

возможность многопоточной компиляции

Не важно, много потоков "параллельно" или "последовательно". Суть не меняется, если каждая единица трансляции ничего не знает о соседней/следующей.

Share this post


Link to post
Share on other sites
Quote

Sometimes the inline and extern keywords are used together. Consider:


extern inline void serial_init (void)
{
   ...  
}  

When an inline function is not static, then the compiler must assume that there may be calls from other source files; since a global symbol can be defined only once in any program, the function must not be defined in the other source files, so the calls therein cannot be integrated. Therefore, a non-static inline function is always compiled on its own in the usual fashion.

If you specify both inline and extern in the function definition, then the definition is used only for inlining. In no case is the function compiled on its own, not even if you refer to its address explicitly. Such an address becomes an external reference, as if you had only declared the function, and had not defined it.

This combination of inline and extern has almost the effect of a macro. The way to use it is to put a function definition in a header file with these keywords, and put another copy of the definition (lacking inline and extern) in a library file. The definition in the header file will cause most calls to the function to be inlined. If any uses of the function remain, they will refer to the single copy in the library.

 

Share this post


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

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

Я надеюсь, это был лютый троллинг:biggrin:

Share this post


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

Видимо вас еще не тролили битовые поля. :)

Ну приведите пример, всякое бывает. Но за свою практику что что, так битовые поля мне еще мозг не окучивали:bb:

Share this post


Link to post
Share on other sites

Ну например если их использовать для регистров, то при некоторых условиях, gcc к примеру может использовать байтовые операции вместо 32битных или игнорировать volatile, что для регистров порой приводит к ошибкам шины. Это то как мне в ногу стреляло. Но вообще там все детали реализации - имплементейшн дефайнд. Что при необходимости писать предсказуемый по результату код является миной замедленного действия.

Share this post


Link to post
Share on other sites
3 hours ago, Kabdim said:

то при некоторых условиях, gcc к примеру может

Так это, наверно, проблема gcc...

3 hours ago, Kabdim said:

игнорировать volatile,

Так это нарушение стандарта...

Всё сказанное к битовым полям ни в коей мере не относится. Но GCC использоваться всё меньше хочется)

Share this post


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

Ну например если их использовать для регистров, то при некоторых условиях, gcc к примеру может использовать байтовые операции вместо 32битных или игнорировать volatile, что для регистров порой приводит к ошибкам шины. Это то как мне в ногу стреляло. Но вообще там все детали реализации - имплементейшн дефайнд. Что при необходимости писать предсказуемый по результату код является миной замедленного действия.

Я тут на днях как раз разбирался с USB-device на XMC4xxx. Разбирался по драйверу нижнего уровня IO (xmc_usbd.c) из "XMClib v2.1.6 - XMC Peripheral Driver Library".

Так там вся работа с портами IO зачем-то построена на битовых полях (регистры USB-контроллера определены структурами с битовыми полями). Остаётся только посочувствовать тем несчастным, не заглядывающим внутрь используемых "либ", которые захотят скомпилить сей драйвер с помощью GCC.  :biggrin:

Share this post


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

то при некоторых условиях, gcc к примеру может использовать байтовые операции вместо 32битных или игнорировать volatile

Хотелось бы увидеть конкретный пример. Довольно часто работаю с регистрами, описанными как битовые поля и ни разу с подобным поведением gcc не сталкивался. Может я что-то делаю не так, или может что-то не так с вашими примерами?

4 часа назад, jcxz сказал:

регистры USB-контроллера определены структурами с битовыми полями

А я их определяю как union из безымянной структуры с битовыми полями и целого соответствующего размера. Работаю и с полями и с битовыми масками - где как удобнее.

Share this post


Link to post
Share on other sites
On 2/18/2020 at 10:39 AM, haker_fox said:

Тогда уже так в 2020 году) "Ашники" можно получить автоматически из SVD-файлов.

Честно?

Говнокод. Неправильное использование UML нотаций. Хабр. Количество WTF per minute зашкаливает.

Что-то хорошее там есть? Просто за первые две минуты у меня пошла кровь из глаз, и я больше не хочу иметь зрение.

13 hours ago, Arlleex said:

Да и pragma once будет работать ~также как #ifndef-#define-#endif, а время сборки проекта будет зависеть от того, было ли изменено содержимое этого .h-ника. И если было, разумеется, все модули, где этот .h подключался, будут перекомпилированы. 

Ошибаетесь.

Например, (кстати, это реальный пример):

Есть библиотека, которая присутствует несколько раз. Первый раз - в вашей поставке ОС. Например, при установке компилятора. Второй раз - кто-то, кто пользовался другим компилятором включил этот заголовочный файл в проект.
ifndef-define-endif в них одинаковый, и будет подключён тот файл, который найдётся первым.
pragma once включит оба файла. Кстати, даже если один из файлов - это символьная ссылка (ярлык, если не знакомы с юниксами), указывающая на оригинальный файл.
то есть, прагма решает одни проблемы, которые создаются ifndef-define-endif'ом, но создаёт другие, которые в принципе не возникают при директивах условной компиляции

Edited by one_eight_seven

Share this post


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

Что-то хорошее там есть? Просто за первые две минуты у меня пошла кровь из глаз, и я больше не хочу иметь зрение.

Там еще и дичь про LDREX/STREX написана. Я бы вообще дал этому дьяволу по лицу. Именно за вот это:

Quote

Как я уже говорил, я обучаю студентов разработке ПО для измерительных устройств. Работа в университете — это мое хобби, основное место работы с университетом не связано, но тоже коррелирует с разработкой встроенного софта, в том числе и для высоко-надежных систем.

 

Share this post


Link to post
Share on other sites
3 hours ago, one_eight_seven said:

Говнокод. Неправильное использование UML нотаций. Хабр.

Расшифруйте, пожалуйста. Похоже больше на зависть пока. Честно.

3 hours ago, one_eight_seven said:

Количество WTF per minute зашкаливает.

А какие критерии оценки? Общеизвестно, что всё новое и непривычное воспринимается в штыки.

3 hours ago, Rst7 said:

Я бы вообще дал этому дьяволу по лицу.

А что вас, собственно говоря, не устраивает? Я лично для себя увидел много нового, что могу применить в своей работе. Не всё, естественно. Но уважаемый @lamerok вообще-то является членом нашего клуба с давних времён. И как-то некрасиво говорить в адрес своего коллеги такие вещи.

3 hours ago, Rst7 said:

Там еще и дичь про LDREX/STREX написана.

Напишите автору в личку. Пусть поправит. Это будет лучше, чем применять рукоприкладство.

Share this post


Link to post
Share on other sites
6 hours ago, haker_fox said:

Но уважаемый @lamerok вообще-то является членом нашего клуба с давних времён. И как-то некрасиво говорить в адрес своего коллеги такие вещи.

Очень жаль, что участник нашего форума оказался таким провальным. Если бы он это все высказывал тут в дискуссиях - то пофиг. А вот то, что он это несет в неокрепшие умы (я же не просто так цитату принес) - вот за это нет прощения.

Share this post


Link to post
Share on other sites
8 minutes ago, Rst7 said:

вот за это нет прощения.

Я думаю вы слишком строги. Найдите преподавателя, который не вносит ошибок в свой материал. Да и преподавание - дело неблагодарное нынче. Те, кто занимается со студентами, уже могут заслуживать, чтобы им сказали "Спасибо". Сам проработал в сфере образование около 10 лет.

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.

Sign in to follow this