|
|
  |
под uint8_t выделяется 2 байта ? |
|
|
|
Sep 9 2013, 02:58
|
Местный
  
Группа: Участник
Сообщений: 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
|
|
|
|
|
Sep 9 2013, 03:39
|
Гуру
     
Группа: Свой
Сообщений: 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)
|
|
|
|
|
Sep 9 2013, 06:37
|

Гуру
     
Группа: Модераторы
Сообщений: 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)
|
|
|
|
|
Sep 10 2013, 04:18
|
Гуру
     
Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136

|
Цитата(a9d @ Sep 10 2013, 00:43)  Макрос об этом не заботился, за ним скрывается struct. Этот макрос должен писать не автор библиотеки, а тот, кто её портирует на свою архитектуру. Вот кто этот макрос написал, того и спрашивайте, почему он такой. Вполне возможно, что он решил не париться и просто глобально выключить выравнивание структур. Или у него была 8-битная архитектура. Цитата(a9d @ Sep 10 2013, 00:43)  Скорость и размер не особо важны. Тогда просто продолжайте использовать глобальную прагму pack(1). Для удобства её можно вынести в отдельный файл и включать его в каждый компилируемый файл при помощи опции компилятора --preinclude. Оставьте разборки с выравниванием тому, кому по понадобится оптимизировать эту библиотеку.
|
|
|
|
|
Sep 11 2013, 07:19
|

Участник

Группа: Участник
Сообщений: 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.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|