В данном уроке мы рассмотрим создание простой очереди из двух задач, а так же рассмотрим основы работы системы FreeRTOS.
Принцип системы FreeRTOS заключается в том, что несколько задач (в нашем случаи две) выполняются по очереди в течении одного системного кванта времени, который задан в нашем случаи 1мс в файле FreeRTOSConfig.h.
Таким образом обе программы выполняются по очереди: планировщик сам распределяет время работы программ с учетом приоритетов и задач. При этом надо учитывать, что изменения логических уровней возможно только в течении кванта времени.
Для начала в программе STM32CubeMX активируем FreeRTOS:
И выберем Interface:
Функции которые мы будем использовать:
void NAME (void *pvParameters) — функция задачи.
NAME — имя функции задачи, произвольное.
xTaskCreate(NAME,»NAME»,configMINIMAL_STACK_SIZE,NULL,1,NULL) — создание задачи .
NAME — указатель на функцию, которая реализует задачу.
«NAME» — текстовое имя задачи, для наглядности.
configMINIMAL_STACK_SIZE — размер стека, который необходим для выполнения данной задачи.
NULL — параметр передаваемый задаче, не используется.
1 — приоритет задачи.
NULL — получение дескриптора задачи, не используется.
Более детально данные параметры рассмотрим в следующих уроках.
vTaskStartScheduler() — планировщик который запускает выполнения задач.
Создаем две задачи:
/* 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:
Запускаем программу и наблюдаем переключение подключенных светодиодов к данным ножкам.