Перейти к содержанию
    

FreeRTOS + UART

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

Изменено пользователем Тоша

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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) //:Ждём ответа определенное время
{
    //Разгребаем данные
}
}

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...