|
|
  |
Условная компиляция в WinAVR |
|
|
|
Apr 17 2008, 16:54
|

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

|
Хочу, чтоб компилился кусок кода(обработчик прерывания), только если используется нужная мне функция(которая собственно использует эти прерывания). В CodeVisionAVR есть удобное средство: Код #if funcused имя_функции_без_скобок А вот в GCC, как ни искал - ничего похожего не нашел. Все бы ничего, но объявленный обработчик прерывания линкуется, как и положено, в любом случае. Код ISR(USART_UDRE_vect) {} Есть ли альтернатива #if funcused ? Очень хочется, чтоб критерием выбора компилировать/не компилировать был только факт использования в итоговом(после выброса мусора) коде какой-либо, нужной мне функции.
--------------------
- Бендер, ты же робот, зачем тебе пить пиво? - Незачем! Я могу бросить в любой момент!
|
|
|
|
|
Apr 18 2008, 15:24
|
Частый гость
 
Группа: Участник
Сообщений: 169
Регистрация: 31-08-05
Из: New York
Пользователь №: 8 118

|
Цитата(AHTOXA @ Apr 17 2008, 23:09)  Нет, функция может быть defined, но не used.
По сути вопроса - вряд ли. Препроцессор совершенно не в курсе, какая функция используется, а какая - нет. Более того, если не принять специальных мер - неиспользуемые функции успешно прилинкуются и включатся в hex-файл.
--------------------
ASB
|
|
|
|
|
Apr 18 2008, 17:09
|

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

|
Цитата(mdmitry @ Apr 18 2008, 20:30)  Заведите #define TEST
а в коде #if defined TEST
....... #endif Именно так мне и пришлось сделать.  Но в том-то и весь вопрос был, чтоб никуда не нужно было лезть, и ничего там не нужно было править. Скопировал три(в моем случае) файла в новый проэкт и, ничего там не меняя, просто начал оттуда пользоваться некоторыми функциями. И если для работы использованной функции нужны какие-то прерывания, то компилятся соответствующие обработчики. Ну, впрочем, если в GCC так нельзя сделать - придется смириться.
--------------------
- Бендер, ты же робот, зачем тебе пить пиво? - Незачем! Я могу бросить в любой момент!
|
|
|
|
|
Apr 18 2008, 18:45
|
Участник

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

|
То-ли я вопроса не понял , то-ли гранаты не той системы для gcc OPTIMIZATION = -O3 -ffunction-sections -fdata-sections для ld LD_EXTRA_FLAGS = -Wl,--gc-sections и все не используемые финкции спокойно выкидываються ..... ЗЫ это из мейка для gcc-avr32 - работает однако
|
|
|
|
|
Apr 18 2008, 19:33
|

Частый гость
 
Группа: Свой
Сообщений: 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 - работает однако  Вы не поняли вопроса. Все что Вы написали конечно же используется. Но, как я написал, я хочу условно компилить обработчик прерывания, а на них указанные Вами флаги не распространяются, потому как эти функции(обработчики) вызываются при возникновении прерывания, а не из программы, поэтому компилятор их использование/неиспользование определить не может, поэтому они линкуются всегда.
--------------------
- Бендер, ты же робот, зачем тебе пить пиво? - Незачем! Я могу бросить в любой момент!
|
|
|
|
|
Apr 19 2008, 10:57
|
Участник

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

|
"Признаю свою вину "© Филатов Речь похоже идет о WinAvr ? Тогда да - этот метод не катит  Остаеться только #if / #ifdef
|
|
|
|
|
Apr 19 2008, 12:06
|

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

|
Цитата(injen-d @ Apr 18 2008, 23:33)  Вы не поняли вопроса. Все что Вы написали конечно же используется. Но, как я написал, я хочу условно компилить обработчик прерывания, а на них указанные Вами флаги не распространяются, потому как эти функции(обработчики) вызываются при возникновении прерывания, а не из программы, поэтому компилятор их использование/неиспользование определить не может, поэтому они линкуются всегда. У меня в обработчике прерываний есть условная компиляция. В разных avr (ATmega128 и ATmega1281, ATmega2561) разные регистры для периферии, а идея обработки данных в разных програмах одна. Чтобы сделать единую обработку пришлость делать условную компиляцию по типу процессора, а также, по типу устройства (у меня их несколько). Можете и обработчик прерывания обернуть в условную компиляцию. Стоит один раз продумать макросы для компиляции и далее этим пользоваться. Сначала сложно писать, не забывая ставить команды препроцессора, потом "рука набивается".
--------------------
Наука изощряет ум; ученье вострит память. Козьма Прутков
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|