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

 
 
 
Reply to this topicStart new topic
> Перенапрвление вывода printf в AVR32Studio
altlogic
сообщение Feb 5 2009, 01:52
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 222
Регистрация: 2-12-06
Из: г. Хабаровск
Пользователь №: 23 035



Здравствуйте!

Кто-нибудь перенаправлял стандартный поток ввода вывода а AVR32Studio? Программа написана для UC3A. printf на UART1 ничего не выводит. Куда направлен поток понять не могу. В файле stdio.h видимых указаний на перенаправление потока не нашёл.


--------------------
С уважением, Вячеслав
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Feb 5 2009, 09:20
Сообщение #2


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Под avr-gcc делается так:
Код
//=============================================================================
int uart_putchar(char c, FILE *stream)
{
    if (c=='\n')
    {
        UART_write('\r');
    }
    return ((int)UART_write(c));
}

FILE mystdout = FDEV_SETUP_STREAM(uart_putchar, NULL, _FDEV_SETUP_WRITE);

stdout = &mystdout;
Под iccavr достаточно подключить к проекту свою собственную реализацию функции putc или putch, не помню точно.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Feb 5 2009, 11:34
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Как-то так:
CODE
#ifdef _write_r
#undef _write_r
#endif
int _write_r(struct _reent *ptr, int fd, const void *buf, size_t cnt);


/* printf rewrite functions */

/*! \brief Function to overload the standard _write_r, makes it possible
* to use printf() to output data.
*
* \param ptr not used
* \param fd not used
* \param buf the buffer to send
* \param cnt number of bytes to send
*
* \return Status
*/
int _write_r(struct _reent *ptr, int fd, const void *buf, size_t cnt)
{
volatile char *msg = (char *) buf;
volatile int i;

for (i=0; i < cnt; i++) {
us1_send_byte(*msg++);
}

return cnt;
}
Причина редактирования: Уменьшен визуальный объем цитируемого исходника.
Go to the top of the page
 
+Quote Post
Maddy
сообщение Feb 5 2009, 21:37
Сообщение #4


Участник
*

Группа: Validating
Сообщений: 56
Регистрация: 15-10-06
Пользователь №: 21 335



Хм , а прога-то что пользует ? Голый С ? SoftwareFramework ? Или нечто с FreeRtos (другой операционкой) ?
Про голый С - не скажу я Uc3a пльзую с FreeRtos/lwip и компанией для быстрых поделок - остальное

SwFw от атмела - в каталоге Drivers\usart\usart_example лежит пример использования кома без всего тяжелого ...
или в сторону \UTILS\DEBUG\print_funcs.h не принтф но .... для отладки сойдет wink.gif

если freertos не пугает - из applications\control_panel легко выдираеться printf_stdarg (этому прафда и ртос не нужон - переопределяеться int putchar(int c); через тот-же usart.c и вперед) - легкая леализация printf/sprintf (но перед использованием смотреть чего могет) и tracedump.c - тож помогает при отладке wink.gif (но уже с rtos'ом) и все прекрасно работает ....
ЗЫ сорри что сумбурно - пробегом с одного поезда на другой wink.gif Если что-то конкретное интересует - спрашивайте две железяки на uc3 сделали ....

Сообщение отредактировал Maddy - Feb 5 2009, 21:38
Go to the top of the page
 
+Quote Post
altlogic
сообщение Feb 6 2009, 01:00
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 222
Регистрация: 2-12-06
Из: г. Хабаровск
Пользователь №: 23 035



2 demiurg_spb
Из WinAVR я выдирал FILE mystdout = FDEV_SETUP_STREAM(uart_putchar, NULL, _FDEV_SETUP_WRITE);
Но там хидеры stdio.h написаны иначе. Без перелопачивания большого куска кода не получилось.

2 Maddy
Чистый Си. usart_example я использую для вывода строки и символа, хочу подцепить её к printf() пока что исключительно для дебага и для большей переносимости кода. По этой же причине не подходит print_funcs.с Про printf_stdarg с ходу сказать не могу, но помоему я там не нашёл printf(). RTOS не пугает, наоборот, хочу ей заняться, но сроки сдачи проекта сильно поджимают, и времени на её изучение нет.

2 aaarrr
_write_r не помог. Видимо printf использует другую функцию для выводаsmile.gif Как найти какую функцию использует линковщик для вывода символа? Нужно сгенерировать листинг?


--------------------
С уважением, Вячеслав
Go to the top of the page
 
+Quote Post
Maddy
сообщение Feb 6 2009, 17:26
Сообщение #6


Участник
*

Группа: Validating
Сообщений: 56
Регистрация: 15-10-06
Пользователь №: 21 335



ну вообщето winavr тут саавсем не при делах - avr32 юзает newlib wink.gif
сам не пробывал - хватает пока print_stdarg'а ....
CODE
Without changing any other functions from syscalls.c, change only _read and
_write functions
like following.

int _read (int file, char *ptr, int len)
{
/* GetChar : Your implementation to receive the character
from the serial port.*/
//*ptr=GetChar();
return (1);
}

int _write(int file,char *ptr,int len)
{
int i;
/* PutChar : Your implementation to send the character to the
serial port.*/
for(i=0;i<len;i++)
{
//PutChar(*ptr++);
}
return len;
}
This implementation of redirecting stdin and stdout to serial port will
override default
implementation of stdin and stdout.
Do not forget to include directories with required header files in your project.


Тобишь _read и _write пишешь и вперед .... Если ртось буш прикручивать - мутекс не забудь ....
PS Хотя на фреках(avrfreaks) народ при адекватном размере стека не смог подружить rtos и принтф из newlib

Сообщение отредактировал rezident - Feb 6 2009, 18:52
Причина редактирования: Уменьшение видимого объема цитаты исходника.
Go to the top of the page
 
+Quote Post
altlogic
сообщение Feb 7 2009, 00:40
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 222
Регистрация: 2-12-06
Из: г. Хабаровск
Пользователь №: 23 035



Цитата(Maddy @ Feb 7 2009, 03:26) *
int _read (int file, char *ptr, int len)
{
}

int _write(int file,char *ptr,int len)
{

}


Что это за исходник? я не могу найти таких функций. У меня avr32-gnu-toolchain-2.1.4 + SoftwareFramework-AT32UC3A-1.4.0

Попробовал сегодня сгенерировать листиинг из elf файла дебажной версии. Ничего внятного - по метке printf выполняются команды загрузки в стек, какие-то вычитания, сложения... Перехода на низлежащую функцию не увидел.


--------------------
С уважением, Вячеслав
Go to the top of the page
 
+Quote Post
Maddy
сообщение Feb 7 2009, 19:14
Сообщение #8


Участник
*

Группа: Validating
Сообщений: 56
Регистрация: 15-10-06
Пользователь №: 21 335



это был пост из армовской ветки про newlib .... Железки у меня дома нема - попробывать щаз не могу sad.gif Если есть желание - просто опиши их (read и write ) в своей проги и посмоти чего будет ... Хоть лампочкой по write помигай wink.gif
Go to the top of the page
 
+Quote Post
Maddy
сообщение Feb 7 2009, 20:50
Сообщение #9


Участник
*

Группа: Validating
Сообщений: 56
Регистрация: 15-10-06
Пользователь №: 21 335



Мдяяя ... попробывал я щаз по исходникам newlib'a поползать .... Весело ...
В принципе все заканчиваеться на _write , как я раньше и писал .... Но с бееееешанными накрутками по буферизации и вызовом пачки нафиг не нужных проверок ( в данном случае) .... Так-что IMHO я _это_ у себя юзать пока не буду ... обойдусь printf_stdarg'ом и добавками wink.gif
Go to the top of the page
 
+Quote Post
altlogic
сообщение Feb 18 2009, 00:09
Сообщение #10


Местный
***

Группа: Свой
Сообщений: 222
Регистрация: 2-12-06
Из: г. Хабаровск
Пользователь №: 23 035



Всё очень просто. Для перенаправления вывода необходимо использовать функцию set_usart_base( ( void * ) ). Смотрите пример USB CDC. Вопрос снят.


--------------------
С уважением, Вячеслав
Go to the top of the page
 
+Quote Post

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

 


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


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