Jump to content

    

FreeRTOS + UART

Нужен ваш совет. Есть два прибора обшяються между собой по 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

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