Jump to content

    
Arlleex

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

Recommended Posts

11 hours ago, Kabdim said:

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

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

Share this post


Link to post
Share on other sites

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

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

Share this post


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

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

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

Share this post


Link to post
Share on other sites
28 minutes ago, jcxz said:

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

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

Share this post


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

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

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

Share this post


Link to post
Share on other sites
35 minutes ago, jcxz said:

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

 

1 hour ago, jcxz said:

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

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

Share this post


Link to post
Share on other sites

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

 

Share this post


Link to post
Share on other sites
1 hour ago, Kabdim said:

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

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

1 hour ago, Kabdim said:

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

Ну и что?

1 hour ago, Kabdim said:

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

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

Share this post


Link to post
Share on other sites

Вот пример как я использую битовые поля (на примере 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)

 

 

Share this post


Link to post
Share on other sites
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 вместо перезаписи всего слова.

 

Share this post


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

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


struct S {

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

S s;

s.b2 = 3;

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

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

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

Share this post


Link to post
Share on other sites

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

Share this post


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

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

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

 

 

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

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.