Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: FreeRTOS + UART
Форум разработчиков электроники ELECTRONIX.ru > Cистемный уровень проектирования > Операционные системы > FreeRTOS
Тоша
Нужен ваш совет. Есть два прибора обшяються между собой по UART. Запрос -> Ожидание -> Ответ. Сейчас ожидание осуществляется по таймеру. А хочется включить FreeRTOS чтобы понапрасну не тратить процессорное время. Дайте пожалуйста совет как правильно организовать обмен данными по UART очередтю или мьютексама или ещё чем ? Заранее спасибо.
Lmx2315
.. а как таймер мешает вашему Main{} , перебирать другие функции по очереди?
Отвечайте после проверки приёмного буфера, в остальное время - решайте другие задачи.
ртос - лишний костыль.
Aleksandr Baranov
Цитата(Тоша @ Mar 20 2013, 14:25) *
Дайте пожалуйста совет как правильно организовать обмен данными по 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) //:Ждём ответа определенное время
{
    //Разгребаем данные
}
}


Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2024 Invision Power Services, Inc.