深入解析:STM32-FreeRTOS操作系统-任务管理

news/2025/9/21 21:18:49/文章来源:https://www.cnblogs.com/yfceshi/p/19104179

引言

随着嵌入式技术的飞速发展,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.mzph.cn/news/909058.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java中异步任务的执行方式有几种?

在Java中,异步任务的执行方式有多种,每种方式适用于不同的场景和需求。以下是常见的几种实现方式:Thread类 最基础的方式是直接使用Thread类创建线程执行任务:new Thread(() -> {// 异步执行的任务System.out.p…

mysql数据库自增ID为int类型超过范围

mysql数据库自增ID为int类型超过范围mysql数据的自增加的id(int)类型,超过范围:数据自增加ID,为int类型,超过范围,就插入数据库失败;怎么解决? 由于数据比较大, 1.第一个简单粗暴:把int变为(BIGINT)不用迁…

202508_浙江省网络安全测试职业职工技能竞赛_misc-1

流量分析,RE,XORTags:流量分析,RE,XOR 0x00. 题目 你是一名资深的网络安全分析取证师,受命调查一家IT公司近期遭遇的一起严重网络安全事件。 该公司主要业务是为中小型企业提供定制化管理系统和数据分析服务。 由…

python爬虫测试

python爬虫测试0.背景:要下合适自己的驱动,不然都是报错!!你需要完成以下两步:检查你的 Chrome 浏览器版本。打开 Chrome,在地址栏输入 chrome://settings/help。 你会看到你的 Chrome 版本号,例如 版本 120.0.…

广二联考题解补全计划:

第十七套: T1:取模性质,倍增 T2: DP优化,状态优化 T3:容斥原理,数位DP T1: 首先先提一个关于取模的性质,一个数对一个比它小的数取模,大小一定减半,考虑对 $ \frac {n}{2}$ 分治即可。 我们先预处理出来每个数…

如何在 C# 中将文本转换为 Word 以及将 Word 转换为文本 - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Chapter 8 Contour / Shape Detection

def getContours(img):contours, hierarchy = cv2.findContours(img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)for cnt in contours:area = cv2.contourArea(cnt)print(area)if area > 500:# -1 代表所有的轮廓c…

【左程云算法笔记016】双端队列-双链表和固定数组实现 - 教程

【左程云算法笔记016】双端队列-双链表和固定数组实现 - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Cons…

LeetCode 几道 Promises 和 Time 的题目 - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

[硬件电路-232]:FET(场效应管)的核心机制是通过栅极电压调控半导体“沟道“中的载流子浓度与分布,进而控制源极与漏极之间的电流大小 - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

java相关问题:面向对象入门2与类的识别

1. 关于 static 修饰符 应该用 static 修饰的方法: *不依赖于特定对象的实例状态:执行的操作不访问或修改对象的实例变量。 *工具类方法:常用于定义工具类中的方法,这些方法提供通用功能,无需创建类实例。 *工厂方…

EXCEL自动调整列宽的快捷键

在 Excel 中,自动调整列宽的快捷键是:Windows 系统:先选中要调整的列(可选中单列或多列),然后按下 Alt + H + O + I(依次按下这些键)。 Mac 系统:先选中要调整的列,然后按下 Command + Option + H + O + I。…

【C++实战⑬】解锁C++文件操作:从基础到实战的进阶之路 - 实践

【C++实战⑬】解锁C++文件操作:从基础到实战的进阶之路 - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Co…

破解塔吊顶升高危难题!让事故率降 50%、审批快 70%

在建筑施工领域,塔吊顶升作业作为关键且高危的环节,长期以来饱受诸多痛点的困扰,严重影响施工安全与进度。传统模式下,人工对塔吊顶升作业的审查多依赖现场巡检,然而人力有限,在忙碌的施工现场,难以做到时刻紧盯…

logicFlow________文档2

# LogicFlow 官方指南 - 自定义连线与事件处理## 📖 概述LogicFlow 是滴滴开源的一款流程图编辑框架,具有强大的扩展性和自定义能力。本文档基于LogicFlow官网最新版本,详细介绍如何实现自定义连线、自定义事件处理…

CF2086D Even String

题目链接:Problem - D - Codeforces 本身是一道数学题,我们可以把字符串中的奇数项和偶数项分开,形成两条序列 A 和 B。易知一种字母一定在同一条序列上。 假如说在 A 序列上分配了 \(a,b,c\) 三种字母,\(sum = c_…

logicflow___文档3

# LogicFlow 流程图编辑器开发文档## 📖 概述这是一个基于 LogicFlow 的流程图编辑器完整开发指南,包含详细的代码示例和实现方案。该编辑器支持节点创建、连接线绘制、关系管理等功能。## 🚀 快速开始### 1. 安装…

langraph-up-react

langraph-up-react https://github.com/fanqingsong/langraph-up-reactLangGraph ReAct Agent TemplateThis template showcases a ReAct agent implemented using LangGraph, works seamlessly with LangGraph Studio…

2025年运营商API安全建设最佳实践:某头部省级电信案例解析与方案推荐

2025年运营商API安全建设最佳实践:某头部省级电信案例解析与方案推荐运营商API安全需应对资产可视性缺失、动态风险防护不足、合规压力三大挑战。全知科技(Data-Sec)知影-API风险监测系统通过“规则引擎+AI引擎”双轮…

软件工程第二次作业-第一次个人编程作业

个人编程作业项目 内容这个作业属于哪个课程 [软件工程](首页 - 计科23级12班 - 广东工业大学 - 班级博客 - 博客园)这个作业要求在哪里 [作业要求](个人项目 - 作业 - 计科23级12班 - 班级博客 - 博客园)这个作业的目…