利用STM32CubeMX和keil模拟器,3天入门FreeRTOS(2.1) —— 任务挂起和恢复

前言

(1)FreeRTOS是我一天过完的,由此回忆并且记录一下。个人认为,如果只是入门,利用STM32CubeMX是一个非常好的选择。学习完本系列课程之后,再去学习网上的一些其他课程也许会简单很多。
(2)本系列课程是使用的keil软件仿真平台,所以对于没有开发板的同学也可也进行学习。
(3)叠甲,再次强调,本系列课程仅仅用于入门。学习完之后建议还要再去寻找其他课程加深理解。
(4)本系列博客对应代码仓库:

实操

(1)依旧是将上一篇博客的工程复制一份下来

在这里插入图片描述

任务挂起和恢复的宏

(1)如果需要调用任务挂起和恢复的函数,需要在FreeRTOSConfig.h文件中确认INCLUDE_vTaskSuspend 这个宏被置1了。

在这里插入图片描述

任务挂起和恢复代码实现

(1)在StartCubemxTask函数中进行如下补充即可。(按Ctrl+F搜索StartCubemxTask即可找到任务函数)

/* USER CODE END Header_StartCubemxTask */
void StartCubemxTask(void *argument)
{/* USER CODE BEGIN StartCubemxTask */char *CubemxTaskPrintf = (char *)argument;uint8_t Task_Status = 0;/* Infinite loop */for(;;){if(HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_14) == GPIO_PIN_SET){printf(CubemxTaskPrintf);Task_Status++;while(HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_14) == GPIO_PIN_SET);}switch(Task_Status){case 1:// 挂起 keilTask 任务vTaskSuspend(keilTaskHandle);					break;case 2:// 恢复 keilTask 任务vTaskResume(keilTaskHandle);			break;default:Task_Status = 0;break;}}/* USER CODE END StartCubemxTask */
}

测试结果

(1)因为这里不会修改STM32CubeMX,所以keil的模拟器配置都还在,因此可以直接开始测试。
(2)测试结果发现,StartKeilTask Creat的字符串只会打印一次。而不是像任务删除和创建那样,每进行一次删除和创建都会打印一次StartKeilTask Creat

在这里插入图片描述

理论

FreeRTOS的4种任务状态

(1)首先我先介绍一下FreeRTOS的4种任务状态都是什么意思:
<1>Running 运行态: 当任务处于实际运行状态称之为运行态,即CPU的使用权被这个任务占用(对于单核处理器,同一时间仅一个任务处于运行态。后续会讲解RTOS的多任务执行原理)。
<2>Ready 就绪态: 处于就绪态的任务是指那些能够运行(没有被阻塞和挂起),但是当前没有运行的任务,因为同优先级或更高优先级的任务正在运行。
<3>Blocked 阻塞态: 如果一个任务因延时,或等待信号量、消息队列、事件标志组等而处于的状态被称之为阻塞态。当出现特定的事件发生,会自动进入就绪态。
<4>Suspended 挂起态: 任务暂停,必须手动调用xTaskResume()函数才可以进入就绪态。
(2)因为网上的FreeRTOS的4种任务切换图都是纯英文的,我于是就自己画了一个。这里简单介绍一下:
<1>进入就绪态: 当我们创建了一个任务之后,他就会进入就绪态,等待任务调度。
<2>就绪态和运行态切换: 就绪态和运行态的切换是由FreeRTOS的任务调度器进行切换的,我们人为无法改变。
<3>就绪态和阻塞态切换: 当发生特定的任务时候,任务会自动从阻塞态进入就绪态。例如任务延时结束,成功获取到了信号量、消息队列、事件标志组等信息。(听不懂别慌,后面讲同步互斥与通信的时候会详细讲解)
<4>就绪态和挂起态切换:

  • 当运行中的任务调用vTaskSuspend()函数,并在这个函数中传入需要挂起的任务句柄,那么这个处于就绪态的任务将会变为挂起态。
  • 当运行中的任务调用vTaskResume()函数,并在这个函数中传入需要从挂起态进入就绪态的任务句柄,那么这个处于挂起态的任务将会变为就绪态。

<5>运行态和挂起态切换: 当运行中的任务调用vTaskSuspend(NULL)的时候,就能够从运行态进入挂起态。
<6>运行态和阻塞态切换: 调用相关的阻塞API接口,例如vTaskDelay()vTaskDelayUntil() 这种延时函数,或者是信号量、消息队列或事件组等机制的一些函数。
<7>挂起态和阻塞态切换: 当运行中的任务调用vTaskSuspend()函数,并在这个函数中传入需要挂起的任务句柄,那么这个处于阻塞态的任务将会变为挂起态。

在这里插入图片描述

eTaskGetState()函数介绍

(1)获取任务状态

/*** @brief  获取任务状态** @param  需要获取任务状态的任务句柄** @return  eRunning   任务处于Running运行态*         -eReady     任务处于Ready就绪态*         -eBlocked   任务处于Blocked阻塞态*         -eSuspended 任务处于Suspended挂起态*         -eDeleted   任务的结构正在等待清理*/
eTaskState eTaskGetState( TaskHandle_t xTask );

vTaskSuspend()函数介绍

(1) vTaskSuspend()用于挂起(暂停)任务,传入对应的任务句柄即可。
(2)如果需要挂起(暂停),那么就传入NULL

/*** @brief  挂起(暂停)的任务** @param  要挂起(暂停)任务的任务句柄,如果是挂起(暂停)自己,传入NULL** @return 无*/
void vTaskSuspend( TaskHandle_t xTaskToSuspend );

vTaskResume()函数介绍

(1)vTaskResume()用于恢复被挂起(暂停)任务,传入对应的任务句柄即可。
(2)担心有小白问出一些抽象的问题,比如,为什么可以自己挂起自己,而不能自己恢复自己呢?你想想,任务都挂起了,根本就无法执行,你还自己恢复自己,咋想的?

/*** @brief  恢复的任务** @param  要恢复任务的任务句柄** @return 无*/
void vTaskResume( TaskHandle_t xTaskToResume );

参考

(1)FreeRTOS官方文档:vTaskSuspend函数介绍
(2)FreeRTOS官方文档:vTaskResume函数介绍
(3)FreeRTOS官方API文档

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

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

相关文章

Windows 下ffmpeg安装及实践

Windows 下ffmpeg安装及实践 背景安装实践其他 背景 最近负责音频文件处理相关的业务&#xff0c;涉及到 ffmpeg 对一些音频文件格式的校验&#xff0c;记录一下安装过程及踩坑过程。 安装 如图1所示&#xff0c;进入官网&#xff0c;在windows下任选一个文件&#xff1a;h…

day01 深度学习介绍

目录 1.1深度学习介绍 1.2神经网络NN 1、概念&#xff1a; 2、神经元 3、&#xff08;单层&#xff09;神经网络 4、感知机&#xff08;两层&#xff09; 5、多层神经网络 6、激活函数 &#xff08;1&#xff09;饱和与非饱和激活函数 &#xff08;2&#xff09;饱和激活…

写着玩的程序:pycharm实现无限弹窗程序(非病毒程序,仅整蛊使用)

运行环境 PyCharm 2023.2.1 python3.11 具体内容 源代码 import tkinter as tk from tkinter import messagebox import threadingclass PopupGenerator:def __init__(self):self.root tk.Tk()self.root.geometry("200x120")self.root.title("无限弹窗&qu…

LeetCode---380周赛

题目列表 3005. 最大频率元素计数 3006. 找出数组中的美丽下标 I 3007. 价值和小于等于 K 的最大数字 3008. 找出数组中的美丽下标 II 一、最大频率元素计数 这题就是个简单的计数题&#xff0c;正常遍历统计数据即可&#xff0c;关键是你要会写代码逻辑。 代码如下&…

Java设计模式-代理模式(7)

馆长准备了很多学习资料,其中包含java方面,jvm调优,spring / spring boot /spring cloud ,微服务,分布式,前端,js书籍资料,视频资料,以及各类常用软件工具,破解工具 等资源。请关注“IT技术馆”公众号,进行关注,馆长会每天更新资源和更新技术文章等。请大家多多关注…

steam游戏搬砖项目还能火多久?

最近放假回到老家&#xff0c;见了不少亲戚朋友&#xff0c;大家不约而同都在感叹今年大环境不好&#xff0c;工作不顺&#xff0c;生意效益不好&#xff0c;公司状况不佳&#xff0c;反问我们生意如何&#xff1f;为了让他们心里好受一点&#xff0c;我也假装附和道:也不咋地&…

为什么电脑降价了?

周末&#xff0c;非常意外地用不到3000元买到了一款2023年度发布的华为笔记本I5,16G,500G&#xff0c;基本是主流配置&#xff0c;我非常意外&#xff0c;看了又看&#xff0c;不是什么Hwawii&#xff0c;或者Huuawe。然后也不是二手。为什么呢&#xff1f;因为在ALU和FPU之外&…

Maven 打包时,依赖配置正确,但是类引入出现错误,一般是快照(Snapshot)依赖拉取策略问题

问题描述&#xff1a; 项目打包时&#xff0c;类缺少依赖&#xff0c;操作 pom.xml -> Maven -> Reload project &#xff0c;还是不生效&#xff0c;但是同事&#xff08;别人&#xff09;那里正常。 问题出现的环境&#xff1a; 可能项目是多模块项目&#xff0c;结构…

图论可达性c语言实现

概述 图论中的可达性是指在图中是否存在从一个顶点到另一个顶点的路径。这是图论中的一个基本概念&#xff0c;对于许多实际问题的建模和解决都非常重要。以下是关于图论可达性的一些重要概念和信息&#xff1a; 有向图和无向图&#xff1a; 图可以分为有向图和无向图。在有向图…

MySQL JSON数据类型

在日常开发中&#xff0c;我们经常会在 MySQL 中使用 JSON 字段&#xff0c;比如很多表中都有 extra 字段&#xff0c;用来记录一些特殊字段&#xff0c;通过这种方式不需要更改表结构&#xff0c;使用相对灵活。 目前对于 JSON 字段的实践各个项目不尽相同&#xff0c;MySQL 表…

未来趋势:视频美颜SDK与增强现实(AR)的融合

当下&#xff0c;视频美颜SDK不断演化&#xff0c;成为用户记录和分享生活时不可或缺的一部分。同时&#xff0c;增强现实技术也以其独特的沉浸感和交互性受到青睐&#xff0c;被广泛应用于游戏、教育、医疗等领域。 一、视频美颜与AR的结合 1.实时美颜的AR增值体验 借助AR的…

【Web前端开发基础】CSS的结构伪类选择器、伪元素、浮动

CSS的浮动 目录 CSS的浮动一、学习目标二、文章内容2.1 结构伪类选择器2.2 伪元素2.3 标准流2.4 浮动2.5 清除浮动2.6 拓展&#xff08;BFC&#xff09; 三、综合案例3.1 小米模块案例3.2 网页导航案例 一、学习目标 能够使用结构伪类选择器在HTML中选元素能够说出标准流元素的…

服务器管理平台(5)- 数据展示

数据展示 Grafana导入MySQL数据源进行定制化数据展示&#xff0c;包括品牌分类饼图&#xff0c;详细数据列表等LayUI为开源前端框架&#xff0c;对系统概览、登录日志等信息&#xff0c;划分不同页面使用表格展示详细数据 1、Grafana 对品牌、CPU型号、内存等数据使用饼图展示…

探索全球DNS体系 | 从根服务器到本地解析

DNS 发展 DNS&#xff08;Domain Name System&#xff09;的起源可以追溯到互联网早期。 早期的挑战&#xff1a; 早期互联网主要通过IP地址进行通信&#xff0c;用户需要记住复杂的数字串来访问网站。 需求的催生&#xff1a; 随着互联网的扩大&#xff0c;更简单、易记的…

【剑指offer】重建二叉树

&#x1f451;专栏内容&#xff1a;力扣刷题⛪个人主页&#xff1a;子夜的星的主页&#x1f495;座右铭&#xff1a;前路未远&#xff0c;步履不停 目录 一、题目描述1、题目2、示例 二、题目分析1、递归2、栈 一、题目描述 1、题目 剑指offer&#xff1a;重建二叉树 给定节…

在CentOS 7中配置 RAID服务

实验过程 Xnode1克隆虚拟机raid ps&#xff1a; 阿里云盘Xnode1获取 xnode1 https://www.alipan.com/s/HgLXfoeBWG2 提取码: eb70 编辑虚拟机 添加2硬盘 CRT连接&#xff08;root密码&#xff1a;000000&#xff09; 创建raid 0 [rootdemo ~]# lsblk 安装mdadm [rootdemo…

go语言(十四)----反射

变量的结构 2 举个例子 package mainimport "fmt"type Reader interface {ReadBook() }type Writer interface {WriteBook() }//具体类型 type Book struct {}func (this *Book) ReadBook() {fmt.Println("Read a Book")}func (this *Book) WriteBook() {…

项目工时统计成本核算管理

技术架构: Java 1.8 MySQL 8 Vue 项目基于前后端分离架构&#xff0c;服务端主要技术&#xff1a;SpringBoot 前端主要是Vue。 项目介绍&#xff1a; 轻量级项目工时统计系统&#xff0c;是目前企业进行项工时管理统计的推荐选择。 通过项目工时管理系统&#xff0c;可通过…

Github2024-01-23 开源项目日报 Top9

根据Github Trendings的统计&#xff0c;今日(2024-01-23统计)共有9个项目上榜。根据开发语言中项目的数量&#xff0c;汇总情况如下&#xff1a; 开发语言项目数量Python项目3Go项目2TypeScript项目2Dart项目1Jupyter Notebook项目1 gpt4free 语言模型集合改进计划 创建周期…

vConsole 与 Vue中未定义变量而引发的Maximum call stack size exceeded异常问题

一、问题描述 前段时间有个前端小伙伴反馈在打包发布正式环境后调用VantUI的<van-popup>组件显示时&#xff0c;显示空白&#xff0c;并且在控制台看到一个Maximum call stacksize exceeded&#xff08;超出最大调用堆栈大小&#xff09;,而本地开发环境正常&#xff1a…