Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Отключение printf
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
pokk
Добрый день, подскажите как в IAR настроить версию release что бы она игнорировала функции printf?

PS: Такое не предлагать, хочу натыкать printf в многих функциях и не хочу что бы оно мешало.
Код
#ifndef NODEBUG
printf(...);
#endif
inventor
Цитата(pokk @ Oct 29 2015, 08:18) *
Добрый день, подскажите как в IAR настроить версию release что бы она игнорировала функции printf?

PS: Такое не предлагать, хочу натыкать printf в многих функциях и не хочу что бы оно мешало.
Код
#ifndef NODEBUG
printf(...);
#endif

У меня так сделано
CODE

#if 0
IDEF int PRINTF(char* fmt,...)
{
return 0;
}
#else
#define PRINTF printf
#endif


так что лучше переписать
jcxz
Цитата(pokk @ Oct 29 2015, 11:18) *
PS: Такое не предлагать, хочу натыкать printf в многих функциях и не хочу что бы оно мешало.
Код
#ifndef NODEBUG
printf(...);
#endif

Определите свою функцию LogPrintf() с аргументами как у printf() и используйте её.
А в хидере напишите что-нить типа:
Код
#ifdef NODEBUG
#define LogPrintf(...)
#else
int LogPrintf(char const *, ...);
#endif

У меня так сделано для вывода логов, только дополнительно сделана возможность многоканальных логов, чтобы можно было включить/выключить не вообще весь отладочный вывод, а только отдельные каналы его. Разные составные части кода используют каждый свой номер лога, и можно вкл/выкл их вывод произвольно.
pokk
Цитата(inventor @ Oct 29 2015, 09:30) *
У меня так сделано

Что-то тут я не догнал =(( как выключение происходит.


Цитата(jcxz @ Oct 29 2015, 10:23) *
...только дополнительно сделана возможность многоканальных логов,...
А можно по подробнее?
Integro
Цитата(pokk @ Oct 29 2015, 09:42) *
Что-то тут я не догнал =(( как выключение происходит.

Понятно))
после вышеописанного, нужно в параметрах конфигурации для RELESE добавить дефайн NODEBUG.
Выбираем конфигурацию relese, затем project>options->C/C++ Compiler-> Preprocessor-> Defines symbols и добовляем туда NODEBUG.
scifi
Цитата(Integro @ Oct 29 2015, 10:13) *
после вышеописанного, нужно в параметрах конфигурации для RELESE добавить дефайн NODEBUG.

Кстати, по феншую надо писать NDEBUG. Так даже в стандарте написано.
pokk
Цитата(Integro @ Oct 29 2015, 11:13) *
...
после вышеописанного, нужно в параметрах конфигурации для RELESE добавить дефайн NODEBUG.
...

С этим как раз вопросов не было =)
Вот по коду ниже не понятно что за IDEF и что будет при #if 0
Код
#if 0
IDEF int PRINTF(char* fmt,...)
{
return 0;
}
#else
#define PRINTF printf
#endif


Цитата(scifi @ Oct 29 2015, 11:22) *
Кстати, по феншую надо писать NDEBUG. Так даже в стандарте написано.

Ага именно такой define сразу там стоял.

Сейчас разбираюсь с ошибкой:
Код
Error[Li005]: no definition for "__write" [referenced from putchar.o(dl7M_tln.a)]

Возникающей при выставление:
General Options -> Library Configuration -> Library low-level interface implementation ->None
Вместо
General Options -> Library Configuration -> Library low-level interface implementation -> stdout/stderr -> Via semihosting


AlexandrY
Цитата(pokk @ Oct 29 2015, 09:36) *
Сейчас разбираюсь с ошибкой:
Код
Error[Li005]: no definition for "__write" [referenced from putchar.o(dl7M_tln.a)]

Возникающей при выставление:
General Options -> Library Configuration -> Library low-level interface implementation ->None
Вместо
General Options -> Library Configuration -> Library low-level interface implementation -> stdout/stderr -> Via semihosting


Это значит, что применяете printf, а для потока STDOUT не назначили канал вывода.
А назначается он как раз через собственную реализацию функции __write.
Когда был включен semihosting, то реализация __write подставлялась из библиотек семихостинга, а теперь ее вам надо самому писать.

Либо как обычно переопределить дефайном типа так : #define printf my_printf
И написать свою функцию my_printf . Это будет легче и безопасней чем делать tailoring (адаптацию __write и еще кучи низкоуровневых функций) библиотек C на вашу платформу.
Хотя например в Keil выбрали путь адаптации и даже показывают как ее приспособить к файловой системе в RTOS RTX.
Но Keil-овский tailoring не подходит к IAR. Хотя в IAR есть пустые шаблоны для реализации адаптации, но надо помнить что между printf и __write лежит неизвестный код потребляющий неизвестно сколько стека и других ресурсов.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.