Jump to content

    
Sign in to follow this  
Dark0711

FreeRTOS + UART

Recommended Posts

Нужен ваш совет. Есть два прибора обшяються между собой по UART. Запрос -> Ожидание -> Ответ. Сейчас ожидание осуществляется по таймеру. А хочется включить FreeRTOS чтобы понапрасну не тратить процессорное время. Дайте пожалуйста совет как правильно организовать обмен данными по UART очередтю или мьютексама или ещё чем ? Заранее спасибо.

Edited by Тоша

Share this post


Link to post
Share on other sites

.. а как таймер мешает вашему Main{} , перебирать другие функции по очереди?

Отвечайте после проверки приёмного буфера, в остальное время - решайте другие задачи.

ртос - лишний костыль.

Share this post


Link to post
Share on other sites
Дайте пожалуйста совет как правильно организовать обмен данными по UART очередтю или мьютексама или ещё чем ? Заранее спасибо.

Ну, можно и очередью. ISR принимает байты и передает в очередь, а какая-то задача из очереди берет и парсает. На сайте freertos.org есть пример serial.c

Share this post


Link to post
Share on other sites

RTOS удобнее использовать, потому-что ещё куча всего по мимо UART.

Задачу решил так:

 

static uint8_t Raw[SIZE_BUFF];//Буфер для UART
static volatile uint32_t RxFrameLength;//Счётчик символов //RxFrameLength  - счётчик длина принятых сообщений перед отправкой запроса в UART обнуляеться.
static xSemaphoreHandle xSemaphoreRx;  //Семафор приёма данных от UART
static portBASE_TYPE xHigherPriorityTaskWoken;

/**/
/ *   Обработчик для прерывания от UART*/
/**/
static void Comm_UART_RxHandler(uint8_t Data) //Приём данных из UART
{

    if (Data == 0x00) // Ждем конец посылки
    {
        if (RxFrameLength > 0)
        {
           // RxFrameReady = 1;
           xSemaphoreGiveFromISR(xSemaphoreRx, &xHigherPriorityTaskWoken); //Отдаём семафор     
        }
    }
    else
    {
        if (RxFrameLength < SIZE_BUFF)
            Raw[RxFrameLength++] = Data;
        else
        {
            RxFrameLength = 0;
        }
    }
}
/**/
/*Задача обработчик*/
/**/
void Task(void* P)
{
if (xSemaphoreTake(xSemaphoreRx, Timeout) == pdTRUE) //:Ждём ответа определенное время
{
    //Разгребаем данные
}
}

 

 

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