FreeRTOS任务管理(创建、删除、挂起、恢复)

目录

一、任务概念

二、系统启动与空闲任务

三、任务创建

四、任务删除

五、任务挂起

六、任务恢复(普通模式和中断模式)

七、任务管理编程实战


一、任务概念

1、任务的基本概念

从系统的角度看,任务是竞争系统资源的最小运行单元

FreeRTOS是一个支持多任务的操作系统,在FreeRTOS中,任务可以使用或等待CPU,使用内存空间等系统资源,并独立于其他任务运行

每个任务在自己的环境中运行,在任何时刻,只有一个任务得到运行,FreeRTOS调度器决定运行哪个任务,调度器会不断的启动,停止每个任务,宏观上看每个任务都在同时运行

在FreeRTOS中,每个任务都有自己的栈空间(一段连续的内存)用于保存任务运行环境,任务越多,需要的栈空间就越大,而一个系统能运行多少个任务,主要取决于系统可用的内存

任务通常会运行在一个死循环,不会退出,如果不需要某个任务,可以调用FreeRTOS中的删除任务API函数将任务删除,释放系统资源

2、任务状态的概念

FreeRTOS系统中的任务有四种状态:

Running -- 运行态

当任务处于实际运行时被称之为运行态,即CPU的使用权被这个任务占用

Ready -- 就绪态

处于就绪态的任务是指那些能够运行(没有被阻塞和挂起)但是当前没有运行的任务,因为同优先级或者更高优先级的任务正在运行

Blocked -- 阻塞态

由于等待信号量,消息队列,事件标志组等而处于的状态被称之为阻塞态,另外任务调用延迟函数也会处于阻塞态

Suspenede -- 挂起态

类似阻塞态,通过调用函数 vTaskSuspend() 对指定任务进行挂起,挂起后这个任务将不被执行,只有调用 vTaskResume() 才可以将这个任务重新恢复

二、系统启动与空闲任务

1、系统启动

使用如下函数启动FreeRTOS调度

vTaskStartScheduler()

函数描述 :函数vTaskStartScheduler用于启动FreeRTOS调度器,既启动FreeRTOS的多任务执行

使用这个函数要注意以下几个问题

1、空闲任务和可选的定时器任务是在调用这个函数后自动创建的

2、正常情况下这个函数是不会被返回的,如果有返回,极有可能是用于定时器任务或空闲任务的内存空间不足造成创建失败,此时需要加大FreeRTOS可管理的内存空间

2、空闲任务 

空闲任务是FreeRTOS系统中没有其他任务运行时自动进入的系统任务,不需要用户创建,启用调度器时,调度器会自动创建空闲任务

空闲任务的作用:

1、执行删除任务时,系统并不会立即释放任务的内存空间,只会将任务添加到结束列表中,真正的系统资源回收工作会在空闲任务中完成

2、可以在空闲任务中实现低功耗功能,后续会详细讲解

三、任务创建

创建任务的方式:

1、静态创建任务,xTaskCreateStatic(),需要自行定义任务栈空间与任务控制块,一般不采用

2、动态创建任务,xTaskCreate(),系统动态分配任务栈空间与任务控制块,应采用此办法 

动态创建任务函数详解

函数 xTaskCreate() 用于实现FreeRTOS的任务创建,还可以自定义栈的大小

这个函数总共需要填六个参数

第一个参数:创建任务的函数名

第二个参数:任务名,主要用于调试时方便看是哪个任务

第三个参数:任务栈大小,单位word,也就是四字节

第四个参数:创建的任务函数的形参

第五个参数:定义任务优先级

第六个参数:任务句柄,用于区分不同的任务

四、任务删除

删除任务函数详解

使用这个函数要注意以下问题

1、使用此函数需要在 FreeRTOSConfig.h 配置文件中配置如下宏定义为1 

 #define INCLUDE_vTaskDelete   1

2、如果用往此函数里填的任务ID是NULL,既数值为0的话,那么删除的就是当前正在执行的任务,此任务被删除后,FreeRTOS会被切换到任务就绪列表里面下一个要执行的最高优先级任务

3、在FreeRTOS中,创建任务所需要的内存需要在空闲任务中释放,如果用户在FreeRTOS中调用了这个函数的话,一定要让空闲任务有执行的机会,否则这部分内存无法释放,另外,创建的这个任务在使用中申请了动态内存,这个内存不会因任务被删除而释放,这一点要注意,一定要在删除任务前将内存释放

4、注意要判断任务是否存在,如果不存在再去删除任务的话会出现错误

五、任务挂起

任务挂起函数详解

使用这个函数要注意以下问题

1、使用此函数需要在FreeRTOSConfig.h中配置如下宏定义为1

#define INCLUDE_vTaskSuspend 1

如果用往此里面填的任务ID是NULL,既数值为0的话,那么挂起的就是当前正在执行的任务,此任务被挂起之后,FreeRTOS会切换到任务就绪的列表里面下一个要执行的高优先级任务

3、多次调用此函数的话,只需要调用一次 vTaskResume 即可将任务从挂起态恢复

六、任务恢复(普通模式和中断模式)

普通模式恢复任务函数详解

使用这个函数需要注意以下问题

1、使用此函数需要在FreeRTOSConfig.h中配置如下宏定义为1

#define INCLUDE_vTaskSuspen 1

2、多次调用函数 vTaskSuspend 的话,只需要调用一次 vTaskResume 即可将任务恢复

3、此函数是用于任务代码中调用的,故不可以在中断服务程序中调用此函数,中断服务程序中使用的 xTaskResumeFromISR() 以后缀 FromISR 结尾

中断方式恢复函数详解

使用这个函数要注意以下问题

1、使用此函数需要在FreeRTOSConfig.h配置如下宏定义为1

#define  INCLUDE_xResumeFromISR   1

2、多次调用函数 vTaskSuspend 的话,只需要调用一次 vTaskResumeFromISR 即可恢复任务

3、如果用户打算采用这个函数实现中断与任务的同步,要注意一种情况,如果此函数的调用优先于函数 vTaskSuspend 被调用,那么此次同步会丢失,这种情况下建议使用信号量来实现同步

4、此函数是用于中断服务程序中调用的,故不可以在任务中使用此函数,任务中使用的vTaskResume

七、任务管理编程实战

1、创建工程

打开STM32CubeMX 选择FreeRTOS 在 Config parameters 中找到 Memory management settings

设置为动态内存,栈大小设为10k,剩下默认就行

接下来我们点击 Tasks and Queues 创建三个任务,一个用于打印我们任务状态,其他两个设置为LED闪烁任务,STM32CubeMX我们就用到这里,接下来我们手动创建关于KEY按键的任务,打印任务的栈空间要大一些

首先我们需要定义我们的句柄,然后声明我们任务的函数

接下来我们手动配置函数

接下来我们编写一段按键删除与恢复任务的代码,我这里没有展示全部功能,同学们可以自己尝试,我这里按键也没有消抖,仅供参考

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Flutter(三):Stack、Positioned、屏幕相关尺寸、Navigator路由跳转

页面尺寸 通知栏高度:MediaQuery.of(context).padding.top顶部导航高度:kToolbarHeight底部导航高度:kBottomNavigationBarHeight屏幕宽:MediaQuery.of(context).size.width屏幕高:MediaQuery.of(context).size.height…

基于STM32制作的示波器(可对任意信号进行描点)

基于STM32制作的示波器(可对任意信号进行描点) 注意:用的屏幕是TFT-LCD(MCU 屏)正点原子同款屏幕 液晶显示器,即 Liquid Crystal Display,利用了液晶导电后透光性可变的特性,配合显…

2024洗地机选购攻略 | 洗地机好用吗?洗地机如何挑选?

在众多清洁工具中,洗地机以其卓越的清洁能力和便捷的操作方式,获得了广泛关注。2024年,市场上涌现出众多品牌的洗地机,但哪些品牌的洗地机值得推荐呢?在这里,我们将详细探讨几个备受好评的洗地机品牌&#…

Fisher矩阵与自然梯度法

文章目录 Fisher矩阵及自然梯度法Fisher矩阵自然梯度法总结参考链接 Fisher矩阵及自然梯度法 自然梯度法相比传统的梯度下降法具有以下优势: 更好的适应性:自然梯度法通过引入黎曼流形上的梯度概念,能够更好地适应参数空间的几何结构。这使…

向上生长笔记

第一章 成为一个很厉害的人(持续输入,反复练习) 为什么要学习及如何学习 1、自毁趋势(熵增),故需要能量输入(负熵流) //引申:水往低处流是趋势,学习是逆趋势。 2、持续输入能量(物质和信息),…

BUUCTF---[ACTF2020 新生赛]BackupFile1

1.题目描述 2.题目提示backup file ,是备份文件的意思。点开链接,页面提示 3.查看源码没有什么有用信息,也没有登录界面,所以也不会用到蚁剑链接来找备份文件,所以大概率就是通过构造playload来查找备份文件。 4.备份…

vue+element ui上传图片到七牛云服务器

本来打算做一个全部都是前端完成的资源上传到七牛云的demo,但是需要获取token,经历了九九八十一难,最终还是选择放弃,token从后端获取(springboot)。如果你们有前端直接能解决的麻烦记得私我哦!…

详解自动化测试框架特点和原理

【软件测试面试突击班】2024吃透软件测试面试最全八股文攻略教程,一周学完让你面试通过率提高90%!(自动化测试) 今天捡一些比较典型的工具型自动化框架来介绍,主要围绕历史、特点和原理来讲解,至于使用教程…

MYSQL07高级_Hash结构、平衡二叉树、B树、B+树介绍

文章目录 ①. 全表遍历②. Hash结构③. 平衡二叉搜索树(AVL)④. B树⑤. B树⑥. 时间复杂度 选择的合理性 磁盘的I/O操作次数对索引的使用效率至关重要查找都是索引操作,一般来说索引非常大,尤其是关系型数据库,当数据量比较大的时候,索引的大小有可能几个G甚至更多,为了减少索引…

BUUCTF---[BJDCTF2020]藏藏藏1

1.题目描述 2.下载附件,解压之后是一张图片和一个文本 3.把图片放在winhex,发现图片里面包含压缩包 4.在kali中使用binwalk查看,然后使用foremost分离,在使用tree查看分离出来的文件,最后将zip文件使用unzip进行解压。步骤如下 5.…

分巧克力 刷题笔记

/* 分巧克力 解题思路 二分 直接检查看答案是否符合题目条件 对于一块边长分别为x 和y的巧克力\\ 假设我们输入检查的数为k 其能分割成的 k*k 的巧克力的块数为 (x/k)*(y/k) 因为c里面的除法是下取整的所以我们不用考虑奇偶数 是否能整除 将每一块巧克力能分成的k*k的巧克力…

镭速:推动工业设备数据高效汇聚的关键力量

在工业4.0时代,智能制造和工业自动化的快速发展使得工业设备数据汇聚、采集、传输变得尤为重要。这些数据,包括设备运行状态、生产效率、能耗等关键信息,对于企业优化生产流程、提升产品质量、降低成本具有至关重要的作用。然而,在…

jsp阿帕奇安装教程

1.将压缩包解压,存放在自己所知道的位置 2.将软件文件夹打开 使用winr ,输入cmd运行打开 输入Java或者Javac,出现一大串之后表明成功 接着在所解压的软件中点开bin这个文件夹,找到startup.bat点击 点击之后会出现黑框&#xff0c…

Mint_21.3 drawing-area和goocanvas的FB笔记(三)

一、改变goocanvas线条自动画线时间间隔 通过系统SIGALRM信号触发,每秒画一条线对于慢温湿度等慢变信号可以应付,但对于快速信号1秒的间隔就太慢了。可以改变方式,通过另外的线程,完成要做的任务。 1. 线程的回调函数 myfunc 2…

javaWebssh酒店客房管理系统myeclipse开发mysql数据库MVC模式java编程计算机网页设计

一、源码特点 java ssh酒店客房管理系统是一套完善的web设计系统(系统采用ssh框架进行设计开发),对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为TOMCAT7.0…

都2024了,软件测试真的就是简单的点点点吗???

软件测试真的就是用手点点这么简单 你的身边,是否有这样一片景象? A:写了几年代码,写不下去了,听说测试很好上手,先来做几年测试 。 B:小文员一枚,想入行 IT,听说测试入门简单,请…

SpringBoot-首页和图标定制

1.静态资源导入 SpringBoot中的静态资源,默认有以下四个路径可以访问: classpath:/META-INF/resources/ classpath:/resources/ classpath:/static/ classpath:/public/ 其中第一个路径,一般不常用,它是来获取用maven导入webj…

4.5.CVAT——视频标注的详细步骤

文章目录 1. 跟踪模式(基础)2. 跟踪模式(高级)3. 带多边形的轨迹模式 追踪模式Track mode (视频标注使用)——类似pr的动画效果 1. 跟踪模式(基础) 使用示例: 为一系列…

如何创建MinIO存储服务公网地址实现固定TCP域名异地远程访问——“cpolar内网穿透”

文章目录 前言1. 创建Buckets和Access Keys2. Linux 安装Cpolar3. 创建连接MinIO服务公网地址4. 远程调用MinIO服务小结5. 固定连接TCP公网地址6. 固定地址连接测试 前言 MinIO是一款高性能、分布式的对象存储系统,它可以100%的运行在标准硬件上,即X86等…

Python 全栈系列231 以数据处理为核心的微服务思考

说明 最初我是专注与做数据分析和建模的,通俗点说也就是pandas和sklearn。照理来说,分析和建模作为一种分工,本身是可以独立于架构的设计和使用的。其实也就是从20年之后,我才开始花比较多的时间研究这一块。 回想了一下原因&am…