STM32-FreeRTOS操作系统-任务管理

引言

随着嵌入式技术的飞速发展,STM32与FreeRTOS的融合愈发紧密。本文聚焦于STM32平台下FreeRTOS操作系统的任务管理,旨在为开发者提供清晰的思路与实用的技巧,助力高效开发。

为什么要进行任务管理?

在嵌入式系统中,任务管理是确保系统高效、稳定运行的关键环节。随着系统功能的日益复杂,多个任务需要同时运行,且每个任务都有其优先级和资源需求。任务管理通过合理分配处理器时间、优化任务调度、确保任务间通信顺畅,使系统能够高效处理多任务,避免任务冲突和资源浪费。它还能提高系统的响应速度和可靠性,确保关键任务优先执行,从而提升用户体验和系统性能。

任务的挂起与恢复

任务挂起是任务管理中的一个重要机制,其主要目的是为了更合理地分配系统资源和优化任务调度。当一个任务暂时不需要运行时,将其挂起可以释放处理器时间,让其他更重要的任务得以执行,从而提高系统的整体效率。

vTaskSuspend(*任务句柄)

vTaskSuspend()是FreeRTOS 中用于挂起任务的函数。它允许将一个任务置于挂起状态,使其暂时停止执行,直到被恢复为止。其函数原型为:

cs 复制代码
void vTaskSuspend( TaskHandle_t xTaskToSuspend );

里面需要填的参数为需要挂起的任务函数的句柄。其功能是将指定的任务置于挂起状态,使其不再被调度器调度,同时挂起的任务也不会占用处理器的时间,直到被恢复为止。(注:如果任务已经被挂起,则再次调用vTaskSuspend()不会产生任何效果)

vTaskResume(*任务句柄)

vTaskResume()是 FreeRTOS 中用于恢复挂起任务的函数。当一个任务被挂起后,使用 vTaskResume()可以将其从挂起状态恢复到就绪状态,使其可以被调度器调度并继续执行。参数也是跟上面的一样,填入要恢复的任务句柄。如果该任务已经挂起,调用该函数后,该任务将被恢复到就绪运行状态。(注:如果任务已经处于就绪状态或运行状态,则再次调用vTaskResume()不会产生任何效果)

任务的删除

在FreeRTOS中,任务删除是一个重要的机制,主要用于动态管理任务的生命周期。当用户不再需要执行某个任务时,可以对该任务进行删除。因为每个任务都会占用一定系统资源,删除任务可以释放这些资源,供其它任务使用。

vTaskDelete(*任务句柄)

其函数原型为:

cs 复制代码
void vTaskDelete( TaskHandle_t xTaskToDelete );

参数是要删除任务的句柄。如果是在任务内调用该函数,参数也可以传入NULL,表示删除当前任务。同样,如果任务已经处于删除状态,再次调用该函数不会产生任何效果。(注:删除任务后任务不可恢复)

完整示例代码

cs 复制代码
#include "myfreertos.h"
#include "FreeRTOS.h"
#include "SysTick.h"
#include "Usart.h"
#include "oled.h"
#include "Task.h"
#include "led.h"
#include "key.h"

TaskHandle_t MyTaskHandler;//任务句柄

TaskHandle_t MyTask1Handler;//任务1句柄

TaskHandle_t MyTask2Handler;//任务2句柄

TaskHandle_t MyTask3Handler;//任务3句柄

void MyTask(void *pvParameters);    //声明启动函数

void MyTask1(void *pvParameters);   //声明任务1函数

void MyTask2(void *pvParameters);   //声明任务2函数

void MyTask3(void *pvParameters);   //声明任务3函数


void Start_Task(void)
{
	xTaskCreate(MyTask,"MyTask",128,NULL,1,&MyTaskHandler);//动态方法创建任务
	vTaskStartScheduler();//启动任务调动		
}



void MyTask(void *arg)            //开始创建任务函数
{
	taskENTER_CRITICAL();           //进入临界区
	
	xTaskCreate(MyTask1,"MyTask1",50,NULL,2,&MyTask1Handler);//动态方法创建任务1

 	xTaskCreate(MyTask2,"MyTask2",50,NULL,3,&MyTask2Handler);//动态方法创建任务2
	
	xTaskCreate(MyTask3,"MyTask3",50,NULL,4,&MyTask3Handler);//动态方法创建任务3

  vTaskDelete(MyTaskHandler);    //删除开始任务
	
	taskEXIT_CRITICAL();           //退出临界区
}

void MyTask1(void *arg)     //任务1函数体
{
	u32 cnt=0;                 //定义变量
	
	while(1)
	{
		OLED_ShowString(1,1,"Runing Task1");
		OLED_ShowNum(2,1,cnt,3);
		GPIO_ResetBits(GPIOC,GPIO_Pin_13);
		vTaskDelay(300);
		GPIO_SetBits(GPIOC,GPIO_Pin_13);
		vTaskDelay(900);
		if(++cnt>=10)     //如果超过10次
		{
			 if(MyTask1Handler!=NULL)  //判断句柄是否有效
			 {
				  vTaskDelete(MyTask1Handler);  //删除任务1
				  MyTask1Handler=NULL;          //清空句柄
			 }
		}
	}	
}

void MyTask2(void *arg)      //任务2函数体
{
	while(1)
	{
		OLED_ShowString(1,1,"Runing Task2");
		GPIO_ResetBits(GPIOC,GPIO_Pin_15);
		delay_ms(1000);                 //延时产生任务调度
		GPIO_SetBits(GPIOC,GPIO_Pin_15);
		vTaskDelay(300);	
	}	
}

void MyTask3(void *arg)      //任务3函数体
{
	while(1)
	{
		if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_6)!=0)
		{
			 vTaskSuspend(MyTask2Handler);/* 挂起任务2 */
			 OLED_ShowString(3,1,"S");
		}
		else
		{
			vTaskResume(MyTask2Handler);/* 恢复任务2*/
			OLED_ShowString(3,1,"R");
		}
		vTaskDelay(100);
	}	
}

总结

本文仅仅简单介绍了基于STM32单片机FreeRTOS操作系统中的任务管理,如有不足,欢迎指出,谢谢!

相关推荐
星一工作室8 小时前
STM32项目分享:基于单片机的图书馆座位监测系统
stm32·单片机·嵌入式硬件
La Pulga8 小时前
【STM32】外部中断(上)
c语言·stm32·单片机·嵌入式硬件
猫猫的小茶馆8 小时前
【C语言】汇编语言与C语言的混合编程
c语言·开发语言·stm32·单片机·嵌入式硬件·mcu·物联网
La Pulga8 小时前
【STM32】定时器编码器接口
c语言·stm32·单片机·嵌入式硬件·mcu
北冥电磁电子智能9 小时前
江协科技STM32学习笔记补充之003 :STM32复位电路的详细分析
stm32·单片机·嵌入式硬件
Coision.9 小时前
硬件:51单片机
单片机·嵌入式硬件·51单片机
逼子格9 小时前
【Protues仿真】基于AT89C52单片机的温湿度测量
单片机·嵌入式硬件·定时器·硬件工程师·dht11·温湿度传感器·at89c52
意法半导体STM3210 小时前
基于 STM32N6-AI Image Classification 使用 git bash 命令行示例 LAT1552
人工智能·git·stm32·ai·gdb·stm32n6·stedgeai
欢乐熊嵌入式编程11 小时前
WIFI协议全解析08:WiFi连接背后的握手过程,你的设备是如何“入网”的
网络·嵌入式硬件·智能路由器·wifi协议·wifi连接