Осваиваем FreeRtos на примере приема-передачи по UART
Логично используем 2 потока (2 задачи "task"): один для UART 2 (передатчик) и UART3 (приемник).
Передатчик (Master) посылает данные по нажатию кнопки (KEY1), приемник (Slave) получает и отсылает обратно мастеру.
Все реализуем на одной плате, один контроллер STM32F407VET6 на свободной среде Atollic True Studio.
Внизу как обычно можно скачать готовый проект.
Примерно так выглядит трассировка:
Работает связка на прерываниях HAL_UART_Transmit_IT (HAL_UART_TxCpltCallback) на передачу,
Включен HAL_UART_Receive_IT (HAL_UART_RxCpltCallback) для обоих портов UART соответственно,
и данные принимаются не блокируя основные потоки программы.
Из прерывания HAL_UART_RxCpltCallback данные через очередь xQueueSendToBackFromISR засылаются каждой задаче индивидуально соответственно. Задачи соответственно ждут в цикле поступления принятый байтов по UART : xQueueReceive.
Что можно в итоге сказать : работает без проблем ,но медленно: задержка 0.3 сек. между передачей и обратным приемом.
Примечание: на самом деле, уменьшите периоды блокировки ожидания xQueueReceive и все полетит.
А так все байты стабильно передаются , ничего не теряется:
Файлы для скачивания
*
свободный проект на Atollic Treu Studio с открытым исходным кодом