Jump to content
    

__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)

 

думаю, тему можно удалять, особой ценности она не имеет

Edited by slavokhire5

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

 

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

 

???

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

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

 

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

Share this post


Link to post
Share on other sites

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

 

 

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

Share this post


Link to post
Share on other sites

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

 

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

 

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

 

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

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

 

Share this post


Link to post
Share on other sites

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

 

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

Вам? Зачем?

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

по нечетным.

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

 

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

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

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...