slavokhire5 0 11 июня, 2015 Опубликовано 11 июня, 2015 (изменено) · Жалоба Привет всем. Заранее извиняюсь за дурацкий вопрос :) есть такая структура: typedef __packed struct _gap_init_rp{ uint8_t status; uint16_t service_handle; uint16_t dev_name_char_handle; uint16_t appearance_char_handle; } PACKED gap_init_rp; .... gap_init_rp resp; в чем суть проблемы: при работе с msp430f6xxx через IAR результат операции sizeof(resp) == 8 (!!!!), в то же время под stm32l0 также через IAR результат sizeof(resp) == 7 (что я считаю правильным). И тот и тот IAR свежий, без кряков - kikstart. Вероятно что-то не так в настройках? UPD: видимо с __packed iar не очень дружит. или руки у меня кучерявые (вероятнее). помогло #pragma pack(push, 1)...pragma pack(pop) думаю, тему можно удалять, особой ценности она не имеет Изменено 11 июня, 2015 пользователем slavokhire5 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 119 11 июня, 2015 Опубликовано 11 июня, 2015 · Жалоба UPD: видимо с __packed iar не очень дружит. или руки у меня кучерявые (вероятнее). помогло #pragma pack(push, 1)...pragma pack(pop)Насколько помню, IAR еще поддерживал _Pragma("pack") или что-то подобное. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Obam 30 11 июня, 2015 Опубликовано 11 июня, 2015 · Жалоба в чем суть проблемы: при работе с msp430f6xxx через IAR результат операции sizeof(resp) == 8 (!!!!), в то же время под stm32l0 также через IAR результат sizeof(resp) == 7 (что я считаю правильным). Это объясняет результат? IAR C/C++ Compiler User Guide for the Texas Instruments MSP430 Microcontroller Family Tenth edition: April 2014 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 119 11 июня, 2015 Опубликовано 11 июня, 2015 · Жалоба Это объясняет результат?Нет. Это о случае, когда без упаковки конец структкры оказывается не выровнен на кратное упаковке структуры число байт. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Obam 30 11 июня, 2015 Опубликовано 11 июня, 2015 · Жалоба Нет. Это о случае, когда без упаковки конец структкры оказывается не выровнен на кратное упаковке структуры число байт. ??? "Типы struct и union имеют то же выравнивание, что и элемент с наибольшим требуемым размером. … Для возможной реализации массивов выровненых структурных объектов (и не только - прим. перев. :) ) размер struct подстраивается к чётному кратному выравнивания." 1 поле по 8 бит (выравнивание на слово) + 3 поля по 16 бит => 8 байт. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 119 11 июня, 2015 Опубликовано 11 июня, 2015 · Жалоба "Типы struct и union имеют то же выравнивание, что и элемент с наибольшим требуемым размером.Пока не указана #pragma pack или ее аналог. При указании этой директивы поля располагаются без выравнивания, вплотную друг к другу и в массиве такие структуры тоже располагаются вплотную. 1 поле по 8 бит (выравнивание на слово) + 3 поля по 16 бит => 8 байт.8-битное поле выравнивается на границу байта, 16-битное поле - на границу двух байтов. Итого вся структура согласно первой цитате выравнивается на максимум из этих двух, т.е. на границу двух байтов. Выравнивание первого 16-битного поля достигается вставлением после 8-битового поля одного лишнего байта. Выравнивание остальных полей и размера всей структуры на кратность двум байтам после этого получается автоматически. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Obam 30 11 июня, 2015 Опубликовано 11 июня, 2015 · Жалоба Пока не указана #pragma pack или ее аналог. Так TS без #pragma pack и начинал :) 8-битное поле выравнивается на границу байта, 16-битное поле - на границу двух байтов. Итого вся структура согласно первой цитате выравнивается на максимум из этих двух, т.е. на границу двух байтов. Выравнивание первого 16-битного поля достигается вставлением после 8-битового поля одного лишнего байта. Выравнивание остальных полей и размера всей структуры на кратность двум байтам после этого получается автоматически. Спасибо, пересказ перевода принят ;) Результат-то у TS правильный, чудес нет :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 119 11 июня, 2015 Опубликовано 11 июня, 2015 · Жалоба Так TS без #pragma pack и начинал :)У него был кейловский аналог, "__packed", который почему-то сработал в компиляторе для STM32. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Obam 30 11 июня, 2015 Опубликовано 11 июня, 2015 · Жалоба У него был кейловский аналог, "__packed", который почему-то сработал в компиляторе для STM32. IAR был для всех. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 119 11 июня, 2015 Опубликовано 11 июня, 2015 · Жалоба IAR был для всех.IAR IARу рознь. Вовсе не факт, что директива __packed поддерживается в IARe для обеих архикектур. Она нестандартная, имеют право по большому счету. Как показал автор темы в первом сообщении - для ARM она точно работает, а для MSP430 молча не работает, во всяком случае в той версии компилятора, которая у него есть. Я вообще не понимаю, что вы мне пытаетесь доказать? Показанный вами кусок документации был не в тему - что такое выравнивание и как оно работает автор темы знает (перечитайте еще раз первое сообщение, чтобы понять это). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Obam 30 12 июня, 2015 Опубликовано 12 июня, 2015 · Жалоба "…что вы мне пытаетесь доказать?…" Вам? Зачем? Я вопросом ответил TS, ответили вы, "и заверте…" так что… вспомнился старый анекдот:"Дикутую по буквам Николай, Иван, Харит… - Н-И-Ч-Е-Г-О!" "Показанный вами кусок документации был не в тему - что такое выравнивание и как оно работает автор темы знает (перечитайте еще раз первое сообщение, чтобы понять это)." Не в тему??? "typedef __packed struct _gap_init_rp{ uint8_t status; uint16_t service_handle; uint16_t dev_name_char_handle; uint16_t appearance_char_handle; } PACKED gap_init_rp; .... gap_init_rp resp; в чем суть проблемы: при работе с msp430f6xxx через IAR результат операции sizeof(resp) == 8 (!!!!)…" т.е. TS не удивился, что структура номинально из 7 байт, в памяти MSP430 имеет размер 8. Чётный. Я привёл общее правило (и с переводом тоже), объясняющее результат. Вот и всё. Не надо так реагировать, вы меня пугаете ;) А первое сообщение даже процитировано. И ещё забыл отметить: у 430-го слова (16 бит) всегда будут по чётным адресам, а у сравнивавшегося Cotrex-a могут распололагаться и по нечетным. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 119 12 июня, 2015 Опубликовано 12 июня, 2015 · Жалоба т.е. TS не удивился, что структура номинально из 7 байт, в памяти MSP430 имеет размер 8. Чётный.А слово __packed он в этой структуре и в заглавии темы просто для красоты написал. Ага. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Obam 30 15 июня, 2015 Опубликовано 15 июня, 2015 · Жалоба А слово __packed он в этой структуре и в заглавии темы просто для красоты написал. Ага. Нет не для красоты. Перебдел (от глагола бдить). Просто архитектура 430-го дала такой эффект. Кстати, правило определения размера struct приведено только в параграфе "Alignment of structure types", а в параграфе "Packed structure types" вообще про размер нет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться