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

 
 
> USART PDC переключение областей памяти, Как переклютать без вероятности потерять байт?
Goofy
сообщение Apr 2 2008, 18:55
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 169
Регистрация: 17-09-07
Из: Красноярск
Пользователь №: 30 600



У меня это организовано так:

Код
void ProcessUpLinkIncomingMessages(void)
{
unsigned int rcr=pDataLinkPDC->PDC_RCR;
if ( rcr==UPLINK_BUFFER_SIZE ) return;

switch (BufferSemaphore)
    {
    case PRIMARY:

        AT91F_PDC_SetRx(pDataLinkPDC,UpLinkRXBufferSec,UPLINK_BUFFER_SIZE);
        ProcessMessages (UpLinkRXBufferPri,(unsigned short)(UPLINK_BUFFER_SIZE-rcr),UpLinkPayLoadBuffer, &UpLinkMessageState);
        BufferSemaphore=SECONDARY;

        break;
    case SECONDARY:

        AT91F_PDC_SetRx(pDataLinkPDC,UpLinkRXBufferPri,UPLINK_BUFFER_SIZE);
        ProcessMessages (UpLinkRXBufferSec, (unsigned short)(UPLINK_BUFFER_SIZE-rcr),UpLinkPayLoadBuffer, &UpLinkMessageState);
        BufferSemaphore=PRIMARY;

        break;
    }

}

Процедура вызывается 100 раз в секунду. Бод рейт 57600, UPLINK_BUFFER_SIZE=256
Пакеты идут плотно, разной длины, проверяется контрольная сумма в конце пакета.
Условия "тепличные", пакеты теряются. Хочу исключить (или подтвердить) то опасение, когда байт теряется от переключения буферов. Похорошему нужно задействовать RNPR RNCR, но тут сразу вопрос: как грамотно переключиться обратно на первоначальные счётчики RPR, RCR и не потерять данные ? Или опасения мои пустые вовсе?

забыл чип указать: sam7s

Сообщение отредактировал Goofy - Apr 2 2008, 19:10
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
aaarrr
сообщение Apr 3 2008, 18:28
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



ИМХО, очень странный метод работы. Чем прерывания-то не угодили?
Go to the top of the page
 
+Quote Post
Goofy
сообщение Apr 3 2008, 18:44
Сообщение #3


Частый гость
**

Группа: Свой
Сообщений: 169
Регистрация: 17-09-07
Из: Красноярск
Пользователь №: 30 600



Цитата(aaarrr @ Apr 4 2008, 02:28) *
ИМХО, очень странный метод работы. Чем прерывания-то не угодили?


Данный код достаточен. Достаточен в тех условиях что буффер не заполнится гарантировано между вызовами. А если достаточен зачем делать больше?...
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Apr 3 2008, 19:22
Сообщение #4


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

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Цитата(Goofy @ Apr 3 2008, 22:44) *
Данный код достаточен. Достаточен в тех условиях что буффер не заполнится гарантировано между вызовами. А если достаточен зачем делать больше?...

Странноватый подход. Чем прерывания то не угодили? Странно, что второй буфер не заполняется. Ведь есть вероятность того, что во время обработки данных из первого могут придти еще данные. Собственно для предотвращения такой ситуации связанные буфера и были придуманы.

Теперь по делу. Если не секрет - что за процессор? Не с кэшом ли часом?
Go to the top of the page
 
+Quote Post
defunct
сообщение Apr 3 2008, 22:12
Сообщение #5


кекс
******

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



Цитата(sergeeff @ Apr 3 2008, 21:22) *
Теперь по делу. Если не секрет - что за процессор? Не с кэшом ли часом?

SAM7S см. самый первый пост.

Цитата
Данный код достаточен.

раз теряются данные, то видать недостаточен.

Я поступил бы так:
По прерыванию DMA, постановка текущего принятого буфера в очередь на обработку, там же в прерывании выделение буфера для сл. пакета и подзагрузка DMA next указателя.

В основном теле программы - проверка очереди пакетов,
обработка и освобождение.
Go to the top of the page
 
+Quote Post



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

 


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


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