slavokhire5 0 June 11, 2015 Posted June 11, 2015 (edited) · Report post Привет всем. Заранее извиняюсь за дурацкий вопрос :) есть такая структура: 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) думаю, тему можно удалять, особой ценности она не имеет Edited June 11, 2015 by slavokhire5 Quote Share this post Link to post Share on other sites More sharing options...
Сергей Борщ 170 June 11, 2015 Posted June 11, 2015 · Report post UPD: видимо с __packed iar не очень дружит. или руки у меня кучерявые (вероятнее). помогло #pragma pack(push, 1)...pragma pack(pop)Насколько помню, IAR еще поддерживал _Pragma("pack") или что-то подобное. Quote Share this post Link to post Share on other sites More sharing options...
Obam 46 June 11, 2015 Posted June 11, 2015 · Report post в чем суть проблемы: при работе с 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 Quote Share this post Link to post Share on other sites More sharing options...
Сергей Борщ 170 June 11, 2015 Posted June 11, 2015 · Report post Это объясняет результат?Нет. Это о случае, когда без упаковки конец структкры оказывается не выровнен на кратное упаковке структуры число байт. Quote Share this post Link to post Share on other sites More sharing options...
Obam 46 June 11, 2015 Posted June 11, 2015 · Report post Нет. Это о случае, когда без упаковки конец структкры оказывается не выровнен на кратное упаковке структуры число байт. ??? "Типы struct и union имеют то же выравнивание, что и элемент с наибольшим требуемым размером. … Для возможной реализации массивов выровненых структурных объектов (и не только - прим. перев. :) ) размер struct подстраивается к чётному кратному выравнивания." 1 поле по 8 бит (выравнивание на слово) + 3 поля по 16 бит => 8 байт. Quote Share this post Link to post Share on other sites More sharing options...
Сергей Борщ 170 June 11, 2015 Posted June 11, 2015 · Report post "Типы struct и union имеют то же выравнивание, что и элемент с наибольшим требуемым размером.Пока не указана #pragma pack или ее аналог. При указании этой директивы поля располагаются без выравнивания, вплотную друг к другу и в массиве такие структуры тоже располагаются вплотную. 1 поле по 8 бит (выравнивание на слово) + 3 поля по 16 бит => 8 байт.8-битное поле выравнивается на границу байта, 16-битное поле - на границу двух байтов. Итого вся структура согласно первой цитате выравнивается на максимум из этих двух, т.е. на границу двух байтов. Выравнивание первого 16-битного поля достигается вставлением после 8-битового поля одного лишнего байта. Выравнивание остальных полей и размера всей структуры на кратность двум байтам после этого получается автоматически. Quote Share this post Link to post Share on other sites More sharing options...
Obam 46 June 11, 2015 Posted June 11, 2015 · Report post Пока не указана #pragma pack или ее аналог. Так TS без #pragma pack и начинал :) 8-битное поле выравнивается на границу байта, 16-битное поле - на границу двух байтов. Итого вся структура согласно первой цитате выравнивается на максимум из этих двух, т.е. на границу двух байтов. Выравнивание первого 16-битного поля достигается вставлением после 8-битового поля одного лишнего байта. Выравнивание остальных полей и размера всей структуры на кратность двум байтам после этого получается автоматически. Спасибо, пересказ перевода принят ;) Результат-то у TS правильный, чудес нет :) Quote Share this post Link to post Share on other sites More sharing options...
Сергей Борщ 170 June 11, 2015 Posted June 11, 2015 · Report post Так TS без #pragma pack и начинал :)У него был кейловский аналог, "__packed", который почему-то сработал в компиляторе для STM32. Quote Share this post Link to post Share on other sites More sharing options...
Obam 46 June 11, 2015 Posted June 11, 2015 · Report post У него был кейловский аналог, "__packed", который почему-то сработал в компиляторе для STM32. IAR был для всех. Quote Share this post Link to post Share on other sites More sharing options...
Сергей Борщ 170 June 11, 2015 Posted June 11, 2015 · Report post IAR был для всех.IAR IARу рознь. Вовсе не факт, что директива __packed поддерживается в IARe для обеих архикектур. Она нестандартная, имеют право по большому счету. Как показал автор темы в первом сообщении - для ARM она точно работает, а для MSP430 молча не работает, во всяком случае в той версии компилятора, которая у него есть. Я вообще не понимаю, что вы мне пытаетесь доказать? Показанный вами кусок документации был не в тему - что такое выравнивание и как оно работает автор темы знает (перечитайте еще раз первое сообщение, чтобы понять это). Quote Share this post Link to post Share on other sites More sharing options...
Obam 46 June 12, 2015 Posted June 12, 2015 · Report post "…что вы мне пытаетесь доказать?…" Вам? Зачем? Я вопросом ответил 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 могут распололагаться и по нечетным. Quote Share this post Link to post Share on other sites More sharing options...
Сергей Борщ 170 June 12, 2015 Posted June 12, 2015 · Report post т.е. TS не удивился, что структура номинально из 7 байт, в памяти MSP430 имеет размер 8. Чётный.А слово __packed он в этой структуре и в заглавии темы просто для красоты написал. Ага. Quote Share this post Link to post Share on other sites More sharing options...
Obam 46 June 15, 2015 Posted June 15, 2015 · Report post А слово __packed он в этой структуре и в заглавии темы просто для красоты написал. Ага. Нет не для красоты. Перебдел (от глагола бдить). Просто архитектура 430-го дала такой эффект. Кстати, правило определения размера struct приведено только в параграфе "Alignment of structure types", а в параграфе "Packed structure types" вообще про размер нет. Quote Share this post Link to post Share on other sites More sharing options...