Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: под uint8_t выделяется 2 байта ?
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
a9d
IAR ARM
Подключил к проекту либу. Там есть место

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


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

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

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

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

Надо было разбираться, почему не работет ваш макрос PACKED_STRUCT. Но не видя его определения советовать тут что-то очень трудно.
DASM
просто потом надо написать pragma pack() для воостановления старого выравнивания. (зависит от компилятора)
Сергей Борщ
QUOTE (DASM @ Sep 9 2013, 10:34) *
просто потом надо написать pragma pack() для воостановления старого выравнивания. (зависит от компилятора)
Вероятно макрос PACKED_STRUCT как-то об этом заботился.
a9d
Макрос об этом не заботился, за ним скрывается struct.

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

Пробовал все сделать правильно и добавил макросы к структурам, но это вылечило только некоторые проблемы. Только глобальная pragma pack (1) убирает все проблемы.
DASM
Лучше разбираться почему так.Глобально — моветон.
scifi
Цитата(a9d @ Sep 10 2013, 00:43) *
Макрос об этом не заботился, за ним скрывается struct.

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

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

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

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

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.
DASM
не путайте ключи компилятора и инлайновые директивы
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.