Пишем программный код для работы с системой FreeRTOS, создаем задачи на микроконтроллере STM32F103 в среде программирования Keil uVision.

В данном уроке мы рассмотрим создание простой очереди из двух задач, а так же рассмотрим основы работы системы FreeRTOS.

Принцип системы FreeRTOS заключается в том, что несколько задач (в нашем случаи две) выполняются по очереди в течении одного системного кванта времени, который задан в нашем случаи 1мс в файле FreeRTOSConfig.h.

Таким образом обе программы выполняются по очереди: планировщик сам распределяет время работы программ с учетом приоритетов и задач. При этом надо учитывать, что изменения логических уровней возможно только в течении кванта времени.

Для начала в программе STM32CubeMX активируем FreeRTOS:

И выберем Interface:

Пока все настройки оставим по умолчанию.
В графе  Tasks and Queues:
 
Создадим две функции vLed1 и vLed2 нажав ADD:

Функции которые мы будем использовать:

void NAME (void *pvParameters) — функция задачи.

NAME — имя функции задачи, произвольное.

xTaskCreate(NAME,»NAME»,configMINIMAL_STACK_SIZE,NULL,1,NULL) — создание задачи .

NAME — указатель на функцию, которая реализует задачу.

«NAME» — текстовое имя задачи, для наглядности.

configMINIMAL_STACK_SIZE  — размер стека, который необходим для выполнения данной задачи.

NULL — параметр передаваемый задаче, не используется.

1 — приоритет задачи.

NULL — получение дескриптора задачи, не используется.

Более детально данные параметры рассмотрим в следующих уроках.

vTaskStartScheduler() — планировщик который запускает выполнения задач.

Программный код (цикл while удален):

Создаем две задачи:

/* USER CODE BEGIN WHILE */
xTaskCreate(vLed1,"Led1",configMINIMAL_STACK_SIZE,NULL,1,NULL);
xTaskCreate(vLed2,"Led2",configMINIMAL_STACK_SIZE,NULL,1,NULL);
vTaskStartScheduler();
/* USER CODE END WHILE */

Прописываем действия первой задачи:

/* USER CODE END Header_StartTask02 */
void StartTask02(void const * argument)// первая задача
{
/* USER CODE BEGIN StartTask02 */
/* Infinite loop */
for(;;)
{
HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_13);
osDelay(500);
}
/* USER CODE END StartTask02 */

Прописываем действия второй задачи:

/* USER CODE END Header_StartTask03 */
void StartTask03(void const * argument)//вторая задача
{
/* USER CODE BEGIN StartTask03 */
/* Infinite loop */
for(;;)
{
HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_14);
osDelay(700);
}
/* USER CODE END StartTask03 */

Так же не забываем настроить на выход ножки PB13 И PВ14:

Запускаем программу и наблюдаем переключение подключенных светодиодов к данным ножкам.