Aleksey_M 0 22 августа, 2022 Опубликовано 22 августа, 2022 · Жалоба День добрый! Дабы не плодить веток, задам вопрос здесь. Существует ли способ жестко задать расположение битовых полей. Пример #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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 190 22 августа, 2022 Опубликовано 22 августа, 2022 · Жалоба BE/LE? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 26 22 августа, 2022 Опубликовано 22 августа, 2022 · Жалоба 3 hours ago, Aleksey_M said: uint32_t p0:3; Вообще-то должно быть так: unsigned p0:3; Кстати, какое размер этой структуры? Какое значение дает sizeof(param_t)? Должно быть 4 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Aleksey_M 0 22 августа, 2022 Опубликовано 22 августа, 2022 · Жалоба sizeof(param_t) дает 4. unsigned ... дает тоже самое On 8/22/2022 at 1:30 PM, Arlleex said: BE/LE? Можно чуть подробнее ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 190 22 августа, 2022 Опубликовано 22 августа, 2022 · Жалоба Я об индейцах. Малые, большие? Спойлер Big/Little Endian? 15 минут назад, Forger сказал: Вообще-то должно быть так... Зачем? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 26 22 августа, 2022 Опубликовано 22 августа, 2022 · Жалоба 1 minute ago, Arlleex said: Зачем? Это типа по стандарту, да и так нагляднее (по моему), иначе сбивает с толку, ведь можно написать uint8_t, а можно и uint64_t. 9 minutes ago, Aleksey_M said: sizeof(param_t) дает 4. unsigned ... дает тоже самое Значит попался сообразительный компилятор, но он не должен тасовать эти поля, это противоречит как раз стандарту. По крайней мере мне не приходилось сталкиваться с такими дюже самостоятельными компиляторами ) Кстати, а какой компилятор? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Aleksey_M 0 22 августа, 2022 Опубликовано 22 августа, 2022 · Жалоба 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 выдает точно также! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 190 22 августа, 2022 Опубликовано 22 августа, 2022 · Жалоба 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. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 143 22 августа, 2022 Опубликовано 22 августа, 2022 · Жалоба 7 минут назад, Aleksey_M сказал: Big endian. Увы, только тасовать поля вручную. Или какой-то C++ шаблон-обертку, которая будет реверсировать порядок байтов при чтении/записи в память. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 190 22 августа, 2022 Опубликовано 22 августа, 2022 · Жалоба 10 минут назад, Aleksey_M сказал: Big endian. Keil , Cortex. Сочувствую. Значит ручками биты перетасовывать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Aleksey_M 0 22 августа, 2022 Опубликовано 22 августа, 2022 · Жалоба Понял! Всем спасибо! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 243 22 августа, 2022 Опубликовано 22 августа, 2022 · Жалоба 35 минут назад, Aleksey_M сказал: Big endian. Keil , Cortex. Если нужно биты или байты тасовать, то Cortex-M имеет некоторые спец.команды для этого. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 26 22 августа, 2022 Опубликовано 22 августа, 2022 · Жалоба 41 minutes ago, Aleksey_M said: Keil! Keil - это лишь среда, у него внутри два компилятора: старый v5 и актуальный v6. Много лет работаю на v6 и у меня в проектах он не тасует битовые поля. Может я что-то не так делаю? :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 190 22 августа, 2022 Опубликовано 22 августа, 2022 · Жалоба 39 минут назад, Forger сказал: Много лет работаю на v6 и у меня в проектах он не тасует битовые поля... Keil ничего не тасует, он все делает верно в данном случае. Обратите внимание на не зря упомянутых индейцев, они оказались большими, как и предполагалось. 45 минут назад, jcxz сказал: Если нужно биты или байты тасовать, то Cortex-M имеет некоторые спец.команды для этого. Думаю, у него не M-профиль, раз Big-endian, а какой-нибудь Cortex-A (по крайней мере, BE на Cortex-M - редкостное г*вно чудо). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 26 22 августа, 2022 Опубликовано 22 августа, 2022 · Жалоба 8 minutes ago, Arlleex said: он все делает верно в данном случае. Если верить словам автора, p0...p7 идут не по порядку, в разнобой. Впрочем, неизвестно как автор проверяет этот факт, т.е. какими данными заполняет эти поля. Допускаю, что ошибка еще и отсюда помимо "индейцев" )) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться