|
__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 правильный, чудес нет
--------------------
Пролетарий умственного труда.
|
|
|
|
Сообщений в этой теме
slavokhire5 __packed не работает? Jun 11 2015, 06:00 Сергей Борщ Цитата(slavokhire5 @ Jun 11 2015, 09:00) ... Jun 11 2015, 06:56       Сергей Борщ Цитата(Obam @ Jun 11 2015, 13:12) IAR был... Jun 11 2015, 14:20 Obam Цитата"…что вы мне пытаетесь доказать?…... Jun 12 2015, 09:53 Сергей Борщ Цитата(Obam @ Jun 12 2015, 12:53) т.е. TS... Jun 12 2015, 10:58  Obam Цитата(Сергей Борщ @ Jun 12 2015, 14:58) ... Jun 15 2015, 06:58
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|