Dark0711 0 20 марта, 2013 Опубликовано 20 марта, 2013 (изменено) · Жалоба Нужен ваш совет. Есть два прибора обшяються между собой по UART. Запрос -> Ожидание -> Ответ. Сейчас ожидание осуществляется по таймеру. А хочется включить FreeRTOS чтобы понапрасну не тратить процессорное время. Дайте пожалуйста совет как правильно организовать обмен данными по UART очередтю или мьютексама или ещё чем ? Заранее спасибо. Изменено 20 марта, 2013 пользователем Тоша Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Lmx2315 2 20 марта, 2013 Опубликовано 20 марта, 2013 · Жалоба .. а как таймер мешает вашему Main{} , перебирать другие функции по очереди? Отвечайте после проверки приёмного буфера, в остальное время - решайте другие задачи. ртос - лишний костыль. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Aleksandr Baranov 1 22 марта, 2013 Опубликовано 22 марта, 2013 · Жалоба Дайте пожалуйста совет как правильно организовать обмен данными по UART очередтю или мьютексама или ещё чем ? Заранее спасибо. Ну, можно и очередью. ISR принимает байты и передает в очередь, а какая-то задача из очереди берет и парсает. На сайте freertos.org есть пример serial.c Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Dark0711 0 23 апреля, 2013 Опубликовано 23 апреля, 2013 · Жалоба 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) //:Ждём ответа определенное время { //Разгребаем данные } } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться