通过STM32CubeIDE集成FreeRTOS到STM32
通过STM32CubeIDE集成FreeRTOS到STM32
背景:
STM32本身是不带操作系统的,一般方式有,自己通过中断调用创建抢占任务,再有就是一致FreeRTOS等其他已经成熟的实时操作系统。
操作:
1、根据单片机型号创建工程

2、配置系统基本框架,外部晶振,系统时钟,调试模式等

注意,系统时钟被freeRTOS征用了,我们把系统时钟改成别的时钟。

3、导入freeRTOS

4、选择CMSIS_V2版本,CMSIS_V2是在freeRTOS又抽象出来了一层代码,但是老的freeRTOS标准函数都还是可以用的
5、别的配置项可以先用默认,需要的时候再改,直接在Tasks and Queues选项新建任务即可。


6、生成代码

7、然后就完成了,在app_freertos.c文件里面就可以看到创建的任务了


8、除此之外我们还可以通过freeRTOS原生的函数自己创建任务。
可以参考以下代码:
/*********************************************************************************************************************/
/*-----------------------------------------------------Includes------------------------------------------------------*/
/*********************************************************************************************************************/
#include "My_Main.h"
#include "FreeRTOS.h"
#include "task.h"
#include "My_Uart.h"
/*********************************************************************************************************************/
/*------------------------------------------------------Macros-------------------------------------------------------*/
/*********************************************************************************************************************/
#define MY_5MS_TASK_STACK_LEN 1024U
/*********************************************************************************************************************/
/*-------------------------------------------------Global variables--------------------------------------------------*/
/*********************************************************************************************************************/
extern TIM_HandleTypeDef htim4;
uint64_t Sys_Timestamp_10us_Cnt = 0;
StackType_t My_5ms_Task_Stack[MY_5MS_TASK_STACK_LEN];
StaticTask_t My_5ms_Task_TCB;
/*********************************************************************************************************************/
/*------------------------------------------------Function Prototypes------------------------------------------------*/
/*********************************************************************************************************************/
/*********************************************************************************************************************/
/*---------------------------------------------Function Implementations----------------------------------------------*/
/*********************************************************************************************************************/
void My_TIM4_Init(void)
{
HAL_TIM_Base_Start_IT(&htim4);
}
void My_TIM4_IRQHandler(void)
{
Sys_Timestamp_10us_Cnt++;
}
void My_5ms_Task_Fun(void const * argument)
{
TickType_t xLastWakeTime;
const TickType_t xPeriod = pdMS_TO_TICKS(5); // 5ms周期
// 初始化唤醒时间(必须在循环前初始化一次)
xLastWakeTime = xTaskGetTickCount();
while(1)
{
Shell_Loop_Printf();
vTaskDelayUntil(&xLastWakeTime, xPeriod);
}
}
void My_Main_Init(void)
{
My_TIM4_Init();
My_UART_Init();
TaskHandle_t xTask = xTaskCreateStatic(
My_5ms_Task_Fun, \
"My_5ms_Task_Fun", \
MY_5MS_TASK_STACK_LEN, \
NULL, \
1, \
My_5ms_Task_Stack, \
&My_5ms_Task_TCB
);
vTaskStartScheduler(); // 启动 FreeRTOS 调度器(含初始化)
return;
}

浙公网安备 33010602011771号