Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: printf в DLIB и CLIB
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
Andy_F
В процессе освоения IAR возник следующий вопрос:

Есть программа на C (не на C++), в которой хочется применить printf(). Для этого, как известно из других реализаций C, необходимо переопределить putchar() (иногда putch()).

В то же время, в документации вроде бы утверждается, что библиотека CLIB является рудиментом, её использование нежелательно, и пользуйтесь, дорогие товарищи, DLIB.

Так вот, при попытке воспользоваться printf() совместно с DLIB выяснилось, что в этом случае надо пререопределять не __puthar(), а __write() со всякой галиматьёй вроде handle потока вывода.

Во первых, write в таком контексте - это C++, а во вторых мне такой вариант не нужен в данном случае. Получается, хочешь пользоваться printf в C-варианте - пользуйся CLIB ? blink.gif
zltigo
Цитата(Andy_F @ Jul 27 2006, 21:22) *
Есть программа на C (не на C++), в которой хочется применить printf().

Это он для существующего putchar() хочет write().
А Вам свой нужен, например, такой:

Код
int putchar( int char )
{    
    my_out_char( char );
    return( 0 );
}


А вообще, даже в мыслях не было в свое время заморачиваться вопросом с __putchar, ибо сразу привычно набивается что-то типа:
Код
void bprintf( char *arg_list, ...)
{
va_list arg_buffer;
char *tbptr = tobuf;
    va_start( arg_buffer, arg_list );
    vsprintf( tobuf, arg_list, arg_buffer );
      while( *tbptr )
        boutchar( *tbptr++ );
}
Andy_F
[quote name='zltigo' date='Jul 28 2006, 00:11' post='138541']
Это он для существующего putchar() хочет write().
А Вам свой нужен, например, такой:

Код
int putchar( int char )
{    
    my_out_char( char );
    return( 0 );
}


Я с этого и начал, но при DLIB IAR со мной не согласился, только при CLIB... sad.gif

[quote name='zltigo' date='Jul 28 2006, 00:11' post='138541']
А вообще, даже в мыслях не было в свое время заморачиваться вопросом с __putchar, ибо сразу привычно набивается что-то типа:
Код
void bprintf( char *arg_list, ...)
{
va_list arg_buffer;
char *tbptr = tobuf;
    va_start( arg_buffer, arg_list );
    vsprintf( tobuf, arg_list, arg_buffer );
      while( *tbptr )
        boutchar( *tbptr++ );
}

[/quote]

В таком варианте надо буфер выделять, потом этот буфер своими силами (boutchar) в цикле куда-то посылать. Для меня это лишнее, мне надо вывод на LCD, и удобно было-бы просто в качестве putchar() написать "обёртку" для процедуры вывода символа.
zltigo
Цитата(Andy_F @ Jul 27 2006, 23:38) *
Я с этого и начал, но при DLIB IAR со мной не согласился, только при CLIB... sad.gif

Что-то Вы запутались, не пойму только в чем. С DLIB работает (линковка библиотек dl4xxxx ) При этом действительно требует write(), но как вызов из обертки printchar(), но printchar() то ставите свой.

Цитата(zltigo @ Jul 28 2006, 00:11) *
В таком варианте надо буфер выделять, потом этот буфер своими силами (boutchar) в цикле куда-то посылать. Для меня это лишнее, мне надо вывод на LCD, и удобно было-бы просто в качестве putchar() написать "обёртку" для процедуры вывода символа.

printf() тоже накладные расходы имеет :-(. Буфер может быть статическим общего назначения.
Ну а если LCD примитивный символьный, то вполне возможно через буфер удобнее строчку выводить. Если, например, несколько задач к медленному LCD должны лазить.
Andy_F
Спасибо. Попробую ещё раз.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.