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

 
 
> align для структур
Chestor
сообщение Apr 22 2011, 05:20
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 40
Регистрация: 23-11-10
Пользователь №: 61 098



Добрый день.
Подскажите пожалста, как быть со структурами в IAR?!... Надо выравнивать структуры, чтобы адреса заканчивались нулями... есть #pragma data_alignment=XXX, но она действует только на объявляемые переменные, а можно ли задать тип структуры, которая при объявлении экземпляра структуры сама будет выравниваться?... нАподобие того как в GCC делается struct my_struct{...}__attribute__((aligned(256)))
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
=Zap=
сообщение Jul 7 2011, 11:16
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 29
Регистрация: 7-01-09
Пользователь №: 42 985



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

Сообщение отредактировал =Zap= - Jul 7 2011, 11:17
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 26th July 2025 - 14:56
Рейтинг@Mail.ru


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