Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Выравнивание по границе слова в Atmel Studio 6 (Atxmega)
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
stalko
Всем доброго времени суток!
Столкнулся с абсолютно дурацкой проблемой: мне необходимо, чтобы одна из структур в моей программе была выровнена по границе слова. Вроде все просто и понятно: ставлю атрибут гнутого __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
Возможно, кто-то сталкивался и смог решить проблему. Я пока положил пустую волатайловскую переменную впереди, все работает, но это бред со самой своей сути.
Заранее благодарен за любую помощь!
defunct
http://www.avrfreaks.net/index.php?name=PN...874&start=0

У меня правда установлен GCC4.2.2 так что не имел возможности посмотреть работает ли упомянутый багфикс в 4.3 / 4.4.
Но то что выравнивание не работает в 4.2.2, а также игнорируется #pragma pack это есть такое.
_Pasha
gcc version 4.5.3
Код
main.c:5:0: warning: ignoring #pragma pack

sad.gif огорчили
stalko
Цитата(_Pasha @ Dec 6 2012, 08:23) *
gcc version 4.5.3
Код
main.c:5:0: warning: ignoring #pragma pack

Походу, остается только один вариант: объявлять секцию и класть в нее переменную через аттрибут "section". Тока это секций не напасешься, если много выравниваемых переменных... wacko.gif
P.S. Чтоб не быть голословным, а заодно проверить, работает ли атрибут "section", попробовал так и сделать. Все получилось. Структура легла на четный фиксированный адрес. Неудобно, зато надежно.
demiurg_spb
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

defunct
Цитата(demiurg_spb @ Dec 6 2012, 08:04) *
avr-gcc 4.7.2
#pragma pack(push, 1)

Дык, pack=1 это значение по-умолчанию. А как насчет pack = 4. Принимает без вопросов и warning'ов, но на деле выравнивания на 4 не делает (в 4.2.2).
demiurg_spb
Цитата(defunct @ Dec 6 2012, 15:40) *
pack = 4. Принимает без вопросов и warning'ов, но на деле выравнивания на 4 не делает
4.7.2 аналогично:-(
stalko
Цитата(demiurg_spb @ Dec 6 2012, 10:04) *
Код
CFLAGS += -fpack-struct

Имеется, но в деле выравнивания по слову не помогает
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.