реклама на сайте
подробности

 
 
> __packed не работает?
slavokhire5
сообщение Jun 11 2015, 06:00
Сообщение #1


Участник
*

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



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

есть такая структура:
Код
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
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Obam
сообщение Jun 11 2015, 08:19
Сообщение #2


Знающий
****

Группа: Участник
Сообщений: 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


--------------------
Пролетарий умственного труда.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jun 11 2015, 08:36
Сообщение #3


Гуру
******

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



Цитата(Obam @ Jun 11 2015, 11:19) *
Это объясняет результат?
Нет. Это о случае, когда без упаковки конец структкры оказывается не выровнен на кратное упаковке структуры число байт.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Obam
сообщение Jun 11 2015, 08:53
Сообщение #4


Знающий
****

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



Цитата(Сергей Борщ @ Jun 11 2015, 12:36) *
Нет. Это о случае, когда без упаковки конец структкры оказывается не выровнен на кратное упаковке структуры число байт.


???
"Типы struct и union имеют то же выравнивание, что и элемент с наибольшим требуемым размером. … Для возможной реализации массивов
выровненых структурных объектов (и не только - прим. перев. sm.gif ) размер struct подстраивается к чётному кратному выравнивания."

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


--------------------
Пролетарий умственного труда.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jun 11 2015, 09:19
Сообщение #5


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post
Obam
сообщение Jun 11 2015, 09:34
Сообщение #6


Знающий
****

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



Цитата(Сергей Борщ @ Jun 11 2015, 13:19) *
Пока не указана #pragma pack или ее аналог.


Так TS без #pragma pack и начинал sm.gif

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


Спасибо, пересказ перевода принят wink.gif
Результат-то у TS правильный, чудес нет sm.gif


--------------------
Пролетарий умственного труда.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jun 11 2015, 09:58
Сообщение #7


Гуру
******

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



Цитата(Obam @ Jun 11 2015, 12:34) *
Так TS без #pragma pack и начинал sm.gif
У него был кейловский аналог, "__packed", который почему-то сработал в компиляторе для STM32.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Obam
сообщение Jun 11 2015, 10:12
Сообщение #8


Знающий
****

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



Цитата(Сергей Борщ @ Jun 11 2015, 13:58) *
У него был кейловский аналог, "__packed", который почему-то сработал в компиляторе для STM32.


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


--------------------
Пролетарий умственного труда.
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 27th July 2025 - 22:19
Рейтинг@Mail.ru


Страница сгенерированна за 0.01456 секунд с 7
ELECTRONIX ©2004-2016