Цитата(kovz @ May 22 2009, 22:14)

По умолчанию printf(_P) выводит данные в stdout. По идее, на сколько я понял, в Normal Dlib stdout linebuffered. Судя по исходникам библиотек, буфер статический на 80 байт(тоже и по документации). Так вот вопрос знатокам: возможно ли сделать так, чтоб при вызове printf(_P)данные записывались в этот буфер, а потом функция передачи по USART, построенная на прерываниях, выводила это всё в порт?
"всё не так" .
Нужен не printf, а
fprintf.
Определяем функцию, которая "выводит байт в UART" (на самом деле она может помещать его в циклический буфер, выгребаемый из прерываний, а уж если там нет места - тогда ждать) и определяем файловый объект
Код
#include <stdio.h>
int console_putc(char ch, FILE*stream)
{
(void)stream;
while( uart_tx_buffer_full() );
uart_tx_buffer_put(ch);
return 0;
}
FILE console_file = FDEV_SETUP_STREAM(console_putc, 0, _FDEV_SETUP_WRITE);
#define fconsole (&console_file)
Теперь можно так:
Код
fprintf_P( fconsole, PSTR("Hello %5d times!!!"), 1000);
А можно так:
Код
void dbg_printf_P(dbg_level lev, const prog_char * fmt, ...)
{
if (lev <= curr_lev) {
va_list va;
va_start(va, fmt);
vfprintf_P(fconsole, fmt, va);
va_end(va);
}
}
Что приятно - это не мешает параллельно создать файловый объект ЖКИ-индикатора (настроив его на соответствующую функцию вывода) или "ещё чего надо" и выводить тем же fprintf-ом и туда тоже.
А вообще - смотрите описание avr-libc
Ой, не заметил сначала.
Цитата(kovz @ May 22 2009, 22:14)

Функция printf_P в качестве строки формата принимает строку из flash? а в качестве аргументов данные из ОЗУ.
Это окончательно и безповоротно (если говорить о библиотечной реализации).
Смотрите то же описание avr-libc. Если имеются ввиду аргументы - числа, то это так.
Для строк поддерживается расширение:
%s - из ОЗУ, %S - из флеша.