stalko 0 5 декабря, 2012 Опубликовано 5 декабря, 2012 · Жалоба Всем доброго времени суток! Столкнулся с абсолютно дурацкой проблемой: мне необходимо, чтобы одна из структур в моей программе была выровнена по границе слова. Вроде все просто и понятно: ставлю атрибут гнутого __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 0 6 декабря, 2012 Опубликовано 6 декабря, 2012 · Жалоба http://www.avrfreaks.net/index.php?name=PN...874&start=0 У меня правда установлен GCC4.2.2 так что не имел возможности посмотреть работает ли упомянутый багфикс в 4.3 / 4.4. Но то что выравнивание не работает в 4.2.2, а также игнорируется #pragma pack это есть такое. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_Pasha 0 6 декабря, 2012 Опубликовано 6 декабря, 2012 (изменено) · Жалоба gcc version 4.5.3 main.c:5:0: warning: ignoring #pragma pack :( огорчили Изменено 6 декабря, 2012 пользователем _Pasha Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
stalko 0 6 декабря, 2012 Опубликовано 6 декабря, 2012 · Жалоба gcc version 4.5.3 main.c:5:0: warning: ignoring #pragma pack Походу, остается только один вариант: объявлять секцию и класть в нее переменную через аттрибут "section". Тока это секций не напасешься, если много выравниваемых переменных... P.S. Чтоб не быть голословным, а заодно проверить, работает ли атрибут "section", попробовал так и сделать. Все получилось. Структура легла на четный фиксированный адрес. Неудобно, зато надежно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
demiurg_spb 0 6 декабря, 2012 Опубликовано 6 декабря, 2012 · Жалоба 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 0 6 декабря, 2012 Опубликовано 6 декабря, 2012 · Жалоба avr-gcc 4.7.2 #pragma pack(push, 1) Дык, pack=1 это значение по-умолчанию. А как насчет pack = 4. Принимает без вопросов и warning'ов, но на деле выравнивания на 4 не делает (в 4.2.2). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
demiurg_spb 0 6 декабря, 2012 Опубликовано 6 декабря, 2012 · Жалоба pack = 4. Принимает без вопросов и warning'ов, но на деле выравнивания на 4 не делает4.7.2 аналогично:-( Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
stalko 0 6 декабря, 2012 Опубликовано 6 декабря, 2012 · Жалоба CFLAGS += -fpack-struct Имеется, но в деле выравнивания по слову не помогает Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться