Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Перенапрвление вывода printf в AVR32Studio
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
altlogic
Здравствуйте!

Кто-нибудь перенаправлял стандартный поток ввода вывода а AVR32Studio? Программа написана для UC3A. printf на UART1 ничего не выводит. Куда направлен поток понять не могу. В файле stdio.h видимых указаний на перенаправление потока не нашёл.
demiurg_spb
Под 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, не помню точно.
aaarrr
Как-то так:
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;
}
Maddy
Хм , а прога-то что пользует ? Голый С ? 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 сделали ....
altlogic
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 Как найти какую функцию использует линковщик для вывода символа? Нужно сгенерировать листинг?
Maddy
ну вообщето 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
altlogic
Цитата(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 выполняются команды загрузки в стек, какие-то вычитания, сложения... Перехода на низлежащую функцию не увидел.
Maddy
это был пост из армовской ветки про newlib .... Железки у меня дома нема - попробывать щаз не могу sad.gif Если есть желание - просто опиши их (read и write ) в своей проги и посмоти чего будет ... Хоть лампочкой по write помигай wink.gif
Maddy
Мдяяя ... попробывал я щаз по исходникам newlib'a поползать .... Весело ...
В принципе все заканчиваеться на _write , как я раньше и писал .... Но с бееееешанными накрутками по буферизации и вызовом пачки нафиг не нужных проверок ( в данном случае) .... Так-что IMHO я _это_ у себя юзать пока не буду ... обойдусь printf_stdarg'ом и добавками wink.gif
altlogic
Всё очень просто. Для перенаправления вывода необходимо использовать функцию set_usart_base( ( void * ) ). Смотрите пример USB CDC. Вопрос снят.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.