FreeRTOS 事件标志组

news2024/9/23 5:20:00

文章目录

  • 一、事件标志组简介
  • 二、创建事件标志组
    • 1. 函数 xEventGroupCreate()
    • 2. 函数 xEventGroupCreateStatic()
  • 三、设置事件位
    • 1. 函数 xEventGroupClearBits()
    • 2. 函数 xEventGroupClearBitsFromISR()
    • 3. 函数 xEventGroupSetBits()
    • 4. 函数 xEventGroupSetBitsFromISR()
  • 四、获取事件标志组值
    • 1. 函数 xEventGroupGetBits()
    • 2. 函数 xEventGroupGetBitsFromISR()
  • 五、等待指定的事件位


一、事件标志组简介

1. 事件位(事件标志)
事件位用来表明某个事件是否发生,事件位通常用作事件标志,比如下面的几个例子:

● 当收到一条消息并且把这条消息处理掉以后就可以将某个位(标志)置 1,当队列中没有消息需要处理的时候就可以将这个位(标志)置 0。

● 当把队列中的消息通过网络发送输出以后就可以将某个位(标志)置 1,当没有数据需要从网络发送出去的话就将这个位(标志)置 0。
● 现在需要向网络中发送一个心跳信息,将某个位(标志)置 1。现在不需要向网络中发送心跳信息,这个位(标志)置 0。

2. 事件组
一个事件组就是一组的事件位,事件组中的事件位通过位编号来访问,同样,以上面列出的三个例子为例:
● 事件标志组的 bit0 表示队列中的消息是否处理掉。
● 事件标志组的 bit1 表示是否有消息需要从网络中发送出去。
● 事件标志组的 bit2 表示现在是否需要向网络发送心跳信息。

3. 事件标志组和事件位的数据类型
事件标志组的数据类型为 EventGroupHandle_t,当configUSE_16_BIT_TICKS 为 1 的时候事件标志组可以存储 8 个事件位,当 configUSE_16_BIT_TICKS 为 0 的时候事件标志组存储 24个事件位。

事件标志组中的所有事件位都存储在一个无符号的 EventBits_t 类型的变量中,EventBits_t在 event_groups.h 中有如下定义:

typedef TickType_t EventBits_t;

数据类型 TickType_t 在文件 portmacro.h 中有如下定义:

#if( configUSE_16_BIT_TICKS == 1 )
typedef uint16_t TickType_t;
#define portMAX_DELAY ( TickType_t ) 0xffff
#else
typedef uint32_t TickType_t;
#define portMAX_DELAY ( TickType_t ) 0xffffffffUL
#define portTICK_TYPE_IS_ATOMIC 1
#endif

可以看出当 configUSE_16_BIT_TICKS 为 0 的时候 TickType_t 是个 32 位的数据类型,因此 EventBits_t 也是个 32 位的数据类型。EventBits_t 类型的变量可以存储 24 个事件位,另外的那高 8 位有其他用。事件位 0 存放在这个变量的 bit0 上,变量的 bit1 就是事件位 1,以此类推。对于 STM32 来说一个事件标志组最多可以存储 24 个事件位,如下图所示:
在这里插入图片描述

二、创建事件标志组

FreeRTOS 提供了两个用于创建事件标志组的函数,如下表所示:
在这里插入图片描述

1. 函数 xEventGroupCreate()

此函数用于创建一个事件标志组,所需要的内存通过动态内存管理方法分配。由于内部处理的原因,事件标志组可用的 bit 数取决于 configUSE_16_BIT_TICKS , 当configUSE_16_BIT_TICKS1 为 1 的 时 候 事 件 标 志 组 有 8 个 可 用 的 位 (bit0~ bit7) configUSE_16_BIT_TICKS 为 0 的时候事件标志组有 24 个可用的位(bit0~bit23)。EventBits_t 类型的变量用来存储事件标志组中的各个事件位,函数原型如下:

EventGroupHandle_t xEventGroupCreate( void )

参数:
无。

返回值:
NULL: 事件标志组创建失败。
其他值: 创建成功的事件标志组句柄。

2. 函数 xEventGroupCreateStatic()

此函数用于创建一个事件标志组定时器,所需要的内存需要用户自行分配,此函数原型如下:

EventGroupHandle_t xEventGroupCreateStatic( StaticEventGroup_t *pxEventGroupBuffer )

参数:
pxEventGroupBuffer: 参数指向一个 StaticEventGroup_t 类型的变量,用来保存事件标志组结构体。

返回值:
NULL: 事件标志组创建失败。
其他值: 创建成功的事件标志组句柄。

三、设置事件位

FreeRTOS 提供了 4 个函数用来设置事件标志组中事件位(标志),事件位(标志)的设置包括清零和置 1 两种操作,这 4 个函数如下表所示:
在这里插入图片描述

1. 函数 xEventGroupClearBits()

将事件标志组中的指定事件位清零,此函数只能用在任务中,不能用在中断服务函数中!

中断服务函数有其他的 API 函数。函数原型如下:

EventBits_t xEventGroupClearBits( EventGroupHandle_t xEventGroup, 
								  const EventBits_t uxBitsToClear );

参数:
xEventGroup: 要操作的事件标志组的句柄。
uxBitsToClear: 要清零的事件位,比如要清除 bit3 的话就设置为 0X08。可以同时清除多个bit,如设置为 0X09 的话就是同时清除 bit3 和 bit0。

返回值:
任何值: 将指定事件位清零之前的事件组值。

2. 函数 xEventGroupClearBitsFromISR()

此函数为函数 xEventGroupClearBits()的中断级版本,也是将指定的事件位(标志)清零。此函数用在中断服务函数中,此函数原型如下:

BaseType_t xEventGroupClearBitsFromISR( EventGroupHandle_t xEventGroup, 
										const EventBits_t uxBitsToSet );

参数:
xEventGroup: 要操作的事件标志组的句柄。
uxBitsToClear: 要清零的事件位,比如要清除 bit3 的话就设置为 0X08。可以同时清除多个bit,如设置为 0X09 的话就是同时清除 bit3 和 bit0。

返回值:
pdPASS: 事件位清零成功。
pdFALSE: 事件位清零失败。

3. 函数 xEventGroupSetBits()

设置指定的事件位为 1,此函数只能用在任务中,不能用于中断服务函数,此函数原型如下:

EventBits_t xEventGroupSetBits( EventGroupHandle_t xEventGroup, 
								const EventBits_t uxBitsToSet );

参数:
xEventGroup: 要操作的事件标志组的句柄。
uxBitsToClear: 指定要置 1 的事件位,比如要将 bit3 值 1 的话就设置为 0X08。可以同时将多个 bit 置 1,如设置为 0X09 的话就是同时将 bit3 和 bit0 置 1。

返回值:
任何值: 在将指定事件位置 1 后的事件组值。

4. 函数 xEventGroupSetBitsFromISR()

此函数也用于将指定的事件位置 1,此函数是xEventGroupSetBits()的中断版本,用在中断服务函数中,函数原型如下:

BaseType_t xEventGroupSetBitsFromISR( EventGroupHandle_t xEventGroup, 
									  const EventBits_t uxBitsToSet, 
									  BaseType_t * pxHigherPriorityTaskWoken );

参数:
xEventGroup: 要操作的事件标志组的句柄。
uxBitsToClear: 指定要置 1 的事件位,比如要将 bit3 值 1 的话就设置为 0X08。可以同时将多个 bit 置 1,如设置为 0X09 的话就是同时将 bit3 和 bit0 置 1。
pxHigherPriorityTaskWoken: 标记退出此函数以后是否进行任务切换,这个变量的值函数会自动设置的,用户不用进行设置,用户只需要提供一个变量来保存这个值就行了。当此值为 pdTRUE 的时候在退出中断服务函数之前一定要进行一次任务切换。

返回值:
pdPASS: 事件位置 1 成功。
pdFALSE: 事件位置 1 失败。

四、获取事件标志组值

我们可以通过 FreeRTOS 提供的 API 函数来查询事件标准组值,FreeRTOS 一共提供了两个这样的 API 函数,如下表所示:
在这里插入图片描述

1. 函数 xEventGroupGetBits()

此函数用于获取当前事件标志组的值,也就是各个事件位的值。此函数用在任务中,不能用在中断服务函数中。此函数是个宏,真正执行的是函数 xEventGroupClearBits(),函数原型如下:

EventBits_t xEventGroupGetBits( EventGroupHandle_t xEventGroup )

参数:
xEventGroup: 要获取的事件标志组的句柄。

返回值:
任何值: 当前事件标志组的值。

2. 函数 xEventGroupGetBitsFromISR()

获取当前事件标志组的值,此函数是 xEventGroupGetBits()的中断版本,函数原型如下:

EventBits_t xEventGroupGetBitsFromISR( EventGroupHandle_t xEventGroup )

参数:
xEventGroup: 要获取的事件标志组的句柄。

返回值:
任何值: 当前事件标志组的值。

五、等待指定的事件位

某个任务可能需要与多个事件进行同步,那么这个任务就需要等待并判断多个事件位(标志),使用函数xEventGroupWaitBits()可以完成这个功能。调用函数以后如果任务要等待的事件位还没有准备好(置 1 或清零)的话任务就会进入阻塞态,直到阻塞时间到达或者所等待的事件位准备好。函数原型如下:

EventBits_t xEventGroupWaitBits( EventGroupHandle_t xEventGroup,
								 const EventBits_t uxBitsToWaitFor,
								 const BaseType_t xClearOnExit,
								 const BaseType_t xWaitForAllBits,
								 const TickType_t xTicksToWait );

参数:
xEventGroup: 指定要等待的事件标志组。
uxBitsToWaitFord: 指定要等待的事件位,比如要等待bit0和(或)bit2的时候此参数就是0X05,如果要等待 bit0 和(或)bit1 和(或)bit2 的时候此参数就是 0X07,以此类推。
xClearOnExit: 此参数要是为pdTRUE的话,那么在退出此函数之前由参数uxBitsToWaitFor所设置的这些事件位就会清零。如果设置位 pdFALSE 的话这些事件位就不会改变。
xWaitForAllBits: 此参数如果设置为 pdTRUE 的话,当 uxBitsToWaitFor 所设置的这些事件位都置 1,或者指定的阻塞时间到的时候函数 xEventGroupWaitBits()才会返回。当此函数为pdFALSE 的话,只要 uxBitsToWaitFor 所设置的这些事件 位 其 中 的 任 意 一 个 置 1 , 或 者 指 定 的 阻 塞 时 间 到 的 话 函 数xEventGroupWaitBits()就会返回。
xTicksToWait: 设置阻塞时间,单位为节拍数。

返回值:
任何值: 返回当所等待的事件位置 1 以后的事件标志组的值,或者阻塞时间到。根据这个值我们就知道哪些事件位置 1 了。如果函数因为阻塞时间到而返回的话那么这个返回值就不代表任何的含义。

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

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

相关文章

Linux pthread线程操作 和 线程同步与互斥操作

在Linux系统中玩线程,使用pthread,这篇博客记录如何创建线程和使用线程和线程的同步与互斥。 还有一份nginx线程池的代码供大家阅读学习! 目录 一、简介 什么是线程 线程的优点、缺点 线程的应用场合 二、线程的使用 1. 创建线程 - p…

如何评价聚类结果的好坏?

聚类有效性的评价可分为内部指标和外部指标,内部指标是一种无监督的评价方法,它对聚类结果的评价不需要借助样本集的真实标签,仅利用样本集自身 结构信息对聚类结果进行评价;而外部指标是一种有监督的评价方法,它通过对…

简单毛概刷题网页制作 3.0(拖欠近一年版)

原因是大概一年之前学校的毛概期末刷题网站突然崩了,但是一直没有修复。当时眼看着复习时间逐渐被压缩,自己啥也做不了,遂自学前端完成毛概刷题网页一枚。 最早的毛概刷题网站仅仅是 1.0 版本(传送门),功能…

Microsoft office Word 批注相关问题解决

Microsoft office word 批注相关问题解决 目录 Microsoft office word 批注相关问题解决1.增添并显示批注2.批注显示及取消操作3.更改批注者姓名4.将Microsoft office Word文档中已批注的名字以及缩写修改为自己需要的4.1将Microsoft office Word文档中已批注的名字修改为自己需…

STM32开发(十八)STM32F103 片内资源 —— 窗口看门狗 WWDG 详解

文章目录 一、基础知识点二、开发环境三、STM32CubeMX相关配置四、Vscode代码讲解五、结果演示 一、基础知识点 独立看门狗和窗口看门狗的区别: 独立看门狗在系统在待机、停机、睡眠阶段还会起效果,这就会导致在做低功耗的时候,看门狗还是会…

Elasticsearch:定制 Elasticsearch 镜像

在很多时候,我们希望定制我们的 Elasticsearch 镜像,比如,我们需要安装一些额外的插件,或者如果我们想要一个带有同义词文件和自定义配置的 Elasticsearch?或者我们需要一些相应的配置等。我们想在每次的 docker 部署中…

华为实习笔试复盘(1)配送站和客户问题

写在前面 自己玩了很多项目,但是最近准备秋招的过程中,发现自己对于算法和编程语言的基本功夫实在是太欠缺了。 投递了华为的实习岗位,4.26参加机考,一做题就发现了自己很多地方都不会。这里写下笔试后的复盘以警醒自己。 题目 …

服务网关Gateway

前言 API 网关出现的原因是微服务架构的出现,不同的微服务一般会有不同的网络地址,而外部客户端可能需要调用多个服务的接口才能完成一个业务需求,如果让客户端直接与各个微服务通信,会有以下的问题: 破坏了服务无状态…

python毕业设计之django+vue企业员工在线办公OA系统

该系统分用户和管理员。 管理员界面,具有以下功能: (1)添加用户:管理员添加本系统的用户信息。 (2)添加部门信息:管理员添加本系统的部门信息。 (3)添加职位信…

GLM:ChatGLM的基座模型

介绍 ChatGLM-6B:https://github.com/THUDM/ChatGLM-6B ,主要是能够让我们基于单卡自己部署。ChatGLM的基座是GLM: General Language Model Pretraining with Autoregressive Blank Infilling论文中提出的模型。 动机 预训练语言吗模型大体可以分为三…

【MySQL约束】数据管理实用指南

1、数据库约束的认识 数据库约束的概念:数据库的约束是关系型数据库的一个重要的功能,它提供了一种“校验数据”合法性的机制,能够保证数据的“完整性”、“准确性”和“正确性” 数据库的约束: not null:不能存储 nul…

最强Http缓存策略之强缓存和协商缓存的详解与应用实例

HTTP缓存是指浏览器或者代理服务器将已经请求过的资源保存到本地,以便下次请求时能够直接从缓存中获取资源,从而减少网络请求次数,提高网页的加载速度和用户体验。缓存分为强缓存和协商缓存两种模式。 一. 强缓存 强缓存是指浏览器直接从本…

javaweb权限管理简单实现_javaweb管理系统项目

最近在做一个网站类型项目,主要负责后台,ui框架选型为jquery easy ui,项目架构为spring mvc spring jdbc,简单易用好上手!搭建好框架后开始了第一个任务,设计并实现一套简单的权限管理功能。 一套最基本的…

深度学习第J8周:Inception v1算法实战与解析

目录 一、Inception v1 1.简介 2. 算法结构 二、pytorch代码复现1.前期准备 2.代码复现 3.训练运行 3.2指定图片进行预测 三、总结 🍨 本文为[🔗365天深度学习训练营]内部限免文章(版权归 *K同学啊* 所有) 🍖 作…

ChatGPT登陆方法及常见问题

Chatgpt现在推出ChatGPT Plus服务,所以对注册账号限制比较大 Plus账号有什么优势? 我们可以看到官方介绍: 优势1 Available even when demand is high 当访问量大时,依旧可以访问 优势2 Faster response speed 更快的回复速度…

无云服务器,Linux本地快速搭建web网站,并内网穿透发布上线

文章目录 前言1. 本地搭建web站点2. 测试局域网访问3. 公开本地web网站3.1 安装cpolar内网穿透3.2 创建http隧道,指向本地80端口3.3 配置后台服务 4. 配置固定二级子域名5. 测试使用固定二级子域名访问本地web站点 转载自cpolar文章:Linux CentOS本地搭建…

医疗器械的分类与查询

我国根据医疗器械产品安全性对医疗器械进行分类管理。分类目录由国家食品药品监督管理部门依据医疗器械分类规则制定: 第一类是风险程度低,实行常规管理可以保证其安全、有效的医疗器械。如:外科用手术器械(刀、剪、钳、镊、钩&a…

RabbitMQ 工作队列模式 Work Queue Demo

工作队列模式,一个消息只能有一个消费者消费 生产者发送20条消息 消费者有两个 第一个消费 睡一秒取一个 第二个睡2秒取 public class WorkConsumerTest1 {public static void main(String[] args) throws IOException, TimeoutException {//1 创建连接工厂ConnectionFactor…

「华熙生物」发来感谢信,企企通赋能生物科技领域数字化采购建设

近日,华熙生物科技股份有限公司(以下简称“华熙生物”)携手企企通打造的数字化采购管理平台成功上线。为感谢企企通在采购数字化项目上的付出和努力,华熙生物特意发来暖心感谢信。 在感谢信中,华熙生物表示&#xff1a…

【目标检测实验系列】YOLOv5改进实验:结合VariFocal Loss损失函数,减少小目标漏检问题,高效提升模型检测的召回率(超详细改进代码流程)

目录 1. 文章主要内容2. VariFocal Loss损失函数(原理:简单介绍,可自行详细研究)2.1 VariFocal Loss损失函数2.2 博主数据集实验效果 3. 代码详细改进流程(重要)3.1 新建varifocalLoss.py文件3.2 修改hyp.scratch-low.yaml文件3.3…