Код
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;
}
}
{
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