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

Выравнивание по границе слова в Atmel Studio 6 (Atxmega)

Всем доброго времени суток!

Столкнулся с абсолютно дурацкой проблемой: мне необходимо, чтобы одна из структур в моей программе была выровнена по границе слова. Вроде все просто и понятно: ставлю атрибут гнутого __attribute__((aligned(2))), все вроде заработало. Потом добавил байтовую переменную, программа рушится. Сначала я не понял "юмора", затем полез в map-файл и обнаружил, что хоть атрибут и стоит, а структура лежит по нечетному адресу!!! Пробовал ставить и после объявления, и после struct и в описании типа. Пробовал вариант __attribute__((__aligned__(2))) Все одинаково.

Atmel Studio 6.0.1938 SP1. AVR GCC 3.4.065 AVR Toolchain 8 bit 3.4.0.663 - GCC 4.6.2

Возможно, кто-то сталкивался и смог решить проблему. Я пока положил пустую волатайловскую переменную впереди, все работает, но это бред со самой своей сути.

Заранее благодарен за любую помощь!

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


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

http://www.avrfreaks.net/index.php?name=PN...874&start=0

 

У меня правда установлен GCC4.2.2 так что не имел возможности посмотреть работает ли упомянутый багфикс в 4.3 / 4.4.

Но то что выравнивание не работает в 4.2.2, а также игнорируется #pragma pack это есть такое.

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


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

gcc version 4.5.3

main.c:5:0: warning: ignoring #pragma pack

:( огорчили

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

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


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

gcc version 4.5.3

main.c:5:0: warning: ignoring #pragma pack

Походу, остается только один вариант: объявлять секцию и класть в нее переменную через аттрибут "section". Тока это секций не напасешься, если много выравниваемых переменных... :wacko:

P.S. Чтоб не быть голословным, а заодно проверить, работает ли атрибут "section", попробовал так и сделать. Все получилось. Структура легла на четный фиксированный адрес. Неудобно, зато надежно.

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


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

avr-gcc 4.7.2

#pragma pack(push, 1)
typedef struct
{
    uint8_t a;
    uint8_t b;
    uint8_t c;
} abc_t;
#pragma pack(pop)

abc_t x = {1,2,3};

без вопросов.

 

Ну и вообще чтобы код не засорять прагмами, не стоит забывать о чудесном и очень полезном для 8-ми битников флаге:

CFLAGS += -fpack-struct

 

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


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

avr-gcc 4.7.2

#pragma pack(push, 1)

Дык, pack=1 это значение по-умолчанию. А как насчет pack = 4. Принимает без вопросов и warning'ов, но на деле выравнивания на 4 не делает (в 4.2.2).

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


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

pack = 4. Принимает без вопросов и warning'ов, но на деле выравнивания на 4 не делает
4.7.2 аналогично:-(

 

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


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

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

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

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

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

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

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

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

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

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