-
- Это ARM, братан! Используй упакованную структуру. Смотри директиву
#pragma pack - IBAH(14.05.2024 16:32)
- В CMSIS нонче есть несколько оберток портабельных: __PACKED_STRUCT,
__PACKED_UNION и что-то рядом. Использование же pragma pack,
например, в хедерах, это, мягко говоря, неаккуратненько, да и между
компилерами не очень портабельно. Я стараюсь обходиться без паков.
Хотя и приходится чужой код поддерживать с наличием. - Vit(15.05.2024 11:11)
- Самые-самые обёртки в lwip: SciFi(379 знак., 15.05.2024 14:51)
- Осталось найти компилятор, не понимающий #pragma pack(push, 1) - LightElf(15.05.2024 12:22)
- Keil - Vit(15.05.2024 14:01)
- Я кейл только для 8051 использую, а там оно не надо. - LightElf(15.05.2024 14:37)
- у меняя всё сильно хуже - составные части нескольких проектов берут
начало от проекта на IAR для C51, потом проекты разошлись на IAR
AVR и Keil C51, были ответвления на IAR MSP430, туча похожих на
ARM7TDMI, CM3, CM4, CM7, Xtensa, сейчас вот на CM23, причём на
разных компиляторах. приходится в этом
бардакезоопарке как-то разруливать... приходится где-то выбивать с ноги ручные выравнивания, где-то паковать... - Vit(15.05.2024 14:59)- Ну оно ж один раз поправить хедеры LightElf(106 знак., 15.05.2024 15:35)
- :) - Vit(15.05.2024 22:24)
- Ни-фи-га! Не один раз. Там поползень - птица такая... :) - bnb62(15.05.2024 15:51)
- На каждый новый проц/компилятор править, но в одном месте. - LightElf(15.05.2024 15:52)
- Ну оно ж один раз поправить хедеры LightElf(106 знак., 15.05.2024 15:35)
- у меняя всё сильно хуже - составные части нескольких проектов берут
начало от проекта на IAR для C51, потом проекты разошлись на IAR
AVR и Keil C51, были ответвления на IAR MSP430, туча похожих на
ARM7TDMI, CM3, CM4, CM7, Xtensa, сейчас вот на CM23, причём на
разных компиляторах. приходится в этом
- Вот Кейл POV(1 знак., 15.05.2024 14:36, картинка)
- в 6-м (Clang). но опять же, оно при наличии атрибутов просто
вредно. Vit(98 знак., 15.05.2024 14:48, ссылка, ссылка)
- Атрибуты менее портабельны, чем pragma. Но конечно лучше завести
какой compiler.h и в него все костыли понасувать. LightElf(1419 знак., 15.05.2024 15:42)
- в CMSIS суют тучу всего, но совместимого для всех известных ему
компилеров. там нет #pragma pack и _Pragma pack. не сростается
объять. именно из-за непортируемости. зато атрибуты __PACKED есть.
ЗЫ _Pragma это вааще лютый intrinsic. классный по сути, но насчет
портабельности не очень. - Vit(15.05.2024 22:22)
- _Pragma, кагбэ, в C99 присутствует. Уж не знаю куда больше портабельности. - LightElf(16.05.2024 20:30)
- в CMSIS суют тучу всего, но совместимого для всех известных ему
компилеров. там нет #pragma pack и _Pragma pack. не сростается
объять. именно из-за непортируемости. зато атрибуты __PACKED есть.
ЗЫ _Pragma это вааще лютый intrinsic. классный по сути, но насчет
портабельности не очень. - Vit(15.05.2024 22:22)
- Атрибуты менее портабельны, чем pragma. Но конечно лучше завести
какой compiler.h и в него все костыли понасувать. LightElf(1419 знак., 15.05.2024 15:42)
- в 6-м (Clang). но опять же, оно при наличии атрибутов просто
вредно. Vit(98 знак., 15.05.2024 14:48, ссылка, ссылка)
- Я кейл только для 8051 использую, а там оно не надо. - LightElf(15.05.2024 14:37)
- Keil - Vit(15.05.2024 14:01)
- Я использую исключительно GCC, и там можно использовать атрибут для
конкретной структуры. Теоретически, можно сделать структуру из
нескольких вложенных структур, часть которых будет упакованными,
часть - нет. Использую упакованные когда нужно передать по каналам
связи или сохранить в изнашиваемую память. - Nikolay_Po(15.05.2024 11:16)
- вот эти __PACKED_STRUCT и т.п. это обертки для атрибутов, но не для
прагмы - Vit(15.05.2024 13:48)
- Для прагмы есть _Pragma - LightElf(15.05.2024 14:33)
- костыль на костыле и костылём погоняет. - Vit(15.05.2024 14:43)
- Для прагмы есть _Pragma - LightElf(15.05.2024 14:33)
- вот эти __PACKED_STRUCT и т.п. это обертки для атрибутов, но не для
прагмы - Vit(15.05.2024 13:48)
- Я предпочитаю не связываться с паками - упаковываю в массив и назад
распаковываю. - vesago(14.05.2024 19:32)
- В массив это как? Вручную назначая значения, поэлмементно? - Nikolay_Po(15.05.2024 10:51)
- Ну да memcpy... Понимаю, звучит так себе. Но у меня проекты на
разных платформах. Легче потом портировать. - vesago(15.05.2024 10:55)
- Если для разных платформ то при сериализации нужно ещё и порядок байт в слове учитывать. Был такой опыт и это не то что хочется часто повторять. Я предпочитаю по каналам связи передавать текстом. - =AlexD=(15.05.2024 13:41)
- Звучит нормально. Проект под несколько платформ полностью оправдывает подход. memcpy будет библиотечным и адаптированным под платформу автоматически. Остальное сработает как надо, кроме, пожалуй что разницы в порядке бит и байт при передаче по внешним интерфейсам. - Nikolay_Po(15.05.2024 10:58)
- Ну да memcpy... Понимаю, звучит так себе. Но у меня проекты на
разных платформах. Легче потом портировать. - vesago(15.05.2024 10:55)
- В массив это как? Вручную назначая значения, поэлмементно? - Nikolay_Po(15.05.2024 10:51)
- Маленький лайфхак. Располагать элементы структуры надо по размеру
4-2-1, тогда тормозить не будет. Точнее: int32 смещение на величину
кратную 4 байтам, int16 на 2 байта итд - IBAH(14.05.2024 17:32)
- Я это уже на автомате делаю, не задумываясь, иначе структуры
кажутся мне "уродливыми". - =AlexD=(14.05.2024 17:37)
- а я шоб не накосячить, делаю так IBAH(1200 знак., 14.05.2024 17:55)
- Я это уже на автомате делаю, не задумываясь, иначе структуры
кажутся мне "уродливыми". - =AlexD=(14.05.2024 17:37)
- +1 нафига памятью разбрасываться и время расчёта crc увеличивать?
Вся структура должна занимать 4 байта в массиве. Я бы и лишний байт
подвязал бы для пользы дела. - =AlexD=(14.05.2024 16:39)
- Так в результате и сделал. Добавил pad byte. Так оказалось удобнее в eeprom писать, если на 4 байта выровнено, можно пачками по 4 байта писать. Спасибо! - Mty1(15.05.2024 00:10)
- Каждый доступ к структуре будет медленнее из-за pack. А вы тут про
время расчёта CRC рассуждаете. И код будет больше - вот такая
экономия памяти. Прекрасный образец двоемыслия. - SciFi(14.05.2024 16:45)
- У нас не ARM v2 - =AlexD=(14.05.2024 16:48)
- Дело вкуса, конечно. Pragma pack имеет свои минусы (в том числе
переносимость плюс пляски с хедерами и объявлениями в разных
файлах). А плюсы, которые ему приписывают, на практике нужны крайне
редко, и минусы перевешивают. Но хозяин - барин. - SciFi(14.05.2024 16:51)
- С переносимость всё гораздо лучше с упакованной, чем без, остальное вообще ни а чом. Но, да, дело фкуса. - =AlexD=(14.05.2024 16:52)
- Дело вкуса, конечно. Pragma pack имеет свои минусы (в том числе
переносимость плюс пляски с хедерами и объявлениями в разных
файлах). А плюсы, которые ему приписывают, на практике нужны крайне
редко, и минусы перевешивают. Но хозяин - барин. - SciFi(14.05.2024 16:51)
- У нас не ARM v2 - =AlexD=(14.05.2024 16:48)
- В CMSIS нонче есть несколько оберток портабельных: __PACKED_STRUCT,
__PACKED_UNION и что-то рядом. Использование же pragma pack,
например, в хедерах, это, мягко говоря, неаккуратненько, да и между
компилерами не очень портабельно. Я стараюсь обходиться без паков.
Хотя и приходится чужой код поддерживать с наличием. - Vit(15.05.2024 11:11)
- Мусор легко может быть. Но какое отношение он имеет к CRC?
Контрольная сумма считается вместе с мусором, так что нет проблем.
Верно? - SciFi(14.05.2024 16:15)
- А ну да. Точно. А не получится что в следующей версии компилятора структура вдруг станет 3х байтной? - Mty1(14.05.2024 16:18)
- Никак. Выравнивай по 4 байта - POV(14.05.2024 16:15)
- Не понял, что значит выравнивай? Писать по 4 байта? - Mty1(14.05.2024 16:19)
- Можно явно добавлять поля, чтобы не было неявного заполнения: SciFi(151 знак., 14.05.2024 16:40)
- У него выравнивание 4, эта структура займёт 12 байт. - =AlexD=(14.05.2024 16:41)
- Выравниваются не поля, а вся структура. Она займет 4 байта. - POV(14.05.2024 16:44)
- Мапэд не мой, так и должно быть, но аффтар топика пишет буквально
следующее "каждый элемент структуры по 4 байта". - =AlexD=(14.05.2024 16:50)
- Очевидно, имел в виду "каждый экземпляр". - SciFi(14.05.2024 16:51)
- Мапэд не мой, так и должно быть, но аффтар топика пишет буквально
следующее "каждый элемент структуры по 4 байта". - =AlexD=(14.05.2024 16:50)
- Выравниваются не поля, а вся структура. Она займет 4 байта. - POV(14.05.2024 16:44)
- У него выравнивание 4, эта структура займёт 12 байт. - =AlexD=(14.05.2024 16:41)
- Смотри директиву #pragma pack - IBAH(14.05.2024 16:23)
- О, спасибо - Mty1(14.05.2024 16:34)
- Можно явно добавлять поля, чтобы не было неявного заполнения: SciFi(151 знак., 14.05.2024 16:40)
- Не понял, что значит выравнивай? Писать по 4 байта? - Mty1(14.05.2024 16:19)
- Это ARM, братан! Используй упакованную структуру. Смотри директиву
#pragma pack - IBAH(14.05.2024 16:32)