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

Плавный переход C -> C++ под МК

11 hours ago, Kabdim said:

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

А вот здесь подробнее, пожалуйста) Я записываю! Битовые поля использую года с 2007 и пока проблем ни разу не было.

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


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

К совету про битовые поля я не прислушался. Пользуюсь ими с самого начала изучения Си и ни разу не наступал на грабли.

P.S. У меня дежавю: уж не Вы ли, @Kabdim, уже поднимали эту тему где-то тут на Форуме? Давайте примеры, попробуем разобрать.

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


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

10 часов назад, esaulenka сказал:

Потому что инициализация выборочных полей массива описана в стандарте C99 (вот тут), но не описана ни в каком стандарте C++. Каких-то черновиков для включения в стандарт вроде б нет (но я очень невнимательно слежу за деятельностью комитета по стандартизации).

Прочитайте внимательнее моё сообщение. Я там привёл пример, который компилируется IAR-ом без всяких предупреждений. IAR говорит при этом что это "C dialect: C99".

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


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

28 minutes ago, jcxz said:

Прочитайте внимательнее моё сообщение.

Прочитайте внимательнее исходное сообщение. @Arlleex вообще на другом языке пишет.

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


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

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

Прочитайте внимательнее исходное сообщение. @Arlleex вообще на другом языке пишет.

На каком "другом"? Я такого языка не знаю. А в исходном указан "C++".

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


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

35 minutes ago, jcxz said:

На каком "другом"? ... А в исходном указан "C++".

 

1 hour ago, jcxz said:

IAR говорит при этом что это "C dialect: C99".

Ну всё как обычно, ничего нового. Я спорить заканчиваю - кому-то, надеюсь, помогла информация, которую я привёл ранее, а в этой клоунаде участвовать смысла нет никакого.

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


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

1 minute ago, esaulenka said:

а в этой клоунаде участвовать смысла нет никакого.

Точно, клоуны тут не нужны. Покиньте тему.

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


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

Слушайте, я в bit fields вляпался Н лет назад, с красноглазым разбором оптимизированного ассемблера. Мне хватило. К сожалению я не охотник и трофеи исходников не вывешиваю на стене что бы потом всем показывать. Давайте начнем с того что порядок битов в слове может быть любым по стандарту. И то что при записи в битовое поле компилятор волен выбирать байтовую запись даже если поле в стоставе volatile uint32_t.

 

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


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

1 hour ago, Kabdim said:

Мне хватило. К сожалению я не охотник и трофеи исходников не вывешиваю на стене что бы потом всем показывать

Сколько пафоса! Тем не менее, это не трофеи, которые может быть действительно не нужно показывать. Это ценный опыт, который вы могли бы изложить здесь и помочь людям, которые, наверное, иногда помогают и вам.

1 hour ago, Kabdim said:

Давайте начнем с того что порядок битов в слове может быть любым по стандарту.

Ну и что?

1 hour ago, Kabdim said:

И то что при записи в битовое поле компилятор волен выбирать байтовую запись даже если поле в стоставе volatile uint32_t.

Вот здесь непонятно, что вы имеете в виду?

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


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

Вот пример как я использую битовые поля (на примере CAN):

 

Spoiler

union Id // J1939
{
	struct
	{
		uint8_t sourceAddress;
		uint8_t PDU_Specific;
		uint8_t PDU_Format;		
		unsigned dataPage : 1;
		unsigned reserved : 1;
		unsigned priority : 3;
		unsigned alignmentToInt32 : 3;
	};
	uint32_t value;
};

 

Обращаю внимание на неиспользуемое поле unsigned alignmentToInt32

 

 

Вот из личной периферийной библиотеки (чтобы отвязаться от штатных, т.к. у всех камней они разные).

Он - с использованием безымянной union внутри структуры вообще меня приводит в восторг !

 

Spoiler

	using Frame = struct
	{
		bool 		isExtendedId;
		bool 		isRTR;
		uint32_t 	id;
		uint8_t		dataSize;
		uint8_t 	filterIndex;
      
		union // 8 bytes strictly
		{
			uint8_t		dataU8[8];
			uint16_t	dataU16[4];
			float		float32[2];
			uint32_t	dataU32[2];
			uint64_t	dataU64;
			double		float64;
		};
	};

 

 

 

 

 

Короче, скажу по личному опыту: НИ РАЗУ НЕ БЫЛО ТРАБЛОВ с применением битовых полей, причем эти же самые структуры/объединения как есть вставлены были в тот же Qt и работали в ПК совершенно одинаково на контроллерах

 

 

Для особых случаев можно заставить компилятор не заниматься "самодеятельностью" с помощью соотв прагмы:

#pragma pack(push, 1)
  
using Version = struct
{
....
};

#pragma pack(pop)

 

 

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


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

17.06.2021 в 18:20, haker_fox сказал:

Вот здесь непонятно, что вы имеете в виду?

Пардоньте мой пАфОс, я постараюсь не ослабять его поводок :] .

Если есть конструкция вида

struct S {
    volatile uint32_t b1 : 8, tempSpecialFor_jcxz: 2, b2 : 6, b3 : 2;
};

S s;

s.b2 = 3;

то вот эта конструкция может сделать strb вместо перезаписи всего слова.

 

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


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

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

Если есть конструкция вида


struct S {

    volatile uint32_t b1 : 8, : 2, b2 : 6, b3 : 2;
};

S s;

s.b2 = 3;

то вот эта конструкция может сделать strb вместо перезаписи всего слова.

Имхо - единственное, что должна делать эта "конструкция" - ошибку компиляции.

И уж точно никак не STRB. STRB записывает 8 бит, но никак не 6.

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


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

Поправил. А по существу, без придирок? Этот кейс кстати тоже забавный, без волатайл безымянное падинг поле можно, а с волатайл уже разом нельзя - логика.

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


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

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

Поправил. А по существу, без придирок?

По существу - написали галиматью. Ещё раз перечитайте мой коммент и подумайте. Только как следует подумайте.

 

 

PS: Разжую понятнее: одной STRB там никак не обойтись. Нужна последовательность чтение-модификация-запись. А будет сделана она с помощью LDRB\STRB или LDR\STR - дело вообще 10-е.

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


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

Вы серьезно? Ну не хотите говорить по существу и ладно. Для остальных открыты двери любого компилятора что бы подтвердить правоту одного или второго участника.

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


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

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

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

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

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

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

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

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

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

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