目录
0. 前言
FreeRTOS系统移植文章链接:FreeRTOS移植STM32F103:保姆级教程
开发环境:
- 硬件平台:STM32F103
什么是任务?
- 任务是FreeRTOS的基本运行单元,将应用程序拆分为不同的任务运行在平台上。
- FreeRTOS通过任务调度器对进行调度和管理,确保任务在指定时间内运行,从而实现实时性。
创建任务流程:
- 创建存放FreeRTOS相关代码的文件于User中
- FreeRTOSDemo.c
- FreeRTOSDemo.h
- Keil配置添加FreeRTOSDemo.c文件
- 系统启动函数
- 创建起始任务
- 启动任务调度器
- 起始任务中创建各种不同的任务
- main函数中调用系统启动函数
1. 创建与删除任务常见API
1.1 动态创建任务 - xTaskCreate
函数说明:
- 注意事项:FreeRTOSCnfig配置文件中configSUPPORT_DYNAMIC_ALLOCATION设置为1
- 参数1:任务的执行函数
- 参数2:任务名称
- 参数3:任务栈深度
- 参数4:任务执行函数的传入参数
- 参数5:任务优先级
- 参数6:任务控制块的结构体
- return:返回成功或失败等提示信息
BaseType_t xTaskCreate( TaskFunction_t pvTaskCode,
const char * const pcName,
const configSTACK_DEPTH_TYPE uxStackDepth,
void *pvParameters,
UBaseType_t uxPriority,
TaskHandle_t *pxCreatedTask
);
Tips:任务控制块结构体就是存放任务的各种信息的结构体,任务的名称、优先级、栈等等
1.2 静态创建任务 - xTaskCreateStatic
函数说明:
- 注意事项:FreeRTOSCnfig配置文件中configSUPPORT_STATIC_ALLOCATION设置为1
- 参数1:任务的执行函数
- 参数2:任务名称
- 参数3:任务栈深度
- 参数4:任务执行函数的传入参数
- 参数5:任务优先级
- 参数6:任务栈的缓冲区
- 参数7:保存新任务的数据结构体
- return: 返回任务的控制块结构体
TaskHandle_t xTaskCreateStatic( TaskFunction_t pxTaskCode,
const char * const pcName,
const uint32_t ulStackDepth,
void * const pvParameters,
UBaseType_t uxPriority,
StackType_t * const puxStackBuffer,
StaticTask_t * const pxTaskBuffer );
1.3 删除任务 - vTaskDelete
函数说明:
- 注意事项:INCLUDE_vTaskDelete设置为1
- 参数1:任务控制块,传入NULL是删除自身
void vTaskDelete( TaskHandle_t xTask );
2. 创建存放FreeRTOS相关代码的文件于User中
在User文件夹中创建两个文件FreeRTOSDemo.c和FreeRTOSDemo.h,这两个文件用于存放于FreeRTOS相关的代码。(这里因为是头文件,所以不显示,只要在Keil中配置了头文件路径即可)
3. Keil配置添加FreeRTOSDemo.c文件
将FreeRTOSDemo.c文件添加进User目录中。
4. 系统启动函数
4.1 创建系统启动任务
FreeRTOSDemo.h
#ifndef __FREERTOS_DEMO_H
#define __FREERTOS_DEMO_H
/* 任务相关 */
#include "FreeRTOS.h"
#include "task.h"
/* 1. 启动操作系统 */
void FreeRTOS_Start(void);
#endif
FreeRTOSDemo.c
#include "FreeRTOS_Demo.h"
void FreeRTOS_Start(void)
{
}
extern void xPortSysTickHandler(void);
void SysTick_Handler(void)
{
if(xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED)
{
xPortSysTickHandler();
}
}
5. 动态创建任务
在FreeRTOS_Start函数中创建起始任务,同时启动任务调度函数。
- 配置文件宏定义configSUPPORT_DYNAMIC_ALLOCATION
- FreeRTOS启动函数
- 创建起始任务
- 启动任务调度器
- 起始函数
- 创建两个任务
- 任务1:每隔500ms打印Task1…
- 任务2:每隔500ms打印Task2…
- 创建两个任务
- 在main.c函数中调用FreeRTOS启动函数
配置文件:
FreeRTOSDemo.h
#ifndef __FREERTOS_DEMO_H
#define __FREERTOS_DEMO_H
/* 任务相关 */
#include "FreeRTOS.h"