Перейти к содержанию
    

__packed не работает?

Привет всем. Заранее извиняюсь за дурацкий вопрос :)

 

есть такая структура:

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

UPD: видимо с __packed iar не очень дружит. или руки у меня кучерявые (вероятнее). помогло #pragma pack(push, 1)...pragma pack(pop)
Насколько помню, IAR еще поддерживал _Pragma("pack") или что-то подобное.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

в чем суть проблемы: при работе с 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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это объясняет результат?
Нет. Это о случае, когда без упаковки конец структкры оказывается не выровнен на кратное упаковке структуры число байт.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Нет. Это о случае, когда без упаковки конец структкры оказывается не выровнен на кратное упаковке структуры число байт.

 

???

"Типы struct и union имеют то же выравнивание, что и элемент с наибольшим требуемым размером. … Для возможной реализации массивов

выровненых структурных объектов (и не только - прим. перев. :) ) размер struct подстраивается к чётному кратному выравнивания."

 

1 поле по 8 бит (выравнивание на слово) + 3 поля по 16 бит => 8 байт.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

"Типы struct и union имеют то же выравнивание, что и элемент с наибольшим требуемым размером.
Пока не указана #pragma pack или ее аналог. При указании этой директивы поля располагаются без выравнивания, вплотную друг к другу и в массиве такие структуры тоже располагаются вплотную.

 

 

1 поле по 8 бит (выравнивание на слово) + 3 поля по 16 бит => 8 байт.
8-битное поле выравнивается на границу байта, 16-битное поле - на границу двух байтов. Итого вся структура согласно первой цитате выравнивается на максимум из этих двух, т.е. на границу двух байтов. Выравнивание первого 16-битного поля достигается вставлением после 8-битового поля одного лишнего байта. Выравнивание остальных полей и размера всей структуры на кратность двум байтам после этого получается автоматически.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Пока не указана #pragma pack или ее аналог.

 

Так TS без #pragma pack и начинал :)

 

8-битное поле выравнивается на границу байта, 16-битное поле - на границу двух байтов. Итого вся структура согласно первой цитате выравнивается на максимум из этих двух, т.е. на границу двух байтов. Выравнивание первого 16-битного поля достигается вставлением после 8-битового поля одного лишнего байта. Выравнивание остальных полей и размера всей структуры на кратность двум байтам после этого получается автоматически.

 

Спасибо, пересказ перевода принят ;)

Результат-то у TS правильный, чудес нет :)

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Так TS без #pragma pack и начинал :)
У него был кейловский аналог, "__packed", который почему-то сработал в компиляторе для STM32.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У него был кейловский аналог, "__packed", который почему-то сработал в компиляторе для STM32.

 

IAR был для всех.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

IAR был для всех.
IAR IARу рознь. Вовсе не факт, что директива __packed поддерживается в IARe для обеих архикектур. Она нестандартная, имеют право по большому счету. Как показал автор темы в первом сообщении - для ARM она точно работает, а для MSP430 молча не работает, во всяком случае в той версии компилятора, которая у него есть. Я вообще не понимаю, что вы мне пытаетесь доказать? Показанный вами кусок документации был не в тему - что такое выравнивание и как оно работает автор темы знает (перечитайте еще раз первое сообщение, чтобы понять это).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

"…что вы мне пытаетесь доказать?…"

Вам? Зачем?

Я вопросом ответил 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 могут распололагаться и

по нечетным.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

т.е. TS не удивился, что структура номинально из 7 байт, в памяти MSP430 имеет размер 8. Чётный.
А слово __packed он в этой структуре и в заглавии темы просто для красоты написал. Ага.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А слово __packed он в этой структуре и в заглавии темы просто для красоты написал. Ага.

 

Нет не для красоты. Перебдел (от глагола бдить). Просто архитектура 430-го дала такой эффект.

Кстати, правило определения размера struct приведено только в параграфе "Alignment of structure types", а в параграфе

"Packed structure types" вообще про размер нет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...