Jump to content

    

FreeRTOS+AVRMega

Сделал эхо по юсарту, т.е. принятый байт тут же отпраляется обратно. Прерывание на прием байта реализовал отложенное, через бинарный семафор, т.е. в обработчике 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 );
        }

}

Share this post


Link to post
Share on other sites

Не знаю какая у тебя мега, но наверно они все одинакого работают. Вообще такой код не должен работать.

На сколько я понял обработчик прерывания посылающий семафор есть что-то типа USART0_RX_vect. Уарт принимает байт, выставляет флаг RXCn. Если по приему разрешено прерывание, то когда флаг RXCn в "1" происходит вызов обработчика USART0_RX_vect. Для сброса флага приемника нужно прочитать приемный буфер. В твоем обработчике прерывания не происходит сброса флага RXCn, по выходу из обработчика сразуже возвращяемся обратно в обработчик. Вообще код должен зациклиться на обработчике. Может лучше в обработчике читать приемный буфер уарта и посылать байт в очередь?

Edited by juvf

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this