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

 
 
> очередь данных для вывода через USART, как увеличить скорость вывода данных?
skopus
сообщение Mar 1 2006, 07:36
Сообщение #1


Участник
*

Группа: Свой
Сообщений: 65
Регистрация: 31-08-05
Из: Moscow
Пользователь №: 8 124



USART настроен на скорость 115200.

Проблема заключается в следующем :

Необходимо за 100 тактов таймера частотой Fosc/8 = 7.373/8 Mhz = 921.5 Khz выести через USART минимум 10 байт данных. Лучше даже 15.
Есть следующая функция, написанная на IAR C 3.11 :
Код
void MA_PutCharCh0_USART( unsigned char Data )
{
    /*--- Wait for USART data register empty ---*/
    while( !(UCSR0A & __BIT_MASK( UDRE0 ) ) )
    {
        /*--- Do nothing ---*/
       ;
    }
    /*--- Send a character ---*/
    UDR0 = Data;
} /* MA_PutCharCh0_USART */

Очень много теряется на ожидание - я успеваю в этом случае выводить только 2 байта данных.

Я пробовал организовать очередь вывода через линейный однонаправленный список - но здесь нет шансов. Функция malloc(..) выполняется очень долго.

Думаю что алгоритм должен быть таким :

1. Занести данные в очередь вывода
2. Если не установлен UDRE0, выйти из процедуры, иначе занести данные в UDR0 и удалить их из буффера
Все это нужно повторять как-то циклически, причем параллельно с программой прерывания...

Может можно организовать очередь вывода на ASMе без использования динамической памяти?
И как тогда запараллелить с прерыванием вывод данных из очереди в USART ?

Уже второй день не могу придумать как это реализовать в IAR C.
Сейчас MA_PutCharCh0_USART() вызывается в теле прерывания всего два раза sad.gif
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
ArtemK
сообщение Mar 2 2006, 10:21
Сообщение #2


Участник
*

Группа: Свой
Сообщений: 36
Регистрация: 27-09-05
Из: Украина, г. Херсон
Пользователь №: 8 994



Цитата
ну поэтому я и создал эту тему.
Ща попробую через очередь сделать

Видимо, Вы не совсем поняли, о чем говорилось в четырех предыдыдущих сообщениях. При выбранном Вами битрейте 115200 невозможно отправить 10 байт за 108 мкс даже при самой оптимальной по скорости программе и дело вовсе не в буферизации.

Сообщение отредактировал ArtemK - Mar 2 2006, 10:24
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- skopus   очередь данных для вывода через USART   Mar 1 2006, 07:36
- - defunct   Пользуйтесь прерываниями. Данные складывайте в Fi...   Mar 1 2006, 07:47
|- - skopus   Цитата(defunct @ Mar 1 2006, 10:47) Польз...   Mar 1 2006, 08:24
|- - defunct   Цитата(skopus @ Mar 1 2006, 10:24) в смыс...   Mar 1 2006, 08:27
- - KRS   Лучше всего циклический буфер на двух указателях (...   Mar 1 2006, 07:51
- - Old1   На эту тему есть appnote AVR306 c примерами. AVR30...   Mar 1 2006, 08:13
|- - defunct   Цитата(Old1 @ Mar 1 2006, 10:13) Обратите...   Mar 1 2006, 08:22
- - viakon   Ты пытаешься за 108мкс передать 10 байтов длиной 8...   Mar 1 2006, 08:30
|- - skopus   Цитата(viakon @ Mar 1 2006, 11:30) Ты пыт...   Mar 1 2006, 16:11
- - arttab   Ага: на 115200 на 1 байт уйдет 86,8 мксек. на 10 б...   Mar 1 2006, 08:37
- - Валера1968   если тебе нужна стандартная скорость 115200 то ты ...   Mar 2 2006, 06:45
- - skopus   ну поэтому я и создал эту тему. Ща попробую через ...   Mar 2 2006, 09:59
|- - viakon   Цитата(skopus @ Mar 2 2006, 14:59) ну поэ...   Mar 2 2006, 10:15
|- - defunct   Цитата(ArtemK @ Mar 2 2006, 12:21) Видимо...   Mar 2 2006, 11:58
- - beer_warrior   ЦитатаНеобходимо за 100 тактов таймера частотой Fo...   Mar 2 2006, 12:23
- - skopus   я сделал как советует defunct. все работает отличн...   Mar 2 2006, 21:22


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

 


RSS Текстовая версия Сейчас: 4th September 2025 - 23:46
Рейтинг@Mail.ru


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