Цитата(defunct @ Apr 4 2008, 06:12)

SAM7S см. самый первый пост.
раз теряются данные, то видать недостаточен.
Я поступил бы так:
По прерыванию DMA, постановка текущего принятого буфера в очередь на обработку, там же в прерывании выделение буфера для сл. пакета и подзагрузка DMA next указателя.
В основном теле программы - проверка очереди пакетов,
обработка и освобождение.
Теряются пакеты из за других косяков. А именно когда идут пакеты разного типа. Когда идёт один тип, всё отлично (очевидно проблемы в обработке) Второй буфер заполняется, но фактически это тот же адрес. То есть циклически пишем в один и тот же буффер обрабатывая поступающие данные в догонку убывающему RCR. Нет нужды в прерываниях, лишних массивах, аллоцировании памяти, флагах заполнения
вот подкорректированый код, если внимательно посмотреть, ряд вопросов пропадёт
Код
{
if (!pPDC->PDC_RNCR)
//Анализируется, не выполнено ли первоначальное заполнение буфера, когда RNCR обнулиться.
//Если да, то дочитывается "хвост" образовавшийся в момент переключения PDC c RPR на RNPR, нопроцедурой не обработанный
{
ProcessMessages (RXBufferPri+(BUFFER_SIZE-BytesLeft), BytesLeft ,PayLoadBuffer, &GPSMessageState);
//назначается следующий принимающий буффер (те же адреса уже обрабатываются в RPR и RCR)
AT91F_PDC_SetNextRx (pPDC,RXBufferPri,BUFFER_SIZE); //не SetRx!
BytesLeft=BUFFER_SIZE; //сбрасывается число недочитанных байт
}
//Если чило оставшихся непрочитанных байт BytesLeft меньше числа записанных rcr
// то обрабатываем разницу с соответсвующим смещением
if (BytesLeft>rcr) ProcessMessages (RXBufferPri+(BUFFER_SIZE-BytesLeft),(BytesLeft-rcr),PayLoadBuffer, &MessageState);
BytesLeft=rcr;
}
частота вызова строго 100Гц
размер буфера 256
при бод рейте 57600 наложение ещё не прочитанных данных вновь пришедшими исключено
Сообщение отредактировал Goofy - Apr 4 2008, 05:11