FreeRTOS——事件标志组

一、概念与应用

1.1概念

事件是实现任务与任务或任务与中断间 通信的机制,用于同步,无数据传输。(注意与二值信号量区分)

与信号量不同的是,事件可以实现一对多、多对多的同步,即一个任务可以等待多个事件的发生:可以是任意一个事件发生时唤醒任务进行事件处理;也可以是几个事件都发生后才唤醒任务进行事件处理。同样,也可以是多个任务同步多个事件。

实际上,事件就是事件组中的最小单元——bit

1.2特点

  • 事件仅用于同步,不提供数据传输

  • 事件相互独立,一个32位的事件集合(EventBitst类型的变量,实际可用于表示事件的只有低24位)用于标识该任务发生的事件类型,其中每一位表示一种事件类型(0表示该事件类型未发生,1表示该事件类型已经发生),一共有 24种事件类型

  • 事件的公共性——允许多个任务对同一事件进行读写操作

  • 支持事件等待超时机制

  • 多次向任务设置同一事件(如果任务还未来得及读取),等效于只设置一次

FreeRTOS 中,获取每个事件时,用户可以选择感兴趣的事件,并且选择读取事件信息标记。它有3个属性,分别是逻辑与、逻辑或以及是否清除标记。当任务等待事件同步时,可以通过任务感兴趣的事件位事件信息标记判断当前接收的事件是否满足要求,如果满足,则说明任务等到对应的事件,系统将唤醒等待的任务;否则,任务会根据用户指定的阻塞超时时间继续等待下去  

1.3应用

似乎和全局变量很像?而且用全局变量更有效率?

确实,如果是在裸机编程中,用全局变量是最有效的方法,但那是不得已,比如:

①如何对全局变量进行保护?如何处理多任务同时对它进行访问的情况?

②如何让内核对事件进行有效管理?

使用全局变量,不可避免得需要在任务中轮询查看事件是否发送,这会造成CPU 资源的浪费,此外,用户还需要自己去实现等待超时机制。

操作系统给我们提供了丰富的组件,当然要善于运用

某些场合,可能需要多个事件发生后才能进行下一步操作,比如一些危险机器的启动,需要检查各项指标,当指标不达标时就无法启动。但是检查各个指标时,不会立刻检测完毕,所以需要事件来做统一的等待。当所有的事件都完成了,那么机器才允许启动,这只是事件的应用之一

事件可用于多种场合,能够在一定程度上替代信号量,用于任务与任务间、中断与任务间的同步。一个任务或中断服务例程发送一个事件给事件对象,而后等待的任务被唤醒并对相应的事件进行处理。但是事件与信号量不同的是,事件的发送操作不可累计的,而信号量的释放动作是可累计的。此外,接收任务可等待多种事件,即多个事件对应一个任务或多个任务。同时按照任务等待的参数,可选择是“逻辑或”触发还是“逻辑与”触发。这个特性也是信号量等所不具备的,信号量相当于单一的同步动作,而不能让任务同时等待多个事件的同步。

各个事件可分别发送或一起发送给事件对象,而任务可以等待多个事件,任务仅对感兴趣的事件进行关注。当有它们感兴趣的事件发生并且符合条件时,任务将被唤醒并进行后续的处理动作。

二、事件组API

 注意!!STM32cubeMX不提供此接口,需要自行在代码中创建等一系列的操作

 2.1创建事件组

#include "FreeRTOS.h"
#include "event_groups.h"/*创建一个事件组*/
EventGroupHandle_t xEventGroupCreat(void)return: NULL 创建失败any other value 创建成功返回的事件组句柄matters need attention:None

2.2任务中设置bit

#include "FreeRTOS.h"
#include "event_groups.h"/*任务中 设置事件组的 bit位*/
EventBits_t xEventGroupSetBits(EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet)params:xEventGroup 事件组句柄 uxBitsToSet 24bit可设置的事件组 如 0x08 表示第3位有效 0x09表示第3位和第0位有效return: any value :返回调用此函数后事件组位的值 整个24位的matters need attention:
用户通过参数 uxBitsToSet 设置的标志位并不一定会保留到此函数的返回值中,以下是两种特殊情况:
a. 调用此函数时,遇到一个更高优先级的任务就绪,同时它也修改了事件标志,导致此函数的修改出现问题
b. 修改是成功了,但触发高优先级任务后被函数xEventGroupWaitBits 清除掉了

2.3中断中设置bit

#include "FreeRTOS.h"
#include "event_groups.h"/*中断中 设置事件组的 bit位 操作系统中不允许中断中进行上下文切换,在中断中会向守护任务发送一条消息 由守护任务进行调度*/
BaseType_t xEventGroupSetBitsFromISR(EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSetBaseType_t *pxHigherPriorityTaskWoken)params:xEventGroup 事件组句柄 uxBitsToSet 24bits 可设置的事件组 如 0x08 表示第3位有效 0x09表示第3位和第0位有效pxHigherPriorityTaskWoken NULL即可return: pdPASS 成功pdFAIL 发送消息到守护任务失败matters need attention:
在config.h中把三个宏置1  
#define INCLUDE_xEventGroupSetBitsFromISR 
#define configUSE_TIMERS
#define INCLUDE_xTimerPendFunctionCall(这个就是守护任务,内核自动创建,它收到消息会执行事件的置位操作,同时也为了不在临界段中执行此不确定操作,将临界段改成由调度锁来完成。这样不确定性操作在中断服务程序和临界段中执行的问题就都得到解决了)

守护任务就是针对中断中不允许上下文切换产生的, 并且和软件定时器Timer有关

实际应用中注意:

中断函数执行得越快越好,防止低优先级中断异常得不到响应;

不要在中断中进行消息处理(wait)可以在中断中发送消息通知任务,去任务中进行消息的处理,当然该任务应设置高优先级  

2.4任务中获取事件组整体值

#include "FreeRTOS.h"
#include "event_groups.h"/*任务中 获取24位事件组的值*/
EventBits_t xEventGroupGetBits(EventGroupHandle_t xEventGroup)params:xEventGroup 事件组句柄 return: any value :返回调用此函数后整个24位的事件组的值 matters need attention:None

2.5中断中获取事件组整体值

#include "FreeRTOS.h"
#include "event_groups.h"/*中断中 获取24位事件组的值*/
EventBits_t xEventGroupGetBitsFromISR(EventGroupHandle_t xEventGroup)params:xEventGroup 事件组句柄 return: any value :返回调用此函数后整个24位的事件组的值 matters need attention:None

 方便中断中使用,因为需要向守护任务发送消息

2.6等待bit触发

#include "FreeRTOS.h"
#include "event_groups.h"/*等待事件组位的触发  感兴趣的那一位*/
EventBits_t xEventGroupWaitBits(const EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToWaitForconst BaseType_t xClearOnExit,        const BaseType_t xWaitForAllBitsTickType_t xTicksToWait)params:xEventGroup     事件组句柄uxBitsToWaitFor 要触发等待的位xClearOnExit    触发完毕后是否需要清除标志 pdTRUE/pdFALSE  //方便其他任务使用就选择不清除xWaitForAllBits 逻辑与pdTRUE 逻辑或pdFALSExTicksToWait    阻塞等待时间return: any value :已经触发的事件标志位,可用此做事件标志的判断matters need attention:None

2.7多任务同步(等待bit)

#include "FreeRTOS.h"
#include "event_groups.h"/*用于同步任务集合(就是多个任务) 其中每个任务必须等待其他任务到达同步点才能继续  顺序同步!!!*/
EventBits_t xEventGroupSync(const EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSetconst EventBits_t uxBitsToWaitFor,    TickType_t xTicksToWait)params: uxEventGroup    事件组句柄uxBitsToSet     要设置的标志位uxBitsToWaitFor 要触发等待的位xTicksToWait    阻塞等待时间return: any value :已经触发的事件标志位,可用此做事件标志的判断matters need attention:None

这里的同步指的是顺序同步,即:任务一到达同步点,触发判断任务二是否到达同步点,依次类推,当所有任务都达到同步点  

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

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

相关文章

window11编译pycdc.exe

一、代码库和参考链接 在对python打包的exe文件进行反编译时,会使用到uncompyle6工具,但是这个工具只支持python3.8及以下,针对更高的版本的python则不能反编译。 关于反编译参考几个文章: Python3.9及以上Pyinstaller 反编译教…

【100ask】IMX6ULL开发板用SPI驱动RC522模块

目录 一、问题汇总: 1.无法寻卡 2.寻卡不稳定 二、修改设备树 三、驱动程序 四、测试程序 1.rc522_ap.c 2.rc522_app.h 3.rc522_test.c 4.Makefile 前言: CSDN上大部分对于RC522的文章都是正点的,虽然文章写的挺详细,两…

springboot购物推荐网站的设计与实现(代码+数据库+LW)

摘要 随着信息互联网购物的飞速发展,一般企业都去创建属于自己的电商平台以及购物管理系统。本文介绍了东大每日推购物推荐网站的开发全过程。通过分析企业对于东大每日推购物推荐网站的需求,创建了一个计算机管理东大每日推购物推荐网站的方案。文章介…

小R的二叉树探险 | 模拟

问题描述 在一个神奇的二叉树中,结构非常独特: 每层的节点值赋值方向是交替的,第一层从左到右,第二层从右到左,以此类推,且该二叉树有无穷多层。 小R对这个二叉树充满了好奇,她想知道&#xf…

高精度计算题目合集

高精度计算题目合集 1168:大整数加法 1168:大整数加法 1168:大整数加法 高精度加法原理: a,b,c 都可以用数组表示。这些都是基于c语言的算术运算符形成的运算。 c 3 ( c 1 c 2 ) % 10 c_3(c_1c_2)\%1…

【2024APMCM亚太赛A题】完整参考论文与代码分享

A题 一、问题重述二、问题分析问题一:水下图像分类问题二:退化原因建模问题三:针对单一退化的图像增强方法问题四:复杂场景的综合增强模型问题五:针对性增强与综合增强的比较 三、问题假设退化特征独立性假设物理模型普…

VMware虚拟机(Ubuntu或centOS)共享宿主机网络资源

VMware虚拟机(Ubuntu或centOS)共享宿主机网络资源 由于需要在 Linux 环境下进行一些测试工作,于是决定使用 VMware 虚拟化软件来安装 Ubuntu 24.04 .1操作系统。考虑到测试过程中需要访问 Github ,要使用Docker拉去镜像等外部网络资源,因此产…

C0030.Clion中运行提示Process finished with exit code -1073741515 (0xC0000135)解决办法

1.错误提示 2.解决办法 添加环境变量完成之后,重启Clion软件,然后就可以正常调用由mingw编译的opencv库了。

每日计划-1123

1. 完成 15. 三数之和 class Solution { public:vector<vector<int>> threeSum(vector<int>& nums) {sort(nums.begin(), nums.end());// 待返回的三元组vector<vector<int>> triples;for(int i 0; i < nums.size(); i){// 检测重复的 n…

汇编语言基础

目录 基本套路 头部&#xff1a; 段&#xff1a; 函数&#xff1a; 导入masm32库 输入输出 加法指令 常见数据类型 定义数据类型 数据传达指令&#xff08;mov&#xff09; 加减法 常用伪指令 间接寻址 JMP和LOOP 堆栈操作 定义函数(ret,call) 位运算 jcc(跳…

React (三)

文章目录 项目地址十二、性能优化12.1 使用useMemo避免不必要的计算12.2 使用memo缓存组件,防止过度渲染12.3 useCallBack缓存函数12.4 useCallBack里访问之前的状态(没懂)十三、Styled-Components13.1 安装13.2给普通html元素添加样式13.3 继承和覆盖样式13.4 给react组件添…

MD5算法的学习

MD5_百度百科 MD5信息摘要算法&#xff08;Message-Digest Algorithm&#xff09;,一种被广泛使用的密码散列函数&#xff0c;可以产生出一个128位的&#xff08;16字节&#xff09;的散列值&#xff08;hash value&#xff09;&#xff0c;用于确保信息传输完整一致。MD5由美…

【虚拟机】VMWare的CentOS虚拟机断电或强制关机出现问题

VMware 虚拟机因为笔记本突然断电故障了&#xff0c;开机提示“Entering emergency mode. Exit the shell to continue.”&#xff0c;如下图所示&#xff1a; 解决方法&#xff1a;输入命令&#xff1a; xfs_repair -v -L /dev/dm-0 注&#xff1a;报 no such file or direct…

【论文阅读】WGSR

0. 摘要 0.1. 问题提出 1.超分辨率(SR)是一个不适定逆问题&#xff0c;可行解众多。 2.超分辨率(SR)算法在可行解中寻找一个在保真度和感知质量之间取得平衡的“良好”解。 3.现有的方法重建高频细节时会产生伪影和幻觉&#xff0c;模型区分图像细节与伪影仍是难题。 0.2. …

解决 Android 单元测试 No tests found for given includes:

问题 报错&#xff1a; Execution failed for task :testDebugUnitTest. > No tests found for given includes: 解决方案 1、一开始以为是没有给测试类加public修饰 2、然后替换 Test 注解的包可以解决&#xff0c;将 org.junit.jupiter.api.Test 修改为 org.junit.Tes…

服务机器人三甲坎德拉:用智能化开启售后服务新篇章

随着市场需求快速增长&#xff0c;专注自动驾驶服务机器人研发的坎德拉近年来实现了快速发展&#xff0c;并且通过技术创新与优质服务收获了良好口碑。为了不断提升售后服务质量和客户服务水平&#xff0c;坎德拉与新一代智能客户服务解决方案提供商售后宝共同打造智能化的售后…

3D建筑模型的 LOD 规范

LOD&#xff08;细节层次&#xff09; 是3D城市建模中用于表示建筑模型精细程度的标准化描述不同的LOD适用于不同的应用场景 LOD是3D建模中重要的分级标准&#xff0c;不同层级适合不同精度和用途的需求。 从LOD0到LOD4&#xff0c;细节逐渐丰富&#xff0c;复杂性和精度也逐…

递归------深度优先搜索

深度优先搜索&#xff08;Depth-First Search&#xff0c;简称DFS&#xff09;是一种用于遍历或搜索树或图的算法。它从一个顶点开始&#xff0c;尽可能深地搜索树的分支。深度优先搜索沿着一条路径深入&#xff0c;直到无法继续为止&#xff0c;然后回溯并尝试其他路径。这种搜…

蓝桥杯c++算法学习【5】之枚举与模拟(卡片、回文日期、赢球票、既约分数:::非常典型的比刷例题!!!)

别忘了请点个赞收藏关注支持一下博主喵&#xff01;&#xff01;&#xff01;! ! ! &#xff01;&#xff01;&#xff01; 关注博主&#xff0c;更多蓝桥杯nice题目静待更新:) 枚举与模拟 一、卡片&#xff1a; 【问题描述】 小蓝有很多数字卡片&#xff0c;每张卡片上都…

相机网卡开启巨型帧和关闭节能模式方法

2022 年 8 月 2 日 Tank 阅读次数&#xff08;ip/1年&#xff09;: 26,796 win10为例子 首先在开始菜单搜索&#xff1a;网络连接 对想要设置的网络右键&#xff1a;属性 点 配置 高级里面找到这三个选项&#xff0c;参考下图设置&#xff0c;螃蟹网卡建议关掉所有节能有关的…