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操作系统中的任务管理,如有不足,欢迎指出,谢谢!

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/95947.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/95947.shtml

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

相关文章

工业领域 ACP 协议全解析:从入门到实战案例

工业领域 ACP 协议全解析:从入门到实战案例 文章目录工业领域 ACP 协议全解析:从入门到实战案例一、前言二、ACP 协议是什么?1. 基本定义2. 与数据传输协议的区别三、ACP 协议的核心功能1. 身份认证(Authentication)2.…

计算机组成原理:计算机硬件的基本组成

📌目录🖥️ 计算机硬件的基本组成:从经典到现代的架构演进🧩 一、计算机硬件的五大部分:功能与协同📥 (一)输入设备:人机交互的“入口”📤 (二&am…

AI歌手功能终于上线!Suno AI 带你保存歌曲的灵魂

当我们谈论一首歌时,究竟是什么让它“独一无二”?是主唱的声音质感?是旋律里的氛围?还是那种无法复制的风格气息? 如今,Suno AI 给出了答案—— AI歌手功能正式上线! 🌟什么是「AI…

Dubbo3.3 Triple协议处理东西向流量

前言 Apache Dubbo 3.3 对 Triple 协议做了升级,现在 Dubbo 不仅可以处理东西向流量,也可以处理南北向流量。 **东西向流量(East-West Traffic) ** 指数据中心或网络内部同级设备/服务之间的通信。例如,微服务之间的…

操作系统核心特点详解:从并发到分布式,一文搞懂考研必备知识

操作系统核心特点详解:从并发到分布式,一文搞懂考研必备知识 大家好,今天咱们来聊聊操作系统(OS)这个计算机世界的“大管家”。想象一下,你的电脑就像一个忙碌的厨房,操作系统就是那个厨师长&am…

2025精选5款AI视频转文字工具,高效转录秒变文字!

视频转文本的需求早已渗透到生活的方方面面:网课学习需要提取课件台词、会议记录想快速整理要点、追剧时急需生肉转字幕…… 手动记录不仅费时,还容易遗漏关键信息。今天就分享5款实用工具,从免费到专业全覆盖,几步操作就能让视频…

MyBatis Example模式SQL注入风险

在使用MyBatis逆向工程生成的Example查询模式时,很多开发者看到XML中存在${}占位符就会担心SQL注入问题。但实际上,存在${}并不等同于存在SQL注入风险。本文将详细分析何时会存在真正的注入风险。 存在SQL注入的两个关键前提 前提一:Criteria…

宝塔PostgreSQL安装pgvecto插件contrib包实现向量存储

1. 宝塔安装 首先确保你的宝塔已经安装了 PostgreSQL。 安装好后是能看到上面这个界面的。 我安装的是 16.1 版本,下面的教程讲的也是 16.1 版本的。 2.开放防火墙的端口号 5432 3.允许外部访问所有数据库 4.设置超级管理员用户密码 用户名默认为:po…

麒麟系统 doc转pdf

# 安装LibreOffice(如果尚未安装) sudo apt update sudo apt install libreoffice# 将DOC转换为PDF libreoffice --headless --convert-to pdf 你的文档.doc# 或者指定输出目录 libreoffice --headless --convert-to pdf --outdir /输出目录 你的文档.do…

Python实现生成矩形框、三角形框、六边形框和圆环点云

本节我们分享上节提到的不填充点云。在点云处理、计算机视觉与工业检测中,几何轮廓(边框/环)点云比实心点云更能反映物体的边缘特征、结构骨架与形貌突变区域。Python 借助 NumPy 即可快速生成矩形边框、三角形边框、六边形边框与圆环点云&am…

2025年本体论:公理与规则的挑战与趋势

摘要本文章旨在深入探讨本体论(Ontology)中公理(Axioms)与规则(Rules)的核心概念、技术实现、验证方法、性能评估及其在2025年的前沿趋势与挑战。公理与规则是构建严谨、一致知识模型的逻辑基石&#xff0c…

【51单片机】【protues仿真】基于51单片机PM2.5空气质量检测系统

目录 一、主要功能 二、使用步骤 三、硬件资源 四、软件设计 五、实验现象 一、主要功能 1、LCD1602液晶显示 2、按键​设置阈值 3、PM2.5大于阈值时启动声光警报 二、使用步骤 基于51单片机的PM2.5空气质量检测系统通常采用STC89C51/52作为核心控制器,结合…

【目录-单选】鸿蒙HarmonyOS开发者基础

用哪一种装饰器修饰的组件可作为页面入口组件?Look at the answer下面是ArkTS中类名、枚举名推荐的代码风格是 Look at the answer向服务器提交表单数据,以下哪种请求方式比较合适 Look at the answer使用http发起网络请求,需要以下哪种权限&…

maven【maven】技术详解

MavenMaven的本质是项目管理工具,将项目开发和管理过程抽象成一个项目对象模型(POM)Project Object Model:项目对象管理模型作用: 项目构建:提供标准的、跨平台的自动化项目构建方式依赖管理:方…

【操作系统-Day 25】死锁 (Deadlock):揭秘多线程编程的“终极杀手”

Langchain系列文章目录 01-玩转LangChain:从模型调用到Prompt模板与输出解析的完整指南 02-玩转 LangChain Memory 模块:四种记忆类型详解及应用场景全覆盖 03-全面掌握 LangChain:从核心链条构建到动态任务分配的实战指南 04-玩转 LangChai…

【嵌入式C语言】七

8.4函数的声明和定义声明一个函数意味着向编译器描述函数名、返回值、参数个数和类型,但并不会为函数分配存储空间定义一个函数意味着在声明变量的同时还要有具体的实现,并且会为函数分配存储空间8.5多源文件的函数声明和定义8.6预处理指令#Include#incl…

hardhat3 源神 -- 启动!

Hardhat 项目开发环境搭建完整指南 1. 从 GitHub 下载项目 # 使用 SSH 方式克隆(需要配置 SSH key) git clone gitgithub.com:NomicFoundation/hardhat.git# 或使用 HTTPS 方式 git clone https://github.com/NomicFoundation/hardhat.git# 进入项目目录…

遇到 Git 提示大文件无法上传确实让人头疼

遇到 Git 提示大文件无法上传确实让人头疼,但别担心,我们可以一步步来解决。为了让你更清晰地了解整个流程,我先用一个表格来概括主要步骤:步骤核心操作关键命令/工具示例 (用于删除历史中的大文件)1. 定位大文件使用 Git 命令或工…

机器人控制器开发(传感器层——奥比大白相机适配)

编译OrbbecSDK_ROS2的代码 执行命令 colcon buildros2 launch orbbec_camera dabai.launch.py问题1: 运行时报错: [component_container-1] [ERROR] [1757153916.450795107] [camera.camera_container]: Failed to load library: Could not load library…

C语言(长期更新)第15讲 指针详解(五):习题实战

C语言(长期更新)第15讲 指针详解(五):习题实战 跟着潼心走,轻松拿捏C语言,困惑通通走,一去不回头~欢迎开始今天的学习内容,你的支持就是博主最大的动力。博主主页&#…