当前位置: 首页 > news >正文

深入解析: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);//动态方法创建任务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操作系统中的任务管理,如有不足,欢迎指出,谢谢!

http://www.jsqmd.com/news/1171/

相关文章:

  • Java中异步任务的执行方式有几种?
  • mysql数据库自增ID为int类型超过范围
  • 202508_浙江省网络安全测试职业职工技能竞赛_misc-1
  • python爬虫测试
  • 广二联考题解补全计划:
  • 如何在 C# 中将文本转换为 Word 以及将 Word 转换为文本 - 教程
  • Chapter 8 Contour / Shape Detection
  • 【左程云算法笔记016】双端队列-双链表和固定数组实现 - 教程
  • LeetCode 几道 Promises 和 Time 的题目 - 教程
  • [硬件电路-232]:FET(场效应管)的核心机制是通过栅极电压调控半导体“沟道“中的载流子浓度与分布,进而控制源极与漏极之间的电流大小 - 指南
  • java相关问题:面向对象入门2与类的识别
  • EXCEL自动调整列宽的快捷键
  • 【C++实战⑬】解锁C++文件操作:从基础到实战的进阶之路 - 实践
  • 破解塔吊顶升高危难题!让事故率降 50%、审批快 70%
  • logicFlow________文档2
  • CF2086D Even String
  • logicflow___文档3
  • langraph-up-react
  • 2025年运营商API安全建设最佳实践:某头部省级电信案例解析与方案推荐
  • 软件工程第二次作业-第一次个人编程作业
  • 面向对象入门2与类的识别
  • 202508_天山固网_to
  • Java学生信息管理系统代码分析
  • ArcGIS Pro中 Nodata和nan 黑边的处理 - 指南
  • 怎么屏蔽 ahref.com 上你不想看到的网站链接(垃圾外链)
  • 浅谈字典树
  • go-mapus为局域网地图协作而生
  • 【工具变量】“国家级大数据综合试验区”试点城市DID(2000-2024年) - 教程
  • 《手搓动态顺序表:从数组到自动扩容的华丽转身》 - 详解
  • 板子大全