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

День добрый! Дабы не плодить веток, задам вопрос здесь.

Существует ли способ жестко задать расположение битовых полей. Пример 

#pragma pack(push, 1)
typedef struct
{
	uint32_t p0:3;
	uint32_t p1:6;
	uint32_t p2:5;
	uint32_t p3:4;
	uint32_t p4:14;
}param_t;
#pragma pack (pop)

в памяти получается так 

p1,p1,p1,p1,p1,p0,p0,p0, p3,p3,p2,p2,p2,p2,p2,p1, p4,p4,p4,p4,p4,p4,p3,p3, p4,p4,p4,p4,p4,p4,p4,p4

а хотелось бы чтоб было так

p0,p0,p0,p1,p1,p1,p1,p1, p1,p2,p2,p2,p2,p2,p3,p3, p3,p3,p4,p4,p4,p4,p4,p4, p4,p4,p4,p4,p4,p4,p4,p4

 

 

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


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

3 hours ago, Aleksey_M said:
uint32_t p0:3;

Вообще-то должно быть так:

unsigned p0:3;

 

 

Кстати, какое размер этой структуры? Какое значение дает sizeof(param_t)?

Должно быть 4

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


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

sizeof(param_t) дает 4.  unsigned ... дает тоже самое 

On 8/22/2022 at 1:30 PM, Arlleex said:

BE/LE?

Можно чуть подробнее ?

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


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

Я об индейцах. Малые, большие?

Спойлер

Big/Little Endian?

 

15 минут назад, Forger сказал:

Вообще-то должно быть так...

Зачем?

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


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

1 minute ago, Arlleex said:

Зачем?

Это типа по стандарту, да и так нагляднее (по моему), иначе сбивает с толку, ведь можно написать uint8_t, а можно и uint64_t.

9 minutes ago, Aleksey_M said:

sizeof(param_t) дает 4.  unsigned ... дает тоже самое 

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

Кстати, а какой компилятор? 

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


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

On 8/22/2022 at 2:59 PM, Arlleex said:

Я об индейцах. Малые, большие?

Big endian. Keil , Cortex. 

On 8/22/2022 at 3:03 PM, Forger said:

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

Кстати, а какой компилятор? 

Keil! кстати CVI выдает точно также!

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


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

11 минут назад, Forger сказал:

Это типа по стандарту...

Ды ну нет:

Цитата

A bit-field shall have a type that is a qualified or unqualified version of _Bool, signed int, unsigned int, or some other implementation-defined type.

А под uint32_t обычно кроется тот самый unsigned int.

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


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

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

Big endian.

Увы, только тасовать поля вручную. Или какой-то C++ шаблон-обертку, которая будет реверсировать порядок байтов при чтении/записи в память.

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


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

10 минут назад, Aleksey_M сказал:

Big endian. Keil , Cortex. 

Сочувствую. Значит ручками биты перетасовывать.

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


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

35 минут назад, Aleksey_M сказал:

Big endian. Keil , Cortex.

Если нужно биты или байты тасовать, то Cortex-M имеет некоторые спец.команды для этого.

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


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

41 minutes ago, Aleksey_M said:

Keil!

Keil - это лишь среда, у него внутри два компилятора: старый v5 и актуальный v6. 

Много лет работаю на v6 и у меня в проектах он не тасует битовые поля. Может я что-то не так делаю? :)

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


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

39 минут назад, Forger сказал:

Много лет работаю на v6 и у меня в проектах он не тасует битовые поля...

Keil ничего не тасует, он все делает верно в данном случае.

Обратите внимание на не зря упомянутых индейцев, они оказались большими, как и предполагалось.
 

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

Если нужно биты или байты тасовать, то Cortex-M имеет некоторые спец.команды для этого.

Думаю, у него не M-профиль, раз Big-endian, а какой-нибудь Cortex-A (по крайней мере, BE на Cortex-M - редкостное г*вно чудо).

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


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

8 minutes ago, Arlleex said:

он все делает верно в данном случае.

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

Впрочем, неизвестно как автор проверяет этот факт, т.е. какими данными заполняет эти поля. Допускаю, что ошибка еще и отсюда помимо "индейцев" ))

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


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

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

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

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

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

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

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

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

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

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