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

 
 
> очередь данных для вывода через 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
Ответов
KRS
сообщение Mar 1 2006, 07:51
Сообщение #2


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

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



Лучше всего циклический буфер на двух указателях (примерно как еще в древних BIOS клавиатурных)
Для простоты кода отправлять данные имеет смысл только в прерывании, а после укладки байтов в очередь прерывание разрешать, а в прерывании если байтов для отправки нет запрещать их.

Для буфера можно использовать массив и 2 индекса
примерно так:

Код
char UartBuf[64];
volatile char UartPut=0;
volatile char UartGet=0;

//класть байты в очередь
char Tmp;
Tmp=UartPut;
UartBuf[Tmp++]=.....
Tmp&=63;
UartBuf[Tmp++]=.....
Tmp&=63;
UartPut=Tmp; //сохраняем указатель
UCSRB|=(1<<UDRIE); //разрешаем прерывание не важно было оно разрешено или нет



// а обработчик прерывания

char Tmp;
Tmp=UartGet;
if (Tmp==UartPut) {
  UCSRB&=~(1<<UDRIE); //запрещаем  прерывание байтов на отправку нет
} else {
  UDR=UartBuf[Tmp++];
  Tmp&=63;
  UartGet=Tmp; //сохраняем указатель
}
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
- - 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
- - ArtemK   Цитатану поэтому я и создал эту тему. Ща попробую ...   Mar 2 2006, 10:21
|- - 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 Текстовая версия Сейчас: 19th July 2025 - 18:43
Рейтинг@Mail.ru


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