реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Условная компиляция в WinAVR
injen-d
сообщение Apr 17 2008, 16:54
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 91
Регистрация: 10-10-07
Из: Воронежа
Пользователь №: 31 250



Хочу, чтоб компилился кусок кода(обработчик прерывания), только если используется нужная мне функция(которая собственно использует эти прерывания).
В CodeVisionAVR есть удобное средство:
Код
#if funcused имя_функции_без_скобок

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

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


--------------------
- Бендер, ты же робот, зачем тебе пить пиво?
- Незачем! Я могу бросить в любой момент!
Go to the top of the page
 
+Quote Post
Terminator
сообщение Apr 18 2008, 02:32
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 209
Регистрация: 7-12-04
Из: Томск
Пользователь №: 1 382



Разве обычный ifdef не сработает?

типа
#ifdef имя_функции_без скобок
#endif
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Apr 18 2008, 03:09
Сообщение #3


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(Terminator @ Apr 18 2008, 08:32) *
Разве обычный ifdef не сработает?


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

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


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Aleksandr Barano...
сообщение Apr 18 2008, 15:24
Сообщение #4


Частый гость
**

Группа: Участник
Сообщений: 169
Регистрация: 31-08-05
Из: New York
Пользователь №: 8 118



Цитата(AHTOXA @ Apr 17 2008, 23:09) *
Нет, функция может быть defined, но не used.

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

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


--------------------
ASB
Go to the top of the page
 
+Quote Post
mdmitry
сообщение Apr 18 2008, 16:30
Сообщение #5


Начинающий профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 25-10-06
Из: СПб
Пользователь №: 21 648



Заведите
#define TEST

а в коде
#if defined TEST

.......
#endif

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

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

Если надо глобально все пересобирать, то в опциях makefile можно добавить к ключу: -D TEST


--------------------
Наука изощряет ум; ученье вострит память. Козьма Прутков
Go to the top of the page
 
+Quote Post
injen-d
сообщение Apr 18 2008, 17:09
Сообщение #6


Частый гость
**

Группа: Свой
Сообщений: 91
Регистрация: 10-10-07
Из: Воронежа
Пользователь №: 31 250



Цитата(mdmitry @ Apr 18 2008, 20:30) *
Заведите
#define TEST

а в коде
#if defined TEST

.......
#endif

Именно так мне и пришлось сделать. crying.gif Но в том-то и весь вопрос был, чтоб никуда не нужно было лезть, и ничего там не нужно было править. Скопировал три(в моем случае) файла в новый проэкт и, ничего там не меняя, просто начал оттуда пользоваться некоторыми функциями. И если для работы использованной функции нужны какие-то прерывания, то компилятся соответствующие обработчики.
Ну, впрочем, если в GCC так нельзя сделать - придется смириться. crying.gif


--------------------
- Бендер, ты же робот, зачем тебе пить пиво?
- Незачем! Я могу бросить в любой момент!
Go to the top of the page
 
+Quote Post
Maddy
сообщение Apr 18 2008, 18:45
Сообщение #7


Участник
*

Группа: Validating
Сообщений: 56
Регистрация: 15-10-06
Пользователь №: 21 335



То-ли я вопроса не понял , то-ли гранаты не той системы
для gcc OPTIMIZATION = -O3 -ffunction-sections -fdata-sections
для ld LD_EXTRA_FLAGS = -Wl,--gc-sections
и все не используемые финкции спокойно выкидываються .....
ЗЫ это из мейка для gcc-avr32 - работает однако wink.gif
Go to the top of the page
 
+Quote Post
ReAl
сообщение Apr 18 2008, 19:33
Сообщение #8


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Обработчик прерываний таким образом не выбросится, он "используется" всегда (на него есть ссылка из таблицы векторов).


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
injen-d
сообщение Apr 18 2008, 19:33
Сообщение #9


Частый гость
**

Группа: Свой
Сообщений: 91
Регистрация: 10-10-07
Из: Воронежа
Пользователь №: 31 250



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

Вы не поняли вопроса. Все что Вы написали конечно же используется. Но, как я написал, я хочу условно компилить обработчик прерывания, а на них указанные Вами флаги не распространяются, потому как эти функции(обработчики) вызываются при возникновении прерывания, а не из программы, поэтому компилятор их использование/неиспользование определить не может, поэтому они линкуются всегда.


--------------------
- Бендер, ты же робот, зачем тебе пить пиво?
- Незачем! Я могу бросить в любой момент!
Go to the top of the page
 
+Quote Post
Maddy
сообщение Apr 19 2008, 10:57
Сообщение #10


Участник
*

Группа: Validating
Сообщений: 56
Регистрация: 15-10-06
Пользователь №: 21 335



"Признаю свою вину "© Филатов
Речь похоже идет о WinAvr ? Тогда да - этот метод не катит wink.gif Остаеться только #if / #ifdef
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Apr 19 2008, 11:10
Сообщение #11


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Maddy @ Apr 19 2008, 13:57) *
Речь похоже идет о WinAvr ?
lol.gif А вы на название ветки внимания не обратили?


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Maddy
сообщение Apr 19 2008, 11:29
Сообщение #12


Участник
*

Группа: Validating
Сообщений: 56
Регистрация: 15-10-06
Пользователь №: 21 335



Стормозил sad.gif Однако в последнее время мысли только о avr32 - а тама другие правила игры wink.gif
Go to the top of the page
 
+Quote Post
mdmitry
сообщение Apr 19 2008, 12:06
Сообщение #13


Начинающий профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 25-10-06
Из: СПб
Пользователь №: 21 648



Цитата(injen-d @ Apr 18 2008, 23:33) *
Вы не поняли вопроса. Все что Вы написали конечно же используется. Но, как я написал, я хочу условно компилить обработчик прерывания, а на них указанные Вами флаги не распространяются, потому как эти функции(обработчики) вызываются при возникновении прерывания, а не из программы, поэтому компилятор их использование/неиспользование определить не может, поэтому они линкуются всегда.

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

Стоит один раз продумать макросы для компиляции и далее этим пользоваться. Сначала сложно писать, не забывая ставить команды препроцессора, потом "рука набивается".


--------------------
Наука изощряет ум; ученье вострит память. Козьма Прутков
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 7th July 2025 - 06:09
Рейтинг@Mail.ru


Страница сгенерированна за 0.01488 секунд с 7
ELECTRONIX ©2004-2016