Я тоже мучался с выравниванием в 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), которая бы ставила точку выравнивания в объявлении структуры.