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

 
 
 
Reply to this topicStart new topic
> Работа printf(), Помогите кто чем сможет
fmdost
сообщение Sep 21 2007, 21:18
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 479
Регистрация: 8-05-07
Из: г. Ставрополь. Северный Кавказ. Россия
Пользователь №: 27 606



Доброго времени суток Уважаемые.
Подскажите как настроить printf() IAR в меге64? Не понял как задавать номер порта, и надо ли разрешать TXCIEx UDRIE?
Go to the top of the page
 
+Quote Post
defunct
сообщение Sep 21 2007, 22:02
Сообщение #2


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Достаточно написать свой putchar() совместимый с прототипом:
int putchar(int ch)
Go to the top of the page
 
+Quote Post
fmdost
сообщение Sep 21 2007, 23:01
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 479
Регистрация: 8-05-07
Из: г. Ставрополь. Северный Кавказ. Россия
Пользователь №: 27 606



Цитата(defunct @ Sep 22 2007, 02:02) *
Достаточно написать свой putchar() совместимый с прототипом:
int putchar(int ch)

То-же самое написано в мануале. В С Я новичок. Обьясните пожалуйста чайнику про этот прототип?
Почему есть возвращаемое значение? И почему putchar(int ?) а не char?
Go to the top of the page
 
+Quote Post
defunct
сообщение Sep 21 2007, 23:19
Сообщение #4


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(Т.Достоевский @ Sep 22 2007, 02:01) *
а не char?

Для AVR было бы лучше char, но низя, т.к. по стандарту int, и прототип этот уже объявлен в stdio.h, его вызывает функция printf при печати символов. (по крайней мере в IAR'е так).
Цитата
Почему есть возвращаемое значение?

чтобы возвращать код ошибки. putchar предназначен для вывода символов в любое последовательное устройсво вывода, например в файл. Как пример кода ошибки может быть - нет доступа/устройство не готово и т.п., но этим можно пренебречь.

простейший вариант putchar для отправки символов по UART'у может быть таким:

Код
int putchar(int ch)
{
    while( !(UCSRA & (1 << UDRE) ) );
    UDR = ch;
    return 0;
}
Go to the top of the page
 
+Quote Post
fmdost
сообщение Sep 21 2007, 23:47
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 479
Регистрация: 8-05-07
Из: г. Ставрополь. Северный Кавказ. Россия
Пользователь №: 27 606



Цитата(defunct @ Sep 22 2007, 03:19) *
Для AVR было бы лучше char, но низя, т.к. по стандарту int, и прототип этот уже объявлен в stdio.h,

int для совместимости, понял. Функцию так и сделал.
Вопрос по С. Можно ли реализовать:
Код
putchar(char) //типа собирает ф буффер а потом передаёт через прерывание UDRE
{
if (a<large_buffer)
  {
    buffer[a++]=char;
    if ( ! (USCRB & UDRIE0))
    {
       USCRB |= UDRIE0;//разрешить прерывание
       b=0;//для работы как указатель в прерывании по UDRE (если сравняется с а то ждать окончания по TXC
     }
    return 0;

  }
else
return -1;
}

чтоб максимально быстро собрал, и уже потом аппаратно передавал. Или есть более правильное решение?
Go to the top of the page
 
+Quote Post
defunct
сообщение Sep 22 2007, 00:04
Сообщение #6


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(Т.Достоевский @ Sep 22 2007, 02:47) *
чтоб максимально быстро собрал, и уже потом аппаратно передавал.

Конечно, так и надо делать.

Цитата
Или есть более правильное решение?

разве что с технической стороны организации буфера - есть кольцевой буфер, и он больше подходит для этой задачи. А идеологически - вполне нормальное решение у вас.
Go to the top of the page
 
+Quote Post
rezident
сообщение Sep 22 2007, 00:22
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(defunct @ Sep 22 2007, 05:19) *
простейший вариант putchar для отправки символов по UART'у может быть таким:

Код
int putchar(int ch)
{
    while( !(UCSRA & (1 << UDRE) ) );
    UDR = ch;
    return 0;
}

Вообще-то putchar при нормальной операции должен возвращать тот же символ, что и в аргументе указан. А EOF возвращает только в случае НЕуспешной операции. Цитата из стандарта ANSI C (C99)
Цитата
7.19.7.9 The putchar function
Synopsis
1 #include <stdio.h>
int putchar(int c);
Description
2 The putchar function is equivalent to putc with the second argument stdout.
Returns
3 The putchar function returns the character written. If a write error occurs, the error
indicator for the stream is set and putchar returns EOF.
Go to the top of the page
 
+Quote Post
fmdost
сообщение Sep 22 2007, 00:25
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 479
Регистрация: 8-05-07
Из: г. Ставрополь. Северный Кавказ. Россия
Пользователь №: 27 606



Цитата(defunct @ Sep 22 2007, 04:04) *
Конечно, так и надо делать.
разве что с технической стороны организации буфера - есть кольцевой буфер, и он больше подходит для этой задачи. А идеологически - вполне нормальное решение у вас.

Спасибо. Осталась одна непоняная вещь. Что значит возвращает ошибку? Можно ли это использовать в случае если сообщение болше чем буфер? Printf() ждёт, или просто прекращает передачу?
ЗЫ. Про кольцевые буфера помню, прикручу.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Sep 23 2007, 20:51
Сообщение #9


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Т.Достоевский @ Sep 22 2007, 03:25) *
Что значит возвращает ошибку?
Значит сообщает вызывающей функции, что вывод не удался и не имеет смысла выводить остальные символы (если они есть). printf() в этом случае завершается и остаток строки не выводится.
Цитата(Т.Достоевский @ Sep 22 2007, 03:25) *
Можно ли это использовать в случае если сообщение болше чем буфер? Printf() ждёт, или просто прекращает передачу?
Если сообщение больше чем буфер - вы можете просто ждать в putchar() пока не появится место в буфере.
Код
int putchar (int byte)
{
    uint8_t Tmp = TxHead;
    uint8_t Tmp1 = (Tmp + 1) & (RS232_TXBUFF_SIZE - 1);
    while(Tmp1 == TxTail);        // Buffer full, wait
    TxBuffer[ Tmp ] = byte;
    TxHead = Tmp1;
    UCSRB |= (1 << UDRIE);
    return byte
}


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
fmdost
сообщение Sep 23 2007, 21:07
Сообщение #10


Местный
***

Группа: Свой
Сообщений: 479
Регистрация: 8-05-07
Из: г. Ставрополь. Северный Кавказ. Россия
Пользователь №: 27 606



Цитата(Сергей Борщ @ Sep 24 2007, 00:51) *
Значит сообщает вызывающей функции, что вывод не удался и не имеет смысла выводить остальные символы (если они есть). printf() в этом случае завершается и остаток строки не выводится.
Если сообщение больше чем буфер - вы можете просто ждать в putchar() пока не появится место в буфере.

Точно! Теперь дошло! Ждать в printf() или putchar() это же оно и то-же! smile3046.gif
Go to the top of the page
 
+Quote Post
alexander55
сообщение Sep 24 2007, 07:39
Сообщение #11


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

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



Цитата(Т.Достоевский @ Sep 22 2007, 04:25) *
ЗЫ. Про кольцевые буфера помню, прикручу.

FIFO придумал заядлый собаковод, выгуливающий свою шавку вокруг большого столба.
Он понял 3 правила:
1. собачка бежит бежит по кругу в одном направлении
2. нельзя обгонять собачку
3. поводок должен быть меньше длины окружности столба.
Это моя шутка. All right reserved.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 12th July 2025 - 22:45
Рейтинг@Mail.ru


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