chechestor 0 22 апреля, 2011 Опубликовано 22 апреля, 2011 · Жалоба Добрый день. Подскажите пожалста, как быть со структурами в IAR?!... Надо выравнивать структуры, чтобы адреса заканчивались нулями... есть #pragma data_alignment=XXX, но она действует только на объявляемые переменные, а можно ли задать тип структуры, которая при объявлении экземпляра структуры сама будет выравниваться?... нАподобие того как в GCC делается struct my_struct{...}__attribute__((aligned(256))) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
prottoss 0 22 апреля, 2011 Опубликовано 22 апреля, 2011 · Жалоба В IAR есть тоже самое #pragma pack(4)//alinment 4 bytes my_struct{...} #pragma pack() //default aligment Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
chechestor 0 22 апреля, 2011 Опубликовано 22 апреля, 2011 · Жалоба а вот и нет... пробовал делать так: #pragma pack(push) #pragma pack(256) struct ohci_hcca { ... } //__attribute__((aligned(256))); (то, что было для GCC) #pragma pack(pop) - IAR отказыввается работать с такими большими числами как 256. более того, если ему указать 16, например, то он все равно не выравнивает адрес (в моем случае адрес заканчивался на 8). Я так понимаю, что #pragma pack(...) нужен для нормировки РАЗМЕРА структуры, но никак не для выравнивания адреса структуры в памяти... Чё ж делать-то?! =( Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Палыч 10 22 апреля, 2011 Опубликовано 22 апреля, 2011 · Жалоба аЧё ж делать-то?! =(Что-то я Вас не пойму... Вам нужно: чтобы данные (в конкретном случае - структура) была выравнена? У Вас вот так не получается? struct ohci_hcca { ... }; #pragma data_alignment=256 struct ohci_hcca sA; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
chechestor 0 22 апреля, 2011 Опубликовано 22 апреля, 2011 (изменено) · Жалоба У Вас вот так не получается?... так получается... но в случае с GCC синтаксисом мы можем просто объявить структуру и она будет сразу выровнена(выравнивание задано при описании), а с случае IARa при объявлении КАЖДОГО нового экземпляра структуры придется прописывать перед ней pragma. Вот я и спрашиваю, можно ли сделать полный эквивалент GCC-шного __attribure__(aligned(256))? Изменено 22 апреля, 2011 пользователем Chestor Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Палыч 10 22 апреля, 2011 Опубликовано 22 апреля, 2011 · Жалоба Вот я и спрашиваю...Нет. Эта #pragma data_alignment распространяется только на переменные Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
=Zap= 0 7 июля, 2011 Опубликовано 7 июля, 2011 (изменено) · Жалоба Я тоже мучался с выравниванием в IAR и моей целью было создавать упакованные по байту структуры с выровненными на 4 байта адресами. Что-то типа такого: struct temp { struct first { INT8U a; INT32U b; INT8U aa; }; struct second { INT8U c; INT32U d; INT8U cc; } }; Нужно чтобы структуры first и second были упакованы без паддинга, но между ними паддинг был и адрес второй структуры был выровнен. Я пользовался #pragma pack(1), но обе структуры упаковывались вместе. Адрес структуры second не был выровнен. Модификатор __packed потребовал задания для структур явного имени, что приводило в изменению способа доступа к внутренним элементам. #pragma data_alignment применяется для экземпляров структуры, а не в её определении. В результате родилось следующая жуть: #define __aligned_packed_structure_start(name) \ union name##_wrap \ { \ _Pragma("pack(push)") \ _Pragma("pack(1)") \ INT32U name##_dummy; \ struct name { #define __aligned_packed_structure_end \ }; \ _Pragma("pack(pop)") \ }; struct temp { __aligned_packed_structure_start(first) INT8U a; INT32U b; INT8U aa; __aligned_packed_structure_end __aligned_packed_structure_start(second) INT8U c; INT32U d; INT8U cc; __aligned_packed_structure_end }; То есть каждую такую упаковываемую структуру му кладем в union оболочку с 4байтой переменной, и меняем туда-сюда упаковку. Обратите внимание, что для подстановки #pragma внутрь макроса используется _Pragma("") и на создание новых токенов посредством конкатенации ##. Может кому пригодится. Может кто посоветует что-то проще. Может IAR введёт такую вещь как __align__(num), которая бы ставила точку выравнивания в объявлении структуры. Изменено 7 июля, 2011 пользователем =Zap= Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться