STM32-FreeRTOS操作系统-任务管理
引言
随着嵌入式技术的飞速发展,STM32与FreeRTOS的融合愈发紧密。本文聚焦于STM32平台下FreeRTOS操作系统的任务管理,旨在为开发者提供清晰的思路与实用的技巧,助力高效开发。
为什么要进行任务管理?
在嵌入式系统中,任务管理是确保系统高效、稳定运行的关键环节。随着系统功能的日益复杂,多个任务需要同时运行,且每个任务都有其优先级和资源需求。任务管理通过合理分配处理器时间、优化任务调度、确保任务间通信顺畅,使系统能够高效处理多任务,避免任务冲突和资源浪费。它还能提高系统的响应速度和可靠性,确保关键任务优先执行,从而提升用户体验和系统性能。
任务的挂起与恢复
任务挂起是任务管理中的一个重要机制,其主要目的是为了更合理地分配系统资源和优化任务调度。当一个任务暂时不需要运行时,将其挂起可以释放处理器时间,让其他更重要的任务得以执行,从而提高系统的整体效率。
vTaskSuspend(*任务句柄)
vTaskSuspend()是FreeRTOS 中用于挂起任务的函数。它允许将一个任务置于挂起状态,使其暂时停止执行,直到被恢复为止。其函数原型为:
void vTaskSuspend( TaskHandle_t xTaskToSuspend );
里面需要填的参数为需要挂起的任务函数的句柄。其功能是将指定的任务置于挂起状态,使其不再被调度器调度,同时挂起的任务也不会占用处理器的时间,直到被恢复为止。(注:如果任务已经被挂起,则再次调用vTaskSuspend()不会产生任何效果)
vTaskResume(*任务句柄)
vTaskResume()是 FreeRTOS 中用于恢复挂起任务的函数。当一个任务被挂起后,使用 vTaskResume()可以将其从挂起状态恢复到就绪状态,使其可以被调度器调度并继续执行。参数也是跟上面的一样,填入要恢复的任务句柄。如果该任务已经挂起,调用该函数后,该任务将被恢复到就绪运行状态。(注:如果任务已经处于就绪状态或运行状态,则再次调用vTaskResume()不会产生任何效果)
任务的删除
在FreeRTOS中,任务删除是一个重要的机制,主要用于动态管理任务的生命周期。当用户不再需要执行某个任务时,可以对该任务进行删除。因为每个任务都会占用一定系统资源,删除任务可以释放这些资源,供其它任务使用。
vTaskDelete(*任务句柄)
其函数原型为:
void vTaskDelete( TaskHandle_t xTaskToDelete );
参数是要删除任务的句柄。如果是在任务内调用该函数,参数也可以传入NULL,表示删除当前任务。同样,如果任务已经处于删除状态,再次调用该函数不会产生任何效果。(注:删除任务后任务不可恢复)
完整示例代码
#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);//动态方法创建任务1xTaskCreate(MyTask2,"MyTask2",50,NULL,3,&MyTask2Handler);//动态方法创建任务2xTaskCreate(MyTask3,"MyTask3",50,NULL,4,&MyTask3Handler);//动态方法创建任务3vTaskDelete(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); //删除任务1MyTask1Handler=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操作系统中的任务管理,如有不足,欢迎指出,谢谢!