01_FreeRTOS任务的动态/静态创建与删除:保姆级教程

0. 前言

FreeRTOS系统移植文章链接:FreeRTOS移植STM32F103:保姆级教程

开发环境:

  • 硬件平台:STM32F103

什么是任务?

  • 任务是FreeRTOS的基本运行单元,将应用程序拆分为不同的任务运行在平台上。
  • FreeRTOS通过任务调度器对进行调度和管理,确保任务在指定时间内运行,从而实现实时性。

创建任务流程:

  1. 创建存放FreeRTOS相关代码的文件于User中
    1. FreeRTOSDemo.c
    2. FreeRTOSDemo.h
  2. Keil配置添加FreeRTOSDemo.c文件
  3. 系统启动函数
    • 创建起始任务
    • 启动任务调度器
  4. 起始任务中创建各种不同的任务
  5. 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中配置了头文件路径即可)

![[Pasted image 20250103150143.png]]

3. Keil配置添加FreeRTOSDemo.c文件

将FreeRTOSDemo.c文件添加进User目录中。

![[Pasted image 20250103150235.png]]

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启动函数

配置文件:
![[Pasted image 20250103151752.png]]

FreeRTOSDemo.h

#ifndef __FREERTOS_DEMO_H
#define __FREERTOS_DEMO_H

/* 任务相关 */
#include "FreeRTOS.h"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值