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

 
 
 
Reply to this topicStart new topic
> Как заставить в GCC printf выдавать в UART
Alexey75
сообщение Dec 14 2007, 07:45
Сообщение #1


Участник
*

Группа: Новичок
Сообщений: 25
Регистрация: 10-04-06
Пользователь №: 15 981



Хочу сделать чтобы функции, выводящие в стандартный вывод, выдавали например в UART.
Но пока не могу найти какие функции в GCC нужно определить или переопределить.
Go to the top of the page
 
+Quote Post
v_shamaev
сообщение Dec 14 2007, 07:58
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 304
Регистрация: 5-07-04
Из: г. Москва
Пользователь №: 259



Цитата(Alexey75 @ Dec 14 2007, 10:45) *
Хочу сделать чтобы функции, выводящие в стандартный вывод, выдавали например в UART.
Но пока не могу найти какие функции в GCC нужно определить или переопределить.

А причем здесь GCC? Printf выводит в стандартный поток вывода, а куда он назначен - зависит от системы, командной строки и т.д. Дистанция может быть большой.


--------------------
Водку пьянствовать и безобразия нарушать!!!
Go to the top of the page
 
+Quote Post
Alexey75
сообщение Dec 14 2007, 08:16
Сообщение #3


Участник
*

Группа: Новичок
Сообщений: 25
Регистрация: 10-04-06
Пользователь №: 15 981



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


Системы нет, программа пишется для контроллера, хочу для отладки через printf выводить сообщения в UART
Go to the top of the page
 
+Quote Post
alexander55
сообщение Dec 14 2007, 08:50
Сообщение #4


Бывалый
*****

Группа: Свой
Сообщений: 1 584
Регистрация: 7-08-07
Пользователь №: 29 615



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

Обычно для работы с UART надо определить функции getchar и putchar.
Go to the top of the page
 
+Quote Post
etoja
сообщение Dec 14 2007, 08:51
Сообщение #5


Профессионал
*****

Группа: Свой
Сообщений: 1 121
Регистрация: 14-01-05
Из: Москва
Пользователь №: 1 952



Почитай обсуждение этого вопроса здесь:
http://electronix.ru/forum/index.php?showt...amp;#entry69508
Go to the top of the page
 
+Quote Post
v_shamaev
сообщение Dec 14 2007, 09:10
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 304
Регистрация: 5-07-04
Из: г. Москва
Пользователь №: 259



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

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


--------------------
Водку пьянствовать и безобразия нарушать!!!
Go to the top of the page
 
+Quote Post
klen
сообщение Dec 14 2007, 09:57
Сообщение #7


бессмертным стать можно тремя способами
*****

Группа: Свой
Сообщений: 1 405
Регистрация: 9-05-06
Из: Москва
Пользователь №: 16 912



ниче править не нада.
определи функцию

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, там она уже кастированая.
Go to the top of the page
 
+Quote Post
alexander55
сообщение Dec 14 2007, 10:06
Сообщение #8


Бывалый
*****

Группа: Свой
Сообщений: 1 584
Регистрация: 7-08-07
Пользователь №: 29 615



Цитата(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
Go to the top of the page
 
+Quote Post
v_shamaev
сообщение Dec 14 2007, 10:23
Сообщение #9


Местный
***

Группа: Свой
Сообщений: 304
Регистрация: 5-07-04
Из: г. Москва
Пользователь №: 259



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

Без тайм-аута? Можно навеки остаться в этом месте.


--------------------
Водку пьянствовать и безобразия нарушать!!!
Go to the top of the page
 
+Quote Post
Alexey75
сообщение Dec 14 2007, 10:26
Сообщение #10


Участник
*

Группа: Новичок
Сообщений: 25
Регистрация: 10-04-06
Пользователь №: 15 981



Определяю putchar, но при использовании printf, новая putchar не вызывается
Go to the top of the page
 
+Quote Post
klen
сообщение Dec 14 2007, 10:47
Сообщение #11


бессмертным стать можно тремя способами
*****

Группа: Свой
Сообщений: 1 405
Регистрация: 9-05-06
Из: Москва
Пользователь №: 16 912



Цитата(Alexey75 @ Dec 14 2007, 13:26) *
Определяю putchar, но при использовании printf, новая putchar не вызывается

попрообуй определить _putchar или или как __putchar
странненько.
пройдись по выходному файлу arm-elf-objdump -D -S image.elf > image.lss
посмотри куда реально уходит printf
Go to the top of the page
 
+Quote Post
alexander55
сообщение Dec 14 2007, 11:04
Сообщение #12


Бывалый
*****

Группа: Свой
Сообщений: 1 584
Регистрация: 7-08-07
Пользователь №: 29 615



Цитата(v_shamaev @ Dec 14 2007, 13:23) *
Без тайм-аута? Можно навеки остаться в этом месте.

Я функции типа printf использую для отладки, т.е. в конечный продукт они не попадают (упаси боже - это вопрос надежности работы). А рабочие либо ожидания либо с таймаутом, либо if без зацикливаний.
Go to the top of the page
 
+Quote Post
axle
сообщение Dec 14 2007, 11:21
Сообщение #13


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

Группа: Новичок
Сообщений: 81
Регистрация: 19-04-07
Пользователь №: 27 167



Цитата(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 байт.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 19th June 2025 - 09:13
Рейтинг@Mail.ru


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