Перейти к содержанию
    

align для структур

Добрый день.

Подскажите пожалста, как быть со структурами в IAR?!... Надо выравнивать структуры, чтобы адреса заканчивались нулями... есть #pragma data_alignment=XXX, но она действует только на объявляемые переменные, а можно ли задать тип структуры, которая при объявлении экземпляра структуры сама будет выравниваться?... нАподобие того как в GCC делается struct my_struct{...}__attribute__((aligned(256)))

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

а вот и нет... пробовал делать так:

#pragma pack(push)
#pragma pack(256)

struct ohci_hcca {
...
} //__attribute__((aligned(256))); (то, что было для GCC)

#pragma pack(pop)

- IAR отказыввается работать с такими большими числами как 256. более того, если ему указать 16, например, то он все равно не выравнивает адрес (в моем случае адрес заканчивался на 8).

 

Я так понимаю, что #pragma pack(...) нужен для нормировки РАЗМЕРА структуры, но никак не для выравнивания адреса структуры в памяти...

 

Чё ж делать-то?! =(

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

аЧё ж делать-то?! =(
Что-то я Вас не пойму... Вам нужно: чтобы данные (в конкретном случае - структура) была выравнена? У Вас вот так не получается?

struct ohci_hcca {
...
};

#pragma data_alignment=256
struct ohci_hcca sA;

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У Вас вот так не получается?...

так получается... но в случае с GCC синтаксисом мы можем просто объявить структуру и она будет сразу выровнена(выравнивание задано при описании), а с случае IARa при объявлении КАЖДОГО нового экземпляра структуры придется прописывать перед ней pragma. Вот я и спрашиваю, можно ли сделать полный эквивалент GCC-шного __attribure__(aligned(256))?

Изменено пользователем Chestor

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот я и спрашиваю...
Нет. Эта #pragma data_alignment распространяется только на переменные

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я тоже мучался с выравниванием в 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=

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...