1、准备工作
下载好FreeRTOS源码包,我这里下载的是9.0.0版本
源码下载地址:https://github.com/FreeRTOS/FreeRTOS-Kernel,打开上面的地址,点击main——Tags,然后拖动下拉条找到需要移植的版本,点击Code——Downlaod ZIP即可下载源码包。
基础工程代码
2、源码包裁剪
首先是只保留Demo和Source这两个文件夹
Demo文件夹:
将CORTEX_M4F_STM32F407ZG-SK文件夹中的“FreeRTOSConfig.h”文件拷贝到Source/include文件夹内,其余文件都不要。(如果是F1则复制“CORTEX_STM32F103_Keil”文件夹,如果是F7/H7则复制“CORTEX_M7_STM32F7_STM32756G-EVAL_IAR_Keil“文件夹中的“FreeRTOSConfig.h”文件)
Source文件夹:
1、portable文件夹:只保留MemMang和RVDS两个文件夹,其余删除。
2、portable文件夹内的RVDS文件夹:只保留ARM_CM3、ARM_CM4F、ARM_CM7文件夹。
3、将Source文件夹重命名为FreeRTOS。
3、移植过程
1、将FreeRTOS源码文件夹拷贝至工程目录
2、打开基础工程,打开工程树,新建FreeRTOS/src。
3、将FreeRTOS文件夹根目录的C文件、portable/MemMang/heap_4.c、portable/RVDS、ARM_CMX/port.c添加到FreeRTOS-src文件夹(根据单片机型号选择port.c文件)。
4、添加编译路径。
5、FreeRTOSConfig.h文件修改
将开头的“#ifdef __ICCARM__”删除(别忘了它对应的#endif);
将 configUSE_IDLE_HOOK、configUSE_TICK_HOOK、 configCHECK_FOR_STACK_OVERFLOW、 configUSE_MALLOC_FAILED_HOOK这4个钩子函数的定义值改为0;
注销以下语句:“#define xPortSysTickHandler SysTick_Handler”
注意:如果不注销“#define xPortSysTickHandler SysTick_Handler”语句,就需要注销tm32h7xx_it.c文件中的“SysTick_Handler”函数,此时需要注意,不能使用HAL库自带的延时函数“HAL_Delay”否则程序会进入HardFault_Handler。
将vAssertCalled的声明删除
6、stm32h7xx_it.c文件修改
注释掉:PendSV_Handler()与、SVC_Handler()这两个函数(stm32h7xx_it.h文件同步注销)
加入以下语句:“extern void xPortSysTickHandler(void);”
在SysTick_Handlerhan'sh内增加以下语句:“if (xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED) xPortSysTickHandler(); /* OS开始跑了,才执行正常的调度处理 */”
7、在"stm32f4xx_hal_msp.c"的“HAL_MspInit”函数中增加“HAL_NVIC_SetPriority(PendSV_IRQn, 15, 0);”。此处修改可加可不加
8、新建freertos_task.c、freertos_task.h文件,并将其添加到工程中。
/*freertos_task.c文件*/
#include "freertos_task.h"
TaskHandle_t AppTaskCreate_Handle = NULL;/* 创建任务句柄 */
TaskHandle_t Test1_Task_Handle = NULL;/* LED任务句柄 */
TaskHandle_t Test2_Task_Handle = NULL;/* KEY任务句柄 */
void FreeRTOS_Start(void)
{
xTaskCreate((TaskFunction_t )AppTaskCreate, /* 任务入口函数 */
(const char* )"AppTaskCreate",/* 任务名字 */
(uint16_t )512, /* 任务栈大小 */
(void* )NULL,/* 任务入口函数参数 */
(UBaseType_t )1, /* 任务的优先级 */
(TaskHandle_t* )&AppTaskCreate_Handle);/*AppTaskCreate_Handle 任务控制块指针 */
/* 启动任务调度 */
vTaskStartScheduler(); /* 启动任务,开启调度 */
}
void AppTaskCreate(void)
{
taskENTER_CRITICAL(); //进入临界区
/* 创建Test1_Task任务 */
xTaskCreate((TaskFunction_t )Test1_Task, /* 任务入口函数 */
(const char* )"Test1_Task",/* 任务名字 */
(uint16_t )128, /* 任务栈大小 */
(void* )NULL, /* 任务入口函数参数 */
(UBaseType_t )1, /* 任务的优先级 */
(TaskHandle_t* )&Test1_Task_Handle);/*Test1_Task_Handle 任务控制块指针 */
/* 创建Test2_Task任务 */
xTaskCreate((TaskFunction_t )Test2_Task, /* 任务入口函数 */
(const char* )"Test2_Task",/* 任务名字 */
(uint16_t )128, /* 任务栈大小 */
(void* )NULL,/* 任务入口函数参数 */
(UBaseType_t )1, /* 任务的优先级 */
(TaskHandle_t* )&Test2_Task_Handle);/*Test2_Task_Handle 任务控制块指针 */
vTaskDelete(AppTaskCreate_Handle); //AppTaskCreate_Handle 删除AppTaskCreate任务
taskEXIT_CRITICAL(); //退出临界区
}
void Test1_Task(void* parameter)
{
while (1)
{
HAL_GPIO_TogglePin(LED0_GPIO_Port,LED0_Pin);
vTaskDelay(500);/* 延时1000个tick */
}
}
void Test2_Task(void* parameter)
{
while (1)
{
HAL_GPIO_TogglePin(LED1_GPIO_Port,LED1_Pin);
vTaskDelay(250);
}
}
/*freertos_task.h文件*/
#ifndef __FREERTOS_TASK_H_H
#define __FREERTOS_TASK_H_H
#include "main.h"
void FreeRTOS_Start(void);
void AppTaskCreate(void);
void Test1_Task(void* parameter);
void Test2_Task(void* parameter);
#endif /* __FREERTOS_TASK_H */
8、main.c文件修改:
添加:#include "freertos_task.h"
在while(1)前添加函数:FreeRTOS_Start();(注意:此时while(1)里的内容正常情况下将不再执行)
9、main.h文件添加头文件:
#include "FreeRTOS.h"
#include "task.h"
至此FreeRTOS的移植就结束了,可以通过“FreeRTOSConfig.h”文件进行裁剪。此次移植的对比工程链接在这:https://blog.youkuaiyun.com/qq_44712722/article/details/146316632?fromshare=blogdetail&sharetype=blogdetail&sharerId=146316632&sharerefer=PC&sharesource=qq_44712722&sharefrom=from_link