|
|
  |
__packed не работает? |
|
|
|
Jun 11 2015, 06:00
|
Участник

Группа: Участник
Сообщений: 50
Регистрация: 31-03-14
Из: Харьков
Пользователь №: 81 165

|
Привет всем. Заранее извиняюсь за дурацкий вопрос есть такая структура: Код 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) думаю, тему можно удалять, особой ценности она не имеет
Сообщение отредактировал slavokhire5 - Jun 11 2015, 06:15
|
|
|
|
|
Jun 11 2015, 08:19
|

Знающий
   
Группа: Участник
Сообщений: 756
Регистрация: 14-11-14
Пользователь №: 83 663

|
Цитата(slavokhire5 @ Jun 11 2015, 10:00)  в чем суть проблемы: при работе с msp430f6xxx через IAR результат операции sizeof(resp) == 8 (!!!!), в то же время под stm32l0 также через IAR результат sizeof(resp) == 7 (что я считаю правильным). Это объясняет результат? [attachment=93134:_x6_.png] IAR C/C++ Compiler User Guide for the Texas Instruments MSP430 Microcontroller Family Tenth edition: April 2014
--------------------
Пролетарий умственного труда.
|
|
|
|
|
Jun 11 2015, 08:53
|

Знающий
   
Группа: Участник
Сообщений: 756
Регистрация: 14-11-14
Пользователь №: 83 663

|
Цитата(Сергей Борщ @ Jun 11 2015, 12:36)  Нет. Это о случае, когда без упаковки конец структкры оказывается не выровнен на кратное упаковке структуры число байт. ??? "Типы struct и union имеют то же выравнивание, что и элемент с наибольшим требуемым размером. … Для возможной реализации массивов выровненых структурных объектов (и не только - прим. перев.  ) размер struct подстраивается к чётному кратному выравнивания." 1 поле по 8 бит (выравнивание на слово) + 3 поля по 16 бит => 8 байт.
--------------------
Пролетарий умственного труда.
|
|
|
|
|
Jun 11 2015, 09:19
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(Obam @ Jun 11 2015, 11:53)  "Типы struct и union имеют то же выравнивание, что и элемент с наибольшим требуемым размером. Пока не указана #pragma pack или ее аналог. При указании этой директивы поля располагаются без выравнивания, вплотную друг к другу и в массиве такие структуры тоже располагаются вплотную. Цитата(Obam @ Jun 11 2015, 11:53)  1 поле по 8 бит (выравнивание на слово) + 3 поля по 16 бит => 8 байт. 8-битное поле выравнивается на границу байта, 16-битное поле - на границу двух байтов. Итого вся структура согласно первой цитате выравнивается на максимум из этих двух, т.е. на границу двух байтов. Выравнивание первого 16-битного поля достигается вставлением после 8-битового поля одного лишнего байта. Выравнивание остальных полей и размера всей структуры на кратность двум байтам после этого получается автоматически.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Jun 11 2015, 09:34
|

Знающий
   
Группа: Участник
Сообщений: 756
Регистрация: 14-11-14
Пользователь №: 83 663

|
Цитата(Сергей Борщ @ Jun 11 2015, 13:19)  Пока не указана #pragma pack или ее аналог. Так TS без #pragma pack и начинал  Цитата 8-битное поле выравнивается на границу байта, 16-битное поле - на границу двух байтов. Итого вся структура согласно первой цитате выравнивается на максимум из этих двух, т.е. на границу двух байтов. Выравнивание первого 16-битного поля достигается вставлением после 8-битового поля одного лишнего байта. Выравнивание остальных полей и размера всей структуры на кратность двум байтам после этого получается автоматически. Спасибо, пересказ перевода принят  Результат-то у TS правильный, чудес нет
--------------------
Пролетарий умственного труда.
|
|
|
|
|
Jun 11 2015, 14:20
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(Obam @ Jun 11 2015, 13:12)  IAR был для всех. IAR IARу рознь. Вовсе не факт, что директива __packed поддерживается в IARe для обеих архикектур. Она нестандартная, имеют право по большому счету. Как показал автор темы в первом сообщении - для ARM она точно работает, а для MSP430 молча не работает, во всяком случае в той версии компилятора, которая у него есть. Я вообще не понимаю, что вы мне пытаетесь доказать? Показанный вами кусок документации был не в тему - что такое выравнивание и как оно работает автор темы знает (перечитайте еще раз первое сообщение, чтобы понять это).
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Jun 12 2015, 09:53
|

Знающий
   
Группа: Участник
Сообщений: 756
Регистрация: 14-11-14
Пользователь №: 83 663

|
Цитата "…что вы мне пытаетесь доказать?…" Вам? Зачем? Я вопросом ответил 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 могут распололагаться и по нечетным.
--------------------
Пролетарий умственного труда.
|
|
|
|
|
Jun 15 2015, 06:58
|

Знающий
   
Группа: Участник
Сообщений: 756
Регистрация: 14-11-14
Пользователь №: 83 663

|
Цитата(Сергей Борщ @ Jun 12 2015, 14:58)  А слово __packed он в этой структуре и в заглавии темы просто для красоты написал. Ага. Нет не для красоты. Перебдел (от глагола бдить). Просто архитектура 430-го дала такой эффект. Кстати, правило определения размера struct приведено только в параграфе "Alignment of structure types", а в параграфе "Packed structure types" вообще про размер нет.
--------------------
Пролетарий умственного труда.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|