Jump to content

    
Sign in to follow this  
ur5cuj

FreeRTOS+AVRMega

Recommended Posts

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

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this