Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Как заставить в GCC printf выдавать в UART
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > GNU/OpenSource средства разработки
Alexey75
Хочу сделать чтобы функции, выводящие в стандартный вывод, выдавали например в UART.
Но пока не могу найти какие функции в GCC нужно определить или переопределить.
v_shamaev
Цитата(Alexey75 @ Dec 14 2007, 10:45) *
Хочу сделать чтобы функции, выводящие в стандартный вывод, выдавали например в UART.
Но пока не могу найти какие функции в GCC нужно определить или переопределить.

А причем здесь GCC? Printf выводит в стандартный поток вывода, а куда он назначен - зависит от системы, командной строки и т.д. Дистанция может быть большой.
Alexey75
Цитата(v_shamaev @ Dec 14 2007, 10:58) *
А причем здесь GCC? Printf выводит в стандартный поток вывода, а куда он назначен - зависит от системы, командной строки и т.д. Дистанция может быть большой.


Системы нет, программа пишется для контроллера, хочу для отладки через printf выводить сообщения в UART
alexander55
Цитата(Alexey75 @ Dec 14 2007, 11:16) *
Системы нет, программа пишется для контроллера, хочу для отладки через printf выводить сообщения в UART

Обычно для работы с UART надо определить функции getchar и putchar.
etoja
Почитай обсуждение этого вопроса здесь:
http://electronix.ru/forum/index.php?showt...amp;#entry69508
v_shamaev
Цитата(Alexey75 @ Dec 14 2007, 11:16) *
Системы нет, программа пишется для контроллера, хочу для отладки через printf выводить сообщения в UART

Понятно. Тогда библиотеки и sturtup править надо - в т.ч. и сам printf - убрать избыточность. Насколько помню, выводом занимается putc().
klen
ниче править не нада.
определи функцию

int putchar(int ch)
{
while (!(U1LSR & 0x20));
return (U1THR = ch) ;
}
//----------------------------------------------------------
int getchar(void)
{
while (!(U1LSR & 0x01));
return (U1RBR) ;
}

у меня все работает.
после вызовы scanf и printf будут сосать байты через UART1 и форматироваь ввод/вывод.
поскольку printf медленная в ней действительно можно выкинуть всякую хрень (например плавающую запятую )и сделать из нее "легкую" версию printf,
Как пример возмите исходники avr-libc, там она уже кастированая.
alexander55
Цитата(klen @ Dec 14 2007, 12:57) *
int putchar(int ch)
{
while (!(U1LSR & 0x20));
return (U1THR = ch) ;
}
//----------------------------------------------------------
int getchar(void)
{
while (!(U1LSR & 0x01));
return (U1RBR) ;
}

У меня аналогичное определение. biggrin.gif
v_shamaev
Цитата(alexander55 @ Dec 14 2007, 13:06) *
У меня аналогичное определение. biggrin.gif

Без тайм-аута? Можно навеки остаться в этом месте.
Alexey75
Определяю putchar, но при использовании printf, новая putchar не вызывается
klen
Цитата(Alexey75 @ Dec 14 2007, 13:26) *
Определяю putchar, но при использовании printf, новая putchar не вызывается

попрообуй определить _putchar или или как __putchar
странненько.
пройдись по выходному файлу arm-elf-objdump -D -S image.elf > image.lss
посмотри куда реально уходит printf
alexander55
Цитата(v_shamaev @ Dec 14 2007, 13:23) *
Без тайм-аута? Можно навеки остаться в этом месте.

Я функции типа printf использую для отладки, т.е. в конечный продукт они не попадают (упаси боже - это вопрос надежности работы). А рабочие либо ожидания либо с таймаутом, либо if без зацикливаний.
axle
Цитата(Alexey75 @ Dec 14 2007, 16:26) *
Определяю putchar, но при использовании printf, новая putchar не вызывается

Не надо никаких putchar.
Есть специальные функции "system calls". Они должны быть портированы под твою платформу.

Все зависит от того, с какой библиотекой собран gcc. Если с newlib, то делать надо так:
http://www.siwawi.arubi.uni-kl.de/avr_proj...ects/#gcc_stdio

Посмотри также документацию на newlib:
http://sourceware.org/newlib/

P.S. В newlib функция printf жрет память и ресурсы безбожно, советую по возможности не пользоваться. Если все таки будешь не забудь выделить стек побольше. Для printf надо что-то около 500 байт.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.