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

 
 
 
Reply to this topicStart new topic
> __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
Сергей Борщ
сообщение Jun 11 2015, 06:56
Сообщение #2


Гуру
******

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



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


--------------------
На любой вопрос даю любой ответ
"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:19
Сообщение #3


Знающий
****

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


Гуру
******

Группа: Модераторы
Сообщений: 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
Сообщение #5


Знающий
****

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


Гуру
******

Группа: Модераторы
Сообщений: 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
Сообщение #7


Знающий
****

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


Гуру
******

Группа: Модераторы
Сообщений: 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
Сообщение #9


Знающий
****

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



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


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


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


Гуру
******

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


Знающий
****

Группа: Участник
Сообщений: 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. Чётный.
Я привёл общее правило (и с переводом тоже), объясняющее результат.
Вот и всё. Не надо так реагировать, вы меня пугаете wink.gif

А первое сообщение даже процитировано.

И ещё забыл отметить: у 430-го слова (16 бит) всегда будут по чётным адресам, а у сравнивавшегося Cotrex-a могут распололагаться и
по нечетным.


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


Гуру
******

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



Цитата(Obam @ Jun 12 2015, 12:53) *
т.е. TS не удивился, что структура номинально из 7 байт, в памяти MSP430 имеет размер 8. Чётный.
А слово __packed он в этой структуре и в заглавии темы просто для красоты написал. Ага.


--------------------
На любой вопрос даю любой ответ
"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 15 2015, 06:58
Сообщение #13


Знающий
****

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



Цитата(Сергей Борщ @ Jun 12 2015, 14:58) *
А слово __packed он в этой структуре и в заглавии темы просто для красоты написал. Ага.


Нет не для красоты. Перебдел (от глагола бдить). Просто архитектура 430-го дала такой эффект.
Кстати, правило определения размера struct приведено только в параграфе "Alignment of structure types", а в параграфе
"Packed structure types" вообще про размер нет.


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

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

 


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


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