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

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


кекс
******

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



Пользуйтесь прерываниями.

Данные складывайте в Fifo.
По прерыванию Tx переходите к отправке сл. байта.


вот заготовка:

Код
#include <io.h>
#include "com_routines.h"
#ifndef UDR
#define UDR UDR0
#endif
#define QUEUE_LENGTH (32)

char COMQueue[QUEUE_LENGTH];
unsigned char QueueHead, QueueTail;
unsigned char QueueBusy = 0;


void InitCOMQueue()
{
   QueueHead = 0;
   QueueTail = 0;
}


// Вызывать эту функцию в основном цикле программы
void CheckCOMQueue()
{
    if (!QueueBusy)
    if (QueueHead != QueueTail)
    {
      QueueBusy = 1;
      UDR = COMQueue[QueueHead];
      QueueHead++;
      if (QueueHead > QUEUE_LENGTH)
         QueueHead = 0;
    }
}

// А эту функцию в обработчике прерывания UART_TX
void CharSent()
{
  QueueBusy = 0;
}


void SendByte(unsigned char data)
{
  COMQueue[QueueTail] = data;
  QueueTail++;
  if (QueueTail > QUEUE_LENGTH)
     QueueTail = 0;
}
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- skopus   очередь данных для вывода через USART   Mar 1 2006, 07:36
|- - 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
- - 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 Текстовая версия Сейчас: 18th July 2025 - 03:40
Рейтинг@Mail.ru


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