【FreeRTOS】【STM32】06 FreeRTOS的使用-动态创建多任务

主要流程参照【FreeRTOS】【STM32】06 FreeRTOS的使用-动态创建单任务

1.定义任务句柄

c 复制代码
static TaskHandle_t AppTaskCreate_Handle = NULL;

2.硬件初始化

3.创建具体功能任务函数

见定义任务函数

4.使用xTaskCreate创建任务

c 复制代码
 xReturn = xTaskCreate((TaskFunction_t )AppTaskCreate, /* 任务入口函数 */
 						(const char* )"AppTaskCreate",/* 任务名字 */
						 (uint16_t )512, /* 任务栈大小 */
 						(void* )NULL,/* 任务入口函数参数 */
						 (UBaseType_t )1, /* 任务的优先级 */
					 (TaskHandle_t* )&AppTaskCreate_Handle);/* 任务控制块指针 */

5.使用vTaskStartScheduler(); /* 启动任务,开启调度 */

主要代码清单

头文件
c 复制代码
  /*
  * ************************************************************************
 * 包含的头文件
 * ************************************************************************
 * /
 /* FreeRTOS 头文件 */
 #include "FreeRTOS.h"
 #include "task.h"
 /* 硬件 bsp 头文件 */
 #include "bsp_usart.h"
 ...
声明和定义
c 复制代码
 /**************************** 任务句柄 ********************************/
 /*
 * 任务句柄是一个指针,用于指向一个任务,当任务创建好之后,它就具有了一个任务句柄
 * 以后我们要想操作这个任务都需要通过这个任务句柄,如果是自身的任务操作自己,那么
 * 这个句柄可以为 NULL。
 */
 /* 创建任务句柄 */
 static TaskHandle_t AppTaskCreate_Handle = NULL;
 /* LED1 任务句柄 */ 
 static TaskHandle_t LED1_Task_Handle = NULL; 
 /* LED2 任务句柄 */ 
 static TaskHandle_t LED2_Task_Handle = NULL; 
 /***************************** 内核对象句柄 ******************************/
 /*
 * 信号量,消息队列,事件标志组,软件定时器这些都属于内核的对象,要想使用这些内核
 * 对象,必须先创建,创建成功之后会返回一个相应的句柄。实际上就是一个指针,后续我
 * 们就可以通过这个句柄操作这些内核对象。
 *
 * 
 内核对象说白了就是一种全局的数据结构,通过这些数据结构我们可以实现任务间的通信,
 * 任务间的事件同步等各种功能。至于这些功能的实现我们是通过调用这些内核对象的函数
 * 来完成的
 *
 */
 
 
 /************************** 全局变量声明 *********************************/
 /*
 * 当我们在写应用程序的时候,可能需要用到一些全局变量。
 */
 
 
 /*
 *************************************************************************
 * 函数声明
 *************************************************************************
 */
 static void AppTaskCreate(void);/* 用于创建任务 */
 
 static void LED1_Task(void* pvParameters);/* LED1_Task 任务实现 */ 
 static void LED2_Task(void* pvParameters);/* LED2_Task 任务实现 */ 
 
 static void BSP_Init(void);/* 用于初始化板载相关资源 */
main函数
c 复制代码
 /*****************************************************************
 * @brief 主函数
 * @param 无
 * @retval 无
 * @note 第一步:开发板硬件初始化
 第二步:创建 APP 应用任务
 第三步:启动 FreeRTOS,开始多任务调度
 ****************************************************************/
 int main(void)
 {
	 BaseType_t xReturn = pdPASS;/* 定义一个创建信息返回值,表示是否创建成功,默认为 pdPASS */
 
 /* 硬件初始化 */
 BSP_Init();

/* 创建 AppTaskCreate 任务 */
xReturn = xTaskCreate((TaskFunction_t )AppTaskCreate, /* 任务入口函数 */
						(const char* )"AppTaskCreate",/* 任务名字 */
						(uint16_t )512, /* 任务栈大小 */
						(void* )NULL,/* 任务入口函数参数 */
						(UBaseType_t )1, /* 任务的优先级 */
						(TaskHandle_t* )&AppTaskCreate_Handle);/* 任务控制块指针,任务句柄 */

/* 启动任务调度 */
if (pdPASS == xReturn)
			vTaskStartScheduler(); /* 启动任务,开启调度 */
else
			 return -1;
 
	 while (1); /* 正常不会执行到这里 */
 }
任务入口函数
c 复制代码
 /***********************************************************************
 * @ 函数名 : AppTaskCreate
 * @ 功能说明: 为了方便管理,所有的任务创建函数都放在这个函数里面
 * @ 参数 : 无
 * @ 返回值 : 无
 
*******************************************************************/
 static void AppTaskCreate(void)
 {
 BaseType_t xReturn = pdPASS;/* 定义一个创建信息返回值,默认为 pdPASS */
 
 taskENTER_CRITICAL(); //进入临界区
 
 /* 创建 LED_Task 任务 */ 
 xReturn = xTaskCreate((TaskFunction_t )LED1_Task, /* 任务入口函数 */ 
						 (const char* )"LED1_Task",/* 任务名字 */ 
						 (uint16_t )512, /* 任务栈大小 */ 
						 (void* )NULL, /* 任务入口函数参数 */ 
						 (UBaseType_t )2, /* 任务的优先级 */ 
						 (TaskHandle_t* )&LED1_Task_Handle);/* 任务控制块指针 */ 
 if (pdPASS == xReturn) 
	 printf("创建 LED1_Task 任务成功!\r\n"); 
 
 /* 创建 LED_Task 任务 */ 
 xReturn = xTaskCreate((TaskFunction_t )LED2_Task, /* 任务入口函数 */ 
			 (const char* )"LED2_Task",/* 任务名字 */ 
			 (uint16_t )512, /* 任务栈大小 */ 
			 (void* )NULL, /* 任务入口函数参数 */ 
			 (UBaseType_t )3, /* 任务的优先级 */ 
			 (TaskHandle_t* )&LED2_Task_Handle);/* 任务控制块指针 */ 
 if (pdPASS == xReturn) 
		 printf("创建 LED2_Task 任务成功!\r\n"); 
 
 vTaskDelete(AppTaskCreate_Handle); //删除 AppTaskCreate 任务
 
 taskEXIT_CRITICAL(); //退出临界区
 }
相关推荐
猫猫的小茶馆4 分钟前
【Linux 驱动开发】三. 应用程序调用驱动过程分析
linux·arm开发·驱动开发·stm32·单片机·嵌入式硬件·pcb工艺
chengpei14722 分钟前
Arduino环境下开发STM32
stm32·单片机·嵌入式硬件
Embers(余烬矿)1 小时前
STM32 usb 设备描述符失败
stm32·单片机·嵌入式硬件
zd8451015002 小时前
CubeMX H743 lwip ETH初始化流程
网络·stm32·单片机
兆龙电子单片机设计2 小时前
【STM32项目开源】STM32单片机智能温控风扇系统
stm32·单片机·物联网·开源·自动化
云山工作室2 小时前
基于单片机的自动门控制系统设计(论文+源码)
stm32·单片机·嵌入式硬件·毕业设计
橙露2 小时前
工业控制嵌入式开发:Modbus 协议在 STM32 中的实现与调试
服务器·网络·stm32
想放学的刺客2 小时前
单片机嵌入式试题(第21期)嵌入式系统启动异常排查与多任务同步机制设计两个核心方向,涵盖硬件调试、软件架构等综合能力考察。
stm32·单片机·嵌入式硬件·物联网·51单片机·proteus
Y1rong2 小时前
STM32之DMA
stm32·单片机·嵌入式硬件
promising-w3 小时前
【stm32入门教程】TIM定时中断
stm32·单片机·嵌入式硬件