|
Кольцевой буфер не успевает себя сдвигать до прихода нового байта.., Помогите найти решение. |
|
|
|
Nov 9 2011, 19:43
|
Профессионал
    
Группа: Свой
Сообщений: 1 468
Регистрация: 28-03-10
Из: Беларусь
Пользователь №: 56 256

|
Добрый день. Столкнулся с задачей, которую никак не могу решить. Имеется кольцевой буфер UART на 150 байт. По приходу байта вызывается прерывание, где происходит его запись и сдвиг всего буфера. Но вот незадача, скорость UART 115200, а частота МК 9216кГц. В результате я имею запас всего 80 тактов, которых естественно не хватает на сдвиг этого буфера. Что можно придумать? Спасибо. P.S. на данной скорости UART работает стороннее устройство и ее изменять нельзя. Частота МК почти максимальная, т.к. питание 3В.
|
|
|
|
|
 |
Ответов
(1 - 14)
|
Nov 9 2011, 19:49
|
Участник

Группа: Участник
Сообщений: 58
Регистрация: 13-10-06
Из: Финляндия
Пользователь №: 21 273

|
Зачем сдвигать буфер? Не проще ли писать по следующему адресу и отслеживать указатель? Если написать обработчик на ассемблере, должно влезть. Если, конечно, внешний UART с FIFO нельза поставить.
Сообщение отредактировал GinRider - Nov 9 2011, 19:51
|
|
|
|
|
Nov 10 2011, 08:33
|
    
Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731

|
Цитата(Alt.F4 @ Nov 10 2011, 11:07)  Дело в том, что мне надо вылавливать из этих 150байт только три первых символа, остальные данные переменны, и их пишу в СОЗУ и потом обрабатываю. Таким образом кольцевой буфер с "head" и "tail" не подходит, т.к. надо чтобы в буфере было сразу 150байт. Да хоть 100500 - суть не меняется. Цитата Буду пытаться обрабатывать в прерывании по шагам всю строку. Проще сначала подумать. Нечто С-образное: Код // RxBuf, head и tail можно/нужно описать в одной структуре - см./гуглите про кольцевой буфер volatile bit ICatchIt; uint8_t CatchPos; // сюда сохранится индекс найденной в буфере CatchStr
static void interrupt URxD(void) { const uint8_t CatchStr[] = { '0', '1', '2' }; static uint8_t iCatchStr = 0;
if(head != tail) { // приняли байт, если есть место RxBuf[head] = RCREG;
// сравнили с очередным искомым if(!ICatchIt) { if(RxBuf[head] == CatchStr[iCatchStr] { if(++iCatchStr == sizeof(CatchStr)) { // если угадали все буквы, взвели флаг, который, скорее всего, стоит обрабатывать где-то вне прерывания ICatchIt = 1; CatchPos = head - (sizeof(CatchStr) - 1); if(CatchPos > (sizeof(RxBuf) - 1)) CatchPos += sizeof(RxBuf); iCatchStr = 0; } } else iCatchStr = 0; }
// сдвинули голову на следующий свободный элемент RxBuf if(++head) == sizeof(RxBuf)) head = 0; } else { // обработку переполнения RxBuf придумайте сами } }
|
|
|
|
|
Nov 10 2011, 14:46
|
Профессионал
    
Группа: Свой
Сообщений: 1 468
Регистрация: 28-03-10
Из: Беларусь
Пользователь №: 56 256

|
Данные в этих 150байтах лежат не в строгом порядке, в результате надо часто искать запятые, точки и другие символы. На флажках это дело решать муторно. Я переделал по своему, вопрос исчерпан. Спасибо. Цитата Хочется заметить, что на приём байта (а не бита!) у Вас аж 800 тактов. Этого тоже не достаточно, ведь надо было прочитать, записать + счетчик перепроверить. В итоге: 150*7тактов=1050тактов.
Сообщение отредактировал Alt.F4 - Nov 10 2011, 15:00
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|