Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: FreeRTOS+AVRMega
Форум разработчиков электроники ELECTRONIX.ru > Cистемный уровень проектирования > Операционные системы > FreeRTOS
Volldemar
Сделал эхо по юсарту, т.е. принятый байт тут же отпраляется обратно. Прерывание на прием байта реализовал отложенное, через бинарный семафор, т.е. в обработчике 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 );
        }

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