Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Условная компиляция в WinAVR
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > GNU/OpenSource средства разработки
injen-d
Хочу, чтоб компилился кусок кода(обработчик прерывания), только если используется нужная мне функция(которая собственно использует эти прерывания).
В CodeVisionAVR есть удобное средство:
Код
#if funcused имя_функции_без_скобок

А вот в GCC, как ни искал - ничего похожего не нашел.
Все бы ничего, но объявленный обработчик прерывания линкуется, как и положено, в любом случае.
Код
ISR(USART_UDRE_vect)
{}

Есть ли альтернатива #if funcused ? Очень хочется, чтоб критерием выбора компилировать/не компилировать был только факт использования в итоговом(после выброса мусора) коде какой-либо, нужной мне функции.
Terminator
Разве обычный ifdef не сработает?

типа
#ifdef имя_функции_без скобок
#endif
AHTOXA
Цитата(Terminator @ Apr 18 2008, 08:32) *
Разве обычный ifdef не сработает?


Нет, функция может быть defined, но не used.

По сути вопроса - вряд ли. Препроцессор совершенно не в курсе, какая функция используется, а какая - нет.
Aleksandr Baranov
Цитата(AHTOXA @ Apr 17 2008, 23:09) *
Нет, функция может быть defined, но не used.

По сути вопроса - вряд ли. Препроцессор совершенно не в курсе, какая функция используется, а какая - нет.

Более того, если не принять специальных мер - неиспользуемые функции успешно прилинкуются и включатся в hex-файл.
mdmitry
Заведите
#define TEST

а в коде
#if defined TEST

.......
#endif

Посмотрите стандартные заголовочные файлы. В них есть условная компиляция.

Сам постоянно пользуюсь. В зависимости от устройства могут вызываться драйвера физического уровня разные (SPI или UART), а общая идеалогия обработки устройств единая. Удобно подсовывать соответствующие функции с помощью условной компиляции.

Если надо глобально все пересобирать, то в опциях makefile можно добавить к ключу: -D TEST
injen-d
Цитата(mdmitry @ Apr 18 2008, 20:30) *
Заведите
#define TEST

а в коде
#if defined TEST

.......
#endif

Именно так мне и пришлось сделать. crying.gif Но в том-то и весь вопрос был, чтоб никуда не нужно было лезть, и ничего там не нужно было править. Скопировал три(в моем случае) файла в новый проэкт и, ничего там не меняя, просто начал оттуда пользоваться некоторыми функциями. И если для работы использованной функции нужны какие-то прерывания, то компилятся соответствующие обработчики.
Ну, впрочем, если в GCC так нельзя сделать - придется смириться. crying.gif
Maddy
То-ли я вопроса не понял , то-ли гранаты не той системы
для gcc OPTIMIZATION = -O3 -ffunction-sections -fdata-sections
для ld LD_EXTRA_FLAGS = -Wl,--gc-sections
и все не используемые финкции спокойно выкидываються .....
ЗЫ это из мейка для gcc-avr32 - работает однако wink.gif
ReAl
Обработчик прерываний таким образом не выбросится, он "используется" всегда (на него есть ссылка из таблицы векторов).
injen-d
Цитата(Maddy @ Apr 18 2008, 22:45) *
То-ли я вопроса не понял , то-ли гранаты не той системы
для gcc OPTIMIZATION = -O3 -ffunction-sections -fdata-sections
для ld LD_EXTRA_FLAGS = -Wl,--gc-sections
и все не используемые финкции спокойно выкидываються .....
ЗЫ это из мейка для gcc-avr32 - работает однако wink.gif

Вы не поняли вопроса. Все что Вы написали конечно же используется. Но, как я написал, я хочу условно компилить обработчик прерывания, а на них указанные Вами флаги не распространяются, потому как эти функции(обработчики) вызываются при возникновении прерывания, а не из программы, поэтому компилятор их использование/неиспользование определить не может, поэтому они линкуются всегда.
Maddy
"Признаю свою вину "© Филатов
Речь похоже идет о WinAvr ? Тогда да - этот метод не катит wink.gif Остаеться только #if / #ifdef
Сергей Борщ
Цитата(Maddy @ Apr 19 2008, 13:57) *
Речь похоже идет о WinAvr ?
lol.gif А вы на название ветки внимания не обратили?
Maddy
Стормозил sad.gif Однако в последнее время мысли только о avr32 - а тама другие правила игры wink.gif
mdmitry
Цитата(injen-d @ Apr 18 2008, 23:33) *
Вы не поняли вопроса. Все что Вы написали конечно же используется. Но, как я написал, я хочу условно компилить обработчик прерывания, а на них указанные Вами флаги не распространяются, потому как эти функции(обработчики) вызываются при возникновении прерывания, а не из программы, поэтому компилятор их использование/неиспользование определить не может, поэтому они линкуются всегда.

У меня в обработчике прерываний есть условная компиляция. В разных avr (ATmega128 и ATmega1281, ATmega2561) разные регистры для периферии, а идея обработки данных в разных програмах одна. Чтобы сделать единую обработку пришлость делать условную компиляцию по типу процессора, а также, по типу устройства (у меня их несколько).
Можете и обработчик прерывания обернуть в условную компиляцию.

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