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

 
 
 
Reply to this topicStart new topic
> под uint8_t выделяется 2 байта ?
a9d
сообщение Sep 9 2013, 02:58
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 312
Регистрация: 9-04-10
Пользователь №: 56 532



IAR ARM
Подключил к проекту либу. Там есть место

Код
PACKED_STRUCT {
        uint8_t    start;
        uint16_t    length_be;
    } prefix;


Далее uart-у передается адрес структуры и ее размер.

И вот тут начинаются проблемы. Принимающие устройство ожидает три байта, а приходит четыре. К тому-же с не правильным length_be. Так как младший байт этой переменной должен быть вторым а не третьим.

Я вижу, что IAR под uint8_t выделяет два байта. sizeof возвращает размер структуры 4.

Как заставить IAR выделять правильное количество байт??


Сообщение отредактировал a9d - Sep 9 2013, 03:34
Go to the top of the page
 
+Quote Post
DASM
сообщение Sep 9 2013, 03:39
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 3 644
Регистрация: 28-05-05
Пользователь №: 5 493



Цитата(a9d @ Sep 9 2013, 06:58) *
IAR ARM
Подключил к проекту либу. Там есть место

Код
PACKED_STRUCT {
        uint8_t    start;
        uint16_t    length_be;
    } prefix;


Далее uart-у передается адрес структуры и ее размер.

И вот тут начинаются проблемы. Принимающие устройство ожидает три байта, а приходит четыре. К тому-же с не правильным length_be. Так как младший байт этой переменной должен быть вторым а не третьим.

Я вижу, что IAR под uint8_t выделяет два байта. sizeof возвращает размер структуры 4.

Как заставить IAR выделять правильное количество байт??

pragma pack (1)
Go to the top of the page
 
+Quote Post
a9d
сообщение Sep 9 2013, 03:46
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 312
Регистрация: 9-04-10
Пользователь №: 56 532



Спасибо. Сработало.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Sep 9 2013, 06:37
Сообщение #4


Гуру
******

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



QUOTE (a9d @ Sep 9 2013, 04:58) *
Я вижу, что IAR под uint8_t выделяет два байта.
Неверно. Под uint8_t выделяется один байт, а вот следом за ним вставляется пустое место для выравнивания следующего поля (uint16_t) на границу 2 байт.
QUOTE (a9d @ Sep 9 2013, 05:46) *
Сработало.
Ага. Здесь сработало, но при этом заодно упаковались и все объявленные следом структуры, а значит доступ к их членам стал байтовым и как следствие медленным, с увеличением размера кода.

Надо было разбираться, почему не работет ваш макрос PACKED_STRUCT. Но не видя его определения советовать тут что-то очень трудно.


--------------------
На любой вопрос даю любой ответ
"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
DASM
сообщение Sep 9 2013, 08:34
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 3 644
Регистрация: 28-05-05
Пользователь №: 5 493



просто потом надо написать pragma pack() для воостановления старого выравнивания. (зависит от компилятора)
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Sep 9 2013, 09:10
Сообщение #6


Гуру
******

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



QUOTE (DASM @ Sep 9 2013, 10:34) *
просто потом надо написать pragma pack() для воостановления старого выравнивания. (зависит от компилятора)
Вероятно макрос PACKED_STRUCT как-то об этом заботился.


--------------------
На любой вопрос даю любой ответ
"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
a9d
сообщение Sep 9 2013, 20:43
Сообщение #7


Местный
***

Группа: Участник
Сообщений: 312
Регистрация: 9-04-10
Пользователь №: 56 532



Макрос об этом не заботился, за ним скрывается struct.

Скорость и размер не особо важны. В либе проблемы не только во время передачи/приема а вообще в самой библиотеке. Эту библиотеку разработали в digi. Там сплошная работа со структурами и я вижу, что разработчикам часто нравилось работать со структурами как с массивами.

Пробовал все сделать правильно и добавил макросы к структурам, но это вылечило только некоторые проблемы. Только глобальная pragma pack (1) убирает все проблемы.
Go to the top of the page
 
+Quote Post
DASM
сообщение Sep 10 2013, 03:59
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 3 644
Регистрация: 28-05-05
Пользователь №: 5 493



Лучше разбираться почему так.Глобально — моветон.
Go to the top of the page
 
+Quote Post
scifi
сообщение Sep 10 2013, 04:18
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(a9d @ Sep 10 2013, 00:43) *
Макрос об этом не заботился, за ним скрывается struct.

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

Цитата(a9d @ Sep 10 2013, 00:43) *
Скорость и размер не особо важны.

Тогда просто продолжайте использовать глобальную прагму pack(1). Для удобства её можно вынести в отдельный файл и включать его в каждый компилируемый файл при помощи опции компилятора --preinclude.
Оставьте разборки с выравниванием тому, кому по понадобится оптимизировать эту библиотеку.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Sep 10 2013, 07:28
Сообщение #10


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(scifi @ Sep 10 2013, 08:18) *
Тогда просто продолжайте использовать глобальную прагму pack(1).
Для такого решения (безотносительно к его качеству) должен иметься специальный инструмент, например в gcc это ключик -fpack-struct[=n].


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
rudy_b
сообщение Sep 10 2013, 08:20
Сообщение #11


Знающий
****

Группа: Свой
Сообщений: 888
Регистрация: 25-09-08
Из: Питер
Пользователь №: 40 458



В IARE ключевое слово __packed. Действует только на указанную структуру: __packed struct
Go to the top of the page
 
+Quote Post
scifi
сообщение Sep 10 2013, 08:54
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(demiurg_spb @ Sep 10 2013, 11:28) *
Для такого решения (безотносительно к его качеству) должен иметься специальный инструмент, например в gcc это ключик -fpack-struct[=n].

Нету в яре такого ключика. Поэтому я и упомянул --preinclude. Ничего более элегантного не просматривается.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Sep 10 2013, 12:21
Сообщение #13


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(scifi @ Sep 10 2013, 12:54) *
Нету в яре такого ключика. Поэтому я и упомянул --preinclude. Ничего более элегантного не просматривается.
На нет и суда нет)))


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
bigal
сообщение Sep 11 2013, 07:19
Сообщение #14


Участник
*

Группа: Участник
Сообщений: 42
Регистрация: 16-08-06
Из: Москва
Пользователь №: 19 581



Это была шутка?

IAR C/C++ Development Guide

Цитата
__packed
Syntax Follows the generic syntax rules for type attributes that can be used on data, see Type
attributes, page 313.
Description Use the __packed keyword to decrease the data type alignment to 1. __packed can be
used for two purposes:
● When used with a struct or union type definition, the maximum alignment of
members of that struct or union is set to 1, to eliminate any gaps between the
members. The type of each members also receives the __packed type attribute.
● When used with any other type, the resulting type is the same as the type without
the __packed type attribute, but with an alignment of 1. Types that already have an
alignment of 1 are not affected by the __packed type attribute.
Go to the top of the page
 
+Quote Post
DASM
сообщение Sep 11 2013, 07:24
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 3 644
Регистрация: 28-05-05
Пользователь №: 5 493



не путайте ключи компилятора и инлайновые директивы
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 13:42
Рейтинг@Mail.ru


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