首页 > 其他分享 >FreeRTOS 事件标志组

FreeRTOS 事件标志组

时间:2024-05-03 10:56:45浏览次数:14  
标签:标志 函数 FreeRTOS EventBits 事件 xEventGroup 清零

FreeRTOS 事件标志组

使用信号量来完成同步,但是使用信号量来同步的话任务只能与单个的事件或任务进行同步。有时候某个任务可能会需要与多个事件或任务进行同步,此时信号量就无能为力了。
事件位用来表明某个事件是否发生,事件位通常用作事件标志,事件标志组是一组事件标志位的集合, 可以简单的理解事件标志组,就是一个整数。
在这里插入图片描述
在这里插入图片描述

从上图可以看出时间标志组就是一个整数,分别为无符号16和32位整数,事件标志组的数据类型为 EventGroupHandle_t,当 configUSE_16_BIT_TICKS 为 1 的时候事件标志组可以存储 8 个事件位,当 configUSE_16_BIT_TICKS 为 0 的时候事件标志组存储 24个事件位。至于为啥不是全部是事件标志位。

在这里插入图片描述

创建事件标志组的函数:

FreeRTOS 提供了两个用于创建事件标志组的函数,如表 16.2.1 所示:

xEventGroupCreate() 使用动态方法创建事件标志组。
xEventGroupCreateStatic() 使用静态方法创建事件标志组

函数 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: 事件标志组创建失败。
其他值: 创建成功的事件标志组句柄。

函数 xEventGroupCreateStatic()

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

EventGroupHandle_t xEventGroupCreateStatic( StaticEventGroup_t *pxEventGroupBuffer )
参数:
pxEventGroupBuffer: 参数指向一个 StaticEventGroup_t 类型的变量,用来保存事件标志组结
构体。
返回值: 
NULL: 事件标志组创建失败。
其他值: 创建成功的事件标志组句柄。

设置事件标志组中事件位函数

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

xEventGroupClearBits() 将指定的事件位清零,用在任务中。
xEventGroupClearBitsFromISR() 将指定的事件位清零,用在中断服务函数中
xEventGroupSetBits() 将指定的事件位置 1,用在任务中。
xEventGroupSetBitsFromISR() 将指定的事件位置 1,用在中断服务函数中。

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: 事件位清零失败。

函数 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 后的事件组值。

函数 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 失败。

获取事件标志组值

xEventGroupGetBits() 获取当前事件标志组的值(各个事件位的值),用在任务中。
xEventGroupGetBitsFromISR() 获取当前事件标志组的值,用在中断服务函数中。

函数 xEventGroupGetBits()

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

EventBits_t xEventGroupGetBits( EventGroupHandle_t xEventGroup )
参数:
xEventGroup: 要获取的事件标志组的句柄。
返回值: 
任何值:当前事件标志组的值。

函数 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 了。如果函数因为阻塞时间到而返回
的话那么这个返回值就不代表任何的含义。

标签:标志,函数,FreeRTOS,EventBits,事件,xEventGroup,清零
From: https://www.cnblogs.com/bathwind/p/18170999

相关文章

  • 使用joinjs绘制流程图(七)-实战-绘制流程图+节点设置样式+节点添加事件
    效果图原理joinjs中通过svg来绘制流程图,然后我们可以使用localToClientRect这个方法对节点(element)复制,它会在原来的element在svg位置上生成一个html元素,但是这样会造成原来的element节点监听的点击事件无法触发,我们可以使用原生来操作对这个元素(比如样式的设置和事件的监听)代......
  • .net事件(做一个简单的记录)
    描述(做一个简单的记录):    事件(event)的本质是一个委托;(声明一个事件:publiceventTestDelegateeventTest;)  委托(delegate)可以理解为一个符合某种签名的方法类型;比如:TestDelegate委托的返回数据类型为string,参数为int和EventPara,而TestI方法的参数和返回类型和TestDel......
  • 通过MPI_Comm_rank()、MPI_Comm_size()获取进程标志
    认识三个MPI函数:(1)获取当前进程标识函数:intMPI_Comm_rank(MPI_Commcomm,int*rank)(2)获取通信域包含的进程总数函数:intMPI_Comm_size(MPI_Commcomm,int*size)(3)获取本进程的机器名函数:intMPI_Get_processor_name(char*name,int*resultlen)代码示例:/*文件名:hello......
  • 蓝鲸6.1 CMDB 事件推送的开源替代方案
    本文来自腾讯蓝鲸智云社区用户:木讷大叔爱运维背景在蓝鲸社区“社区问答”帖子中发现这么一个需求:究其原因,我在《不是CMDB筑高墙,运维需要一定的开发能力!》一文中已经介绍,在此我再简单重复下:蓝鲸5.1自带“事件推送”功能,当配置信息发生变化的时候,实时通知到关联的系统中;蓝......
  • 常见攻击事件分析--钓鱼邮件
    简介请勿在本机运行恶意文件样本请勿在本机运行恶意文件样本请勿在本机运行恶意文件样本小张的公司最近遭到了钓鱼邮件攻击,多名员工的终端被控制做为跳板攻击了内网系统,请对钓鱼邮件样本和内网被攻陷的系统进行溯源分析,请根据小张备份的数据样本分析请勿在本机运行恶意文件......
  • 流量特征分析-常见攻击事件 tomcat
    简介1、在web服务器上发现的可疑活动,流量分析会显示很多请求,这表明存在恶意的扫描行为,通过分析扫描的行为后提交攻击者IPflag格式:flag{ip},如:flag{127.0.0.1}2、找到攻击者IP后请通过技术手段确定其所在地址flag格式:flag{城市英文小写}3、哪一个端口提供对web服务器管......
  • delphi DBNavigator1 删除前 后 事件
    //擦除原来线procedureTForm1.DBNavigator1BeforeAction(Sender:TObject;Button:TNavigateBtn);beginifbutton=nbDeletethenDBtooLine(clBtnFace,clBtnFace);//擦除原来线end;procedureTForm1.DBNavigator1Click(Sender:TObject;Button:TNaviga......
  • Java:实验四 Java图形界面与事件处理(头歌)
    importjavax.swing.*;importjava.awt.*;importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;importjava.awt.event.ItemEvent;importjava.awt.event.ItemListener;/***CreatedbyIntelliJIDEA.**@Author:*@create:2023/03/2......
  • openGauss 事件触发器
    事件触发器触发器会在指定的ddl事件发生时自动执行函数。目前事件触发器仅在PG兼容模式下可用。语法格式创建事件触发器。CREATEEVENTTRIGGERnameONevent[WHENfilter_variableIN(filter_value[,...])[AND...]]EXECUTEPROCEDUREfunction_na......
  • FreeRTOS串口中断接收数据
    1volatileuint8_tRxBuffer;2voidStartTask04(voidconst*argument)3{4/*USERCODEBEGINStartTask04*/5uint8_tlen;6osEventevt;7HAL_UART_Receive_IT(&huart1,&RxBuffer,1);8__HAL_UART_ENABLE_IT(&huart1,U......