Jump to content

    
Sign in to follow this  
chechestor

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

Recommended Posts

Добрый день.

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

Share this post


Link to post
Share on other sites

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

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

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

#pragma pack(pop)

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

 

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

 

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

Share this post


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

struct ohci_hcca {
...
};

#pragma data_alignment=256
struct ohci_hcca sA;

 

Share this post


Link to post
Share on other sites
У Вас вот так не получается?...

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

Edited by Chestor

Share this post


Link to post
Share on other sites

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

Edited by =Zap=

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this