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

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

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

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

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

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

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

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

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


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

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.

 

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


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

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

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


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

6 минут назад, Kabdim сказал:

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

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

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


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

2 минуты назад, Kabdim сказал:

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

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

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


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

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

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


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

3 hours ago, Kabdim said:

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

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

3 hours ago, Kabdim said:

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

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

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

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


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

5 часов назад, Kabdim сказал:

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

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

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

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


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

9 часов назад, Kabdim сказал:

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

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

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

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

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

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


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

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'ом, но создаёт другие, которые в принципе не возникают при директивах условной компиляции

Изменено пользователем one_eight_seven

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


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

25 minutes ago, one_eight_seven said:

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

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

Quote

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

 

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


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

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 написана.

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

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


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

6 hours ago, haker_fox said:

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

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

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


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

8 minutes ago, Rst7 said:

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

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

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


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

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

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

Гость
Ответить в этой теме...

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

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

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

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

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

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