FreeRTOS事件实验
前面章节我们学习了如何使用信号量来实现同步,但是使用信号量来同步的 话任务只能与单个的任务进行同步。有时候某个任务可能会需要与多个任务进行 同步,此时信号量就无能为力。FreeRTOS 为此提供了一个可选的解决方法,那 就是事件标志组。本章要实现的功能是:主要创建了两个任务,一个是设置事件 任务,一个是等待事件任务,两个任务独立运行,设置事件任务通过检测按键的 按下情况设置不同的事件标志位,等待事件任务则获取这两个事件标志位,并且 判断两个事件是否都发生,如果是则输出相应信息,LED 进行翻转。等待事件任 务的等待时间是 portMAX_DELAY,一直在等待事件的发生,等待到事件之后清除 对应的事件标记位。本章分为如下几部分内容: 9.1 事件简介 9.2 常用事件 API 函数 9.3 硬件设计 9.4 软件设计 9.5 实验现象
9.1 事件简介
事件是一种实现任务间通信的机制,主要用于实现多任务间的同步,但事件 通信只能是事件类型的通信,无数据传输。与信号量不同的是,它可以实现一对 多,多对多的同步。即一个任务可以等待多个事件的发生:可以是任意一个事件 发生时唤醒任务进行事件处理;也可以是几个事件都发生后才唤醒任务进行事件 处理。同样,也可以是多个任务同步多个事件。 每一个事件组只需要很少的 RAM 空间来保存事件组的状态。事件组存储在 一个 EventBits_t 类型的变量中,该变量在事件组结构体中定义。如果宏 configUSE_16_BIT_TICKS 定义为 1,那么变量 uxEventBits 就是 16 位的,其 中有 8 个位用来存储事件组;而如果宏 configUSE_16_BIT_TICKS 定义为 0, 那么变量 uxEventBits 就是 32 位的,其中有 24 个位用来存储事件组。在 STM32 中,我们一般将 configUSE_16_BIT_TICKS 定义为 0,那么 uxEventBits 是 32 位的,有 24 个位用来实现事件标志组。每一位代表一个事件,任务通过“逻辑 与”或“逻辑或”与一个或多个事件建立关联,形成一个事件组。事件的“逻辑 或”也被称作是独立型同步,指的是任务感兴趣的所有事件任一件发生即可被唤 醒;事件“逻辑与”则被称为是关联型同步,指的是任务感兴趣的若干事件都发 生时才被唤醒,并且事件发生的时间可以不同步。 多任务环境下,任务、中断之间往往需要同步操作,一个事件发生会告知等 待中的任务,即形成一个任务与任务、中断与任务间的同步。事件可以提供一对 多、多对多的同步操作。一对多同步模型:一个任务等待多个事件的触发,这种 情况是比较常见的;多对多同步模型:多个任务等待多个事件的触发。 任务可以通过设置事件位来实现事件的触发和等待操作。FreeRTOS 的事件 仅用于同步,不提供数据传输功能。 FreeRTOS 提供的事件具有如下特点: ●事件只与任务相关联,事件相互独立,一个 32 位的事件集合 (EventBits_t 类型的变量,实际可用与表示事件的只有 24 位),用于标识该 任务发生的事件类型,其中每一位表示一种事件类型(0 表示该事件类型未发生、 1 表示该事件类型已经发生),一共 24 种事件类型。 ●事件仅用于同步,不提供数据传输功能。 ●事件无排队性,即多次向任务设置同一事件(如果任务还未来得及读走), 等效于只设置一次。 ●允许多个任务对同一事件进行读写操作。 ●支持事件等待超时机制。 在 FreeRTOS 事件中,每个事件获取的时候,用户可以选择感兴趣的事件, 并且选择读取事件信息标记,它有三个属性,分别是逻辑与,逻辑或以及是否清 除标记。当任务等待事件同步时,可以通过任务感兴趣的事件位和事件信息标记 来判断当前接收的事件是否满足要求,如果满足则说明任务等待到对应的事件, 系统将唤醒等待的任务;否则,任务会根据用户指定的阻塞超时时间继续等待下 去。
9.1.1 事件应用场景
FreeRTOS 的事件用于事件类型的通讯,无数据传输,也就是说,我们可以 用事件来做标志位,判断某些事件是否发生了,然后根据结果做处理,那很多人 又会问了,为什么我不直接用变量做标志呢,岂不是更好更有效率?非也非也, 若是在裸机编程中,用全局变量是最为有效的方法,这点我不否认,但是在操作 系统中,使用全局变量就要考虑以下问题了: ●如何对全局变量进行保护呢,如何处理多任务同时对它进行访问? ●如何让内核对事件进行有效管理呢?使用全局变量的话,就需要在任务中 轮询查看事件是否发送,这简直就是在浪费 CPU 资源啊,还有等待超时机制, 使用全局变量的话需要用户自己去实现。 所以,在操作系统中,还是使用操作系统给我们提供的通信机制就好了,简 单方便还实用。 在某些场合,可能需要多个时间发生了才能进行下一步操作,比如一些危险 机器的启动,需要检查各项指标,当指标不达标的时候,无法启动,但是检查各 个指标的时候,不能一下子检测完毕,所以,需要事件来做统一的等待,当所有 的事件都完成了,那么机器才允许启动,这只是事件的其中一个应用。 事件可使用于多种场合,它能够在一定程度上替代信号量,用于任务与任务 间,中断与任务间的同步。一个任务或中断服务例程发送一个事件给事件对象, 而后等待的任务被唤醒并对相应的事件进行处理。但是它与信号量不同的是,事 件的发送操作是不可累计的,而信号量的释放动作是可累计的。事件另外一个特 性是,接收任务可等待多种事件,即多个事件对应一个任务或多个任务。同时按 照任务等待的参数,可选择是“逻辑或”触发还是“逻辑与”触发。这个特性也 是信号量等所不具备的,信号量只能识别单一同步动作,而不能同时等待多个事 件的同步。 各个事件可分别发送或一起发送给事件对象,而任务可以等待多个事件,任 务仅对感兴趣的事件进行关注。当有它们感兴趣的事件发生时并且符合感兴趣的 条件,任务将被唤醒并进行后续的处理动作。
9.1.2 事件运作机制
接收事件时,可以根据感兴趣的事件类型接收事件的单个或者多个事件类 型。事件接收成功后,必须使用 xClearOnExit 选项来清除已接收到的事件类型, 否则不会清除已接收到的事件,这样就需要用户显式清除事件位。用户可以自定 义通过传入参数 xWaitForAllBits 选择读取模式,是等待所有感兴趣的事件还 是等待感兴趣的任意一个事件。 设置事件时,对指定事件写入指定的事件类型,设置事件集合的对应事件位 为 1,可以一次同时写多个事件类型,设置事件成功可能会触发任务调度。 清除事件时,根据入参数事件句柄和待清除的事件类型,对事件对应位进行 清 0 操作。 事件不与任务相关联,事件相互独立,一个 32 位的变量(事件集合,实际 用于表示事件的只有 24 位),用于标识该任务发生的事件类型,其中每一位表 示一种事件类型(0 表示该事件类型未发生、1 表示该事件类型已经发生),一 共 24 种事件类型具体如下。

事件唤醒机制,当任务因为等待某个或者多个事件发生而进入阻塞态,当事 件发生的时候会被唤醒,其过程具体如下。

任务 1 对事件 3 或事件 5 感兴趣(逻辑或),当发生其中的某一个事件 都会被唤醒,并且执行相应操作。而任务 2 对事件 3 与事件 5 感兴趣(逻辑 与),当且仅当事件 3 与事件 5 都发生的时候,任务 2 才会被唤醒,如果只 有一个其中一个事件发生,那么任务还是会继续等待事件发生。如果在接收事件 函数中设置了清除事件位 xClearOnExit,那么当任务唤醒后将把事件 3 和事件 5 的事件标志清零,否则事件标志将依然存在。
9.2 常用事件 API 函 数
这里我不载过多介绍,如果需要了解API函数的可以看我上传的API手册
白嫖的可以getee搜索 SunYinggang_Gitee / FreeRTOS_API_Reference_CN
下载FreeRTOS中文参考API函数手册
整体代码
相关文章
- java-net-php-python-jsp网络考试系统计算机毕业设计程序
java-net-php-python-jsp网络考试系统计算机毕业设计程序 java-net-php-python-jsp网络考试系统计算机毕业设计程序本源码技术栈: 项目架构:B/S架构 开发语言:Java语言 开发软件:idea eclipse 前端技术:Layui、HTM…...
2023/3/26 19:18:27 - 一文读懂如何让网页变灰白色(黑白色)
文章目录1. 文章引言2. 实现方法2.1 修改CSS文件2.2 修改html标签2.3 修改body标签2.4 使用grayscale.js插件1. 文章引言 有段时间,我们打开知名的网页,发现全部变成黑白色了,如下图所示: 一般在清明节,全国哀悼日&am…...
2023/3/26 19:18:25 - Python移动端自动化
Appium是一个跨平台移动端自动化测试工具,可以为IOS和Android平台创建自动化测试用例。可以模拟App内部的各种操作,如点击、滑动、文本输入等。只要我们手工操作的动作Appium都可以完成。 一、自动化环境搭建 Java JDK Android SDK Appium Python 二、…...
2023/3/26 19:18:16 - web前端:自定义视频播放器,原生js实现窗口自适应,视频/音量进度条应用
1.less页面包装,引用混合 //导入播放器基础css import "reset.less"; //定义进度条混合 .progress-bar-position() {position: relative; }.progress-bar-line() {//定位:位置不变position: absolute;//进度条:height:…...
2023/3/26 19:18:14 - Proteus8仿真:51单片机IrLink红外发送加接受模块的使用
51单片机IrLink红外的使用元器件原理图部分代码单片机1发送main.c单片机2接受main.c工程文件元器件 元器件名称51单片机AT89C51红外收发IRLINK按键BUTTON发光二极管LED-RED时钟激励源DCLOCK与门74LS08示波器 原理图部分 关于IRLINK的使用: 在Proteus上就是一个红外…...
2023/3/26 19:18:12 - 你的Web3域名 价值究竟何在?
当你又一次听说某 Web3 域名被卖出天价的时候,当你又一次看到身边一位 Web3 朋友改用域名作为其用户名的时候,当你开始在注册栏中物色自己感兴趣的域名的时候,你是否有深思,这些域名究竟有么用?不同项目之前的区别和联…...
2023/3/26 19:17:55 - STM32项目设计:基于stm32f103c8t6智能电梯系统
文章目录一、项目功能概述二、项目材料选择三、原理图设计四、PCB板设计五、主程序设计六、成品展示资料链接:待更新~ 哔哩哔哩视频链接:https://www.bilibili.com/video/BV17D4y1V7HG/?vd_sourcee5082ef80535e952b2a4301746491be0(bilibili…...
2023/3/26 19:17:50 - javascript手写bind函数
Function.prototype.bindq function(objThis){if(typeof this ! function){throw Error(需要函数才能绑定)}let that thislet args Array.prototype.splice.call(arguments,1);let fun function(){let a args.concat(Array.prototype.splice.call(arguments,0))//可使用手写…...
2023/3/26 19:17:50 - 【Rtklib入门指南】1. Rtklib下载及编译
写在前面其实前几年还在校的时候出过一个还不太成熟的教程,回头看的时候发现有诸多不够成熟的地方,如今的工作自由时间相对较多,因此萌生了重新梳理,提升博客质量的想法。因此,就有了这个新的系列。对于大多数GNSS的从…...
2023/3/26 19:17:46 - (黑马C++)L06 重载与继承
一、关系运算符重载 以重载等于号运算符为例: #include<string> #include <iostream> using namespace std;class Person { public:Person(string Name, int age) {this->m_Name Name;this->m_Age age;}public:string m_Name;int m_Age; };bo…...
2023/3/26 19:17:41 - Ubuntu20.04安装k8s v1.21.0
1. 禁用swap分区, 修改网络配置 sudo vim /etc/fstab 把有swap的那一行注释掉即可,如下: 然后执行如下命令 cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf net.bridge.bridge-nf-call-ip6tables 1 net.bridge.bridge-nf-call-iptables 1 EOF …...
2023/3/26 19:17:38 - 免费个人商城系统源码推荐
1.来客推开源商城(前后端开源,免费商用,可以LOGO) 来客推开源版电商小程序,可去Logo前后端全部开源~ PHP5.6、 MYSQL5.5、Uniapp、原生小程序、原生IOS、原生Android、 自主研发框架(古典式开发框架&…...
2023/3/26 19:17:19 - java毕业生设计校园疫情防控管理系统计算机源码+系统+mysql+调试部署+lw
java毕业生设计校园疫情防控管理系统计算机源码系统mysql调试部署lw java毕业生设计校园疫情防控管理系统计算机源码系统mysql调试部署lw本源码技术栈: 项目架构:B/S架构 开发语言:Java语言 开发软件:idea eclipse 前端技术&a…...
2023/3/26 19:17:14 - 冒泡排序的JavaScript代码实现
// 定义一个函数用于实现冒泡排序 function bubbleSort(arr) {// 定义一个变量用于表示是否发生交换的标志let swapped;// 循环遍历数组中的每一个元素for (let i 0; i < arr.length; i) {// 初始化标志变量为 falseswapped false;// 内层循环,用于比较相邻的两…...
2023/3/26 19:17:07 - 联想拯救者屏幕亮度无法调节,监视器和显卡驱动问题,经过多种测试
主要的问题位置 1,设备管理器中的监视器部分 2,设备管理器的显卡适配器部分 个人电脑出现这种情况的原因 自己拆一下机器加装固态,但这种感觉不应该导致问题。但导致这种问题的原因可能是装固态时候把电池拔了。 一些网上常说的方法 更新…...
2023/3/26 19:16:52 - 热门Java开发工具IDEA入门指南——从Eclipse迁移到IntelliJ IDEA(三)
IntelliJ IDEA,是java编程语言开发的集成环境。IntelliJ在业界被公认为最好的java开发工具,尤其在智能代码助手、代码自动提示、重构、JavaEE支持、各类版本工具(git、svn等)、JUnit、CVS整合、代码分析、 创新的GUI设计等方面的功能是非常强大的。 本文…...
2023/3/26 19:16:48 - Android Native Thread
本文使用android版本为:Android pie_9.0.0_r3 在Android的Framework层,使用线程时都是Thread类,究其根本还是POSIX标准的pthread类实现,只不过加入了一些android中特有的特性,比如:继承RefBase,将其纳入只…...
2023/3/26 19:16:27 - 【仿牛客网笔记】 Spring Boot进阶,开发社区核心功能-事务管理
添加评论中会用到事务管理。 解决的程度不同,层级不同。我们一般选择中间的级别。 选择时既能满足业务的需要,又能保证业务的安全性,在这样的前提下我们追求一个更高的性能。 第一类丢失更新 图中是没有事务隔离的情况 第二类丢失更新 脏…...
2023/3/26 19:16:18 - Java——最大子数组和
题目链接 leetcode在线oj题——最大子数组和 题目描述 给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 子数组 是数组中的一个连续部分。 题目示例 输入:…...
2023/3/26 19:16:13 - train_test_split用法总结
sklearn.model_selection.train_test_split随机划分训练集和测试集 官网文档:http://scikit-learn.org/stable/modules/generated/sklearn.model_selection.train_test_split.html#sklearn.model_selection.train_test_split 一般形式: train_test_spli…...
2023/3/26 19:15:53
最新文章
- FreeRTOS事件实验
前面章节我们学习了如何使用信号量来实现同步,但是使用信号量来同步的 话任务只能与单个的任务进行同步。有时候某个任务可能会需要与多个任务进行 同步,此时信号量就无能为力。FreeRTOS 为此提供了一个可选的解决方法,那 就是事件标志组。本…...
2023/3/26 19:18:39 - java-net-php-python-jsp网络考试系统计算机毕业设计程序
java-net-php-python-jsp网络考试系统计算机毕业设计程序 java-net-php-python-jsp网络考试系统计算机毕业设计程序本源码技术栈: 项目架构:B/S架构 开发语言:Java语言 开发软件:idea eclipse 前端技术:Layui、HTM…...
2023/3/26 19:18:27 - 一文读懂如何让网页变灰白色(黑白色)
文章目录1. 文章引言2. 实现方法2.1 修改CSS文件2.2 修改html标签2.3 修改body标签2.4 使用grayscale.js插件1. 文章引言 有段时间,我们打开知名的网页,发现全部变成黑白色了,如下图所示: 一般在清明节,全国哀悼日&am…...
2023/3/26 19:18:25 - 使用继承的虚函数表
代码 #include <iostream> using namespace std;class Father { public:virtual void func1() { cout << "Father::func1" << endl; }virtual void func2() { cout << "Father::func2" << endl; }virtual void func3()…...
2023/3/26 19:18:18 - Python移动端自动化
Appium是一个跨平台移动端自动化测试工具,可以为IOS和Android平台创建自动化测试用例。可以模拟App内部的各种操作,如点击、滑动、文本输入等。只要我们手工操作的动作Appium都可以完成。 一、自动化环境搭建 Java JDK Android SDK Appium Python 二、…...
2023/3/26 19:18:16 - web前端:自定义视频播放器,原生js实现窗口自适应,视频/音量进度条应用
1.less页面包装,引用混合 //导入播放器基础css import "reset.less"; //定义进度条混合 .progress-bar-position() {position: relative; }.progress-bar-line() {//定位:位置不变position: absolute;//进度条:height:…...
2023/3/26 19:18:14 - Redis入门与应用
目录 Redis的技术全景 两大维度 三大主线 Redis的版本选择与安装 Redis的linux安装 Redis的启动 操作 停止 Redis全局命令 键名的生产实践 Redis常用数据结构 字符串(String) 哈希(Hash)(使用场景:数据量大,适用于数据…...
2023/3/26 19:18:13 - Proteus8仿真:51单片机IrLink红外发送加接受模块的使用
51单片机IrLink红外的使用元器件原理图部分代码单片机1发送main.c单片机2接受main.c工程文件元器件 元器件名称51单片机AT89C51红外收发IRLINK按键BUTTON发光二极管LED-RED时钟激励源DCLOCK与门74LS08示波器 原理图部分 关于IRLINK的使用: 在Proteus上就是一个红外…...
2023/3/26 19:18:12 - Golang学习Day2
Go语言中的函数go语言中函数特性go语言有三种函数:普通函数、匿名函数(没有名称的函数)方法(定义在struct上的函数)。receivergo语言中不运算函数重载(overload),也就是说不允许函数…...
2023/3/26 19:18:11 - 你的Web3域名 价值究竟何在?
当你又一次听说某 Web3 域名被卖出天价的时候,当你又一次看到身边一位 Web3 朋友改用域名作为其用户名的时候,当你开始在注册栏中物色自己感兴趣的域名的时候,你是否有深思,这些域名究竟有么用?不同项目之前的区别和联…...
2023/3/26 19:17:55 - STM32项目设计:基于stm32f103c8t6智能电梯系统
文章目录一、项目功能概述二、项目材料选择三、原理图设计四、PCB板设计五、主程序设计六、成品展示资料链接:待更新~ 哔哩哔哩视频链接:https://www.bilibili.com/video/BV17D4y1V7HG/?vd_sourcee5082ef80535e952b2a4301746491be0(bilibili…...
2023/3/26 19:17:50 - javascript手写bind函数
Function.prototype.bindq function(objThis){if(typeof this ! function){throw Error(需要函数才能绑定)}let that thislet args Array.prototype.splice.call(arguments,1);let fun function(){let a args.concat(Array.prototype.splice.call(arguments,0))//可使用手写…...
2023/3/26 19:17:50 - 【Rtklib入门指南】1. Rtklib下载及编译
写在前面其实前几年还在校的时候出过一个还不太成熟的教程,回头看的时候发现有诸多不够成熟的地方,如今的工作自由时间相对较多,因此萌生了重新梳理,提升博客质量的想法。因此,就有了这个新的系列。对于大多数GNSS的从…...
2023/3/26 19:17:46 - (黑马C++)L06 重载与继承
一、关系运算符重载 以重载等于号运算符为例: #include<string> #include <iostream> using namespace std;class Person { public:Person(string Name, int age) {this->m_Name Name;this->m_Age age;}public:string m_Name;int m_Age; };bo…...
2023/3/26 19:17:41 - Ubuntu20.04安装k8s v1.21.0
1. 禁用swap分区, 修改网络配置 sudo vim /etc/fstab 把有swap的那一行注释掉即可,如下: 然后执行如下命令 cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf net.bridge.bridge-nf-call-ip6tables 1 net.bridge.bridge-nf-call-iptables 1 EOF …...
2023/3/26 19:17:38 - 极光笔记 | 埋点体系建设与实施方法论
PART 01 前 言随着网络技术的发展,从粗犷型到精细化运营型,再到现在的数字化运营,数据变得越来越细分和重要,不仅可以进行策略调整,还可以实现自动化的精细化运营。而数据价值的起点就是埋点,只有合理地埋点…...
2023/3/26 19:17:34 - 免费个人商城系统源码推荐
1.来客推开源商城(前后端开源,免费商用,可以LOGO) 来客推开源版电商小程序,可去Logo前后端全部开源~ PHP5.6、 MYSQL5.5、Uniapp、原生小程序、原生IOS、原生Android、 自主研发框架(古典式开发框架&…...
2023/3/26 19:17:19 - java毕业生设计校园疫情防控管理系统计算机源码+系统+mysql+调试部署+lw
java毕业生设计校园疫情防控管理系统计算机源码系统mysql调试部署lw java毕业生设计校园疫情防控管理系统计算机源码系统mysql调试部署lw本源码技术栈: 项目架构:B/S架构 开发语言:Java语言 开发软件:idea eclipse 前端技术&a…...
2023/3/26 19:17:14 - 冒泡排序的JavaScript代码实现
// 定义一个函数用于实现冒泡排序 function bubbleSort(arr) {// 定义一个变量用于表示是否发生交换的标志let swapped;// 循环遍历数组中的每一个元素for (let i 0; i < arr.length; i) {// 初始化标志变量为 falseswapped false;// 内层循环,用于比较相邻的两…...
2023/3/26 19:17:07 - 联想拯救者屏幕亮度无法调节,监视器和显卡驱动问题,经过多种测试
主要的问题位置 1,设备管理器中的监视器部分 2,设备管理器的显卡适配器部分 个人电脑出现这种情况的原因 自己拆一下机器加装固态,但这种感觉不应该导致问题。但导致这种问题的原因可能是装固态时候把电池拔了。 一些网上常说的方法 更新…...
2023/3/26 19:16:52