在CubeMX的软件包中导入FreeRTOS

使能FreeRTOS

未开启FreeRTOS时,默认时钟源systick,开启FreeRTOS后,系统会占用systick时钟,需要为其他总线提供另外的时钟源,这里选择TIM1

生成程序后,串口输出沿用上一次串口ADC值的代码
在app_freertos.c中添加测试任务代码。创建了两个任务,并通过串口交替打印输出
app_freertos.c代码如下
/* USER CODE BEGIN Header */
/**
******************************************************************************
* File Name : app_freertos.c
* Description : FreeRTOS applicative file
******************************************************************************
* @attention
*
* Copyright (c) 2025 STMicroelectronics.
* All rights reserved.
*
* This software is licensed under terms that can be found in the LICENSE file
* in the root directory of this software component.
* If no LICENSE file comes with this software, it is provided AS-IS.
*
******************************************************************************
*/
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "app_freertos.h"
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include <stdio.h>
/* USER CODE END Includes */
/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
/* USER CODE END PTD */
/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
/* USER CODE END PD */
/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */
/* USER CODE END PM */
/* Private variables ---------------------------------------------------------*/
/* USER CODE BEGIN Variables */
void Task1(void *argument);
void Task2(void *argument);
/* USER CODE END Variables */
/* Definitions for defaultTask */
osThreadId_t defaultTaskHandle;
const osThreadAttr_t defaultTask_attributes = {
.name = "defaultTask",
.priority = (osPriority_t) osPriorityNormal,
.stack_size = 128 * 4
};
/* Private function prototypes -----------------------------------------------*/
/* USER CODE BEGIN FunctionPrototypes */
osThreadId_t Task1Handle;
osThreadId_t Task2Handle;
const osThreadAttr_t Task1_attributes = {
.name = "Task1",
.priority = (osPriority_t) osPriorityNormal1,
.stack_size = 128
};
const osThreadAttr_t Task2_attributes = {
.name = "Task2",
.priority = (osPriority_t) osPriorityNormal2,
.stack_size = 128
};
/* USER CODE END FunctionPrototypes */
/**
* @brief FreeRTOS initialization
* @param None
* @retval None
*/
void MX_FREERTOS_Init(void) {
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* USER CODE BEGIN RTOS_MUTEX */
/* add mutexes, ... */
/* USER CODE END RTOS_MUTEX */
/* USER CODE BEGIN RTOS_SEMAPHORES */
/* add semaphores, ... */
/* USER CODE END RTOS_SEMAPHORES */
/* USER CODE BEGIN RTOS_TIMERS */
/* start timers, add new ones, ... */
/* USER CODE END RTOS_TIMERS */
/* USER CODE BEGIN RTOS_QUEUES */
/* add queues, ... */
/* USER CODE END RTOS_QUEUES */
/* creation of defaultTask */
defaultTaskHandle = osThreadNew(StartDefaultTask, NULL, &defaultTask_attributes);
/* USER CODE BEGIN RTOS_THREADS */
Task1Handle = osThreadNew(Task1, NULL, &Task1_attributes);
Task1Handle = osThreadNew(Task2, NULL, &Task2_attributes);
/* add threads, ... */
/* USER CODE END RTOS_THREADS */
/* USER CODE BEGIN RTOS_EVENTS */
/* add events, ... */
/* USER CODE END RTOS_EVENTS */
}
/* USER CODE BEGIN Header_StartDefaultTask */
/**
* @brief Function implementing the defaultTask thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_StartDefaultTask */
void StartDefaultTask(void *argument)
{
/* USER CODE BEGIN defaultTask */
/* Infinite loop */
for(;;)
{
osDelay(1);
}
/* USER CODE END defaultTask */
}
/* Private application code --------------------------------------------------*/
/* USER CODE BEGIN Application */
void Task1(void *argument)
{
for(;;)
{
printf("task1\r\n");
osDelay(500);
}
}
void Task2(void *argument)
{
for(;;)
{
printf("task2\r\n");
osDelay(500);
}
}
/* USER CODE END Application */
输出结果如下

|