Сделал эхо по юсарту, т.е. принятый байт тут же отпраляется обратно. Прерывание на прием байта реализовал отложенное, через бинарный семафор, т.е. в обработчике RX выдается семафор, а отложенный обработчик ждёт этот семафор, и как только семафор захфатывает, идёт уже обработка. Так вот, проблема в том, что происходит "удвоение", т.е. передаю к примеру 12345, а принимается 1521324354.
прерывание юсарта:
Код
{
static signed portBASE_TYPE xHigherPriorityTaskWoken;
xHigherPriorityTaskWoken = pdFALSE;
xSemaphoreGiveFromISR( xBinarySemaphoreUSART0RXvect, &xHigherPriorityTaskWoken );
if( xHigherPriorityTaskWoken != pdFALSE )
{
taskYIELD();
}
}
"отложенный" обработчик RX юсарта:
Код
static void prvUSART0RXvectTask( void *pvParameters )
{
( void ) pvParameters;
uint8_t cChar;
for(;; )
{
xSemaphoreTake( xBinarySemaphoreUSART0RXvect, portMAX_DELAY );
if ( UCSR0A & ((1<<FE0)|(1<<DOR0)|(1<<UPE0)) )
cChar = 0xFF;
else
cChar = UDR0;
xQueueSendToBack( xRxedChars[0], &cChar, xNoBlock );
}
}
и само "эхо":
Код
static void prvUSARTEchoTask0( void *pvParameters )
{
uint8_t cChar;
( void ) pvParameters;
for(;; )
{
if ( pdTRUE == xSerialGetChar ( mainUSART0, &cChar, portMAX_DELAY ) )
xSerialPutChar( mainUSART0, cChar, xNoBlock );
}
}