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

 
 
 
Reply to this topicStart new topic
> Отключение printf, Версия release
pokk
сообщение Oct 29 2015, 05:18
Сообщение #1


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

Группа: Участник
Сообщений: 91
Регистрация: 3-07-11
Пользователь №: 66 028



Добрый день, подскажите как в IAR настроить версию release что бы она игнорировала функции printf?

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


Сообщение отредактировал pokk - Oct 29 2015, 05:25
Go to the top of the page
 
+Quote Post
inventor
сообщение Oct 29 2015, 05:30
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 524
Регистрация: 25-12-08
Из: Москва
Пользователь №: 42 748



Цитата(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


так что лучше переписать
Go to the top of the page
 
+Quote Post
jcxz
сообщение Oct 29 2015, 06:23
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



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

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

У меня так сделано для вывода логов, только дополнительно сделана возможность многоканальных логов, чтобы можно было включить/выключить не вообще весь отладочный вывод, а только отдельные каналы его. Разные составные части кода используют каждый свой номер лога, и можно вкл/выкл их вывод произвольно.
Go to the top of the page
 
+Quote Post
pokk
сообщение Oct 29 2015, 06:42
Сообщение #4


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

Группа: Участник
Сообщений: 91
Регистрация: 3-07-11
Пользователь №: 66 028



Цитата(inventor @ Oct 29 2015, 09:30) *
У меня так сделано

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


Цитата(jcxz @ Oct 29 2015, 10:23) *
...только дополнительно сделана возможность многоканальных логов,...
А можно по подробнее?
Go to the top of the page
 
+Quote Post
Integro
сообщение Oct 29 2015, 07:13
Сообщение #5


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

Группа: Свой
Сообщений: 167
Регистрация: 25-12-09
Из: Минск
Пользователь №: 54 460



Цитата(pokk @ Oct 29 2015, 09:42) *
Что-то тут я не догнал =(( как выключение происходит.

Понятно))
после вышеописанного, нужно в параметрах конфигурации для RELESE добавить дефайн NODEBUG.
Выбираем конфигурацию relese, затем project>options->C/C++ Compiler-> Preprocessor-> Defines symbols и добовляем туда NODEBUG.
Go to the top of the page
 
+Quote Post
scifi
сообщение Oct 29 2015, 07:22
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



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

Кстати, по феншую надо писать NDEBUG. Так даже в стандарте написано.
Go to the top of the page
 
+Quote Post
pokk
сообщение Oct 29 2015, 07:36
Сообщение #7


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

Группа: Участник
Сообщений: 91
Регистрация: 3-07-11
Пользователь №: 66 028



Цитата(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


Go to the top of the page
 
+Quote Post
AlexandrY
сообщение Oct 29 2015, 08:07
Сообщение #8


Ally
******

Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050



Цитата(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 лежит неизвестный код потребляющий неизвестно сколько стека и других ресурсов.
Go to the top of the page
 
+Quote Post

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

 


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


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