реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> FreeRTOS + UART, Алгоритм
Тоша
сообщение Mar 20 2013, 18:25
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 39
Регистрация: 13-08-10
Пользователь №: 58 896



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

Сообщение отредактировал Тоша - Mar 20 2013, 18:25
Go to the top of the page
 
+Quote Post
Lmx2315
сообщение Mar 20 2013, 19:09
Сообщение #2


отэц
*****

Группа: Свой
Сообщений: 1 729
Регистрация: 18-09-05
Из: Москва
Пользователь №: 8 684



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


--------------------
b4edbc0f854dda469460aa1aa a5ba2bd36cbe9d4bc8f92179f 8f3fec5d9da7f0
SHA-256
Go to the top of the page
 
+Quote Post
Aleksandr Barano...
сообщение Mar 22 2013, 20:39
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 169
Регистрация: 31-08-05
Из: New York
Пользователь №: 8 118



Цитата(Тоша @ Mar 20 2013, 14:25) *
Дайте пожалуйста совет как правильно организовать обмен данными по UART очередтю или мьютексама или ещё чем ? Заранее спасибо.

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


--------------------
ASB
Go to the top of the page
 
+Quote Post
Тоша
сообщение Apr 23 2013, 13:44
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 39
Регистрация: 13-08-10
Пользователь №: 58 896



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


Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 24th June 2025 - 18:32
Рейтинг@Mail.ru


Страница сгенерированна за 0.01399 секунд с 7
ELECTRONIX ©2004-2016