【嵌入式——FreeRTOS】事件标志组

【嵌入式——FreeRTOS】事件标志组

  • 简介
  • 相关API
  • 代码示例

简介

事件是一种实现任务间通信的机制,主要用于实现多任务间的同步,但是事件通信只能是事件类型的通信,无数据传输。与信号量不同的是,事件可以实现一对多,多对多的同步,即一个任务可以等待多个事件的发生,可以是任意一个事件发生时唤醒任务唤醒任务进行事件处理,也可以是几个事件都发生后才唤醒任务进行事件处理。同样也可以是多个任务同步多个事件。

事件标志位:用一个位来表示事件是否发生。
事件标志组是一组事件标志位的集合,可以简单的理解事件标志组就是一个整数。

事件标志组特点

  1. 它的每一个位表示一个事件(高8位不算)
  2. 每一个位事件的含义,由用户自己决定,如bit0表示按键是否按下
    1. 这些位的值为1,表示事件发生了,值为0,表示事件未发生
  3. 任意任务或中断都可以读写这些位
  4. 可以等待某一位成立,或者等待多位同时成立

一个事件组就包含了一个EventBites_t数据类型的变量
EventBites_t实际上是一个16位或32位无符号的数据类型。
虽然使用了32位无符号的数据类型变量来存储事件标志,但其中的高8位用作存储事件标志组的控制信息,低24位用作存储事件标志,所以说一个事件组最多可以存储24个事件标志。

事件标志组与队列、信号量的区别
队列、信号量:事件发生时只会唤醒一个任务,是消耗型的资源,队列的数据被读走就没了,信号量被获取后就减少了。
事件标志组:事件发生时,会唤醒所有符合条件的任务,可以理解为"广播"的作用,被唤醒的任务有两个选择,可以让事件保留不动,也可以清除事件。

相关API

函数描述
xEventGroupCreate()使用动态方式创建事件标志组
xEventGroupCreateStatic()使用静态方式创建事件标志组
xEventGroupClearBits()清零事件标志位
xEventGroupClearBitsFromISR()在中断中清零事件标志位
xEventGroupSetBits()设置事件标志位
xEventGroupSetBitsFromISR()在中断中设置事件标志位
xEventGroupWaitBits()等待事件标志位
xEventGroupSync()设置事件标志位,并等待事件标志位
//返回值 NULL 事件标志组创建失败,其他值 创建成功,返回句柄
EventGroupHandle_t xEventGroupCreate( void )EventGroupHandle_t xEventGroupCreateStatic( StaticEventGroup_t * pxEventGroupBuffer )//xEventGroup 待操作的事件标志组句柄 uxBitsToClear 待清零的事件标志位
//返回值 整数 清零事件标志位之前事件标志组中事件标志位的值
EventBits_t xEventGroupClearBits( EventGroupHandle_t xEventGroup,const EventBits_t uxBitsToClear )BaseType_t xEventGroupClearBitsFromISR( EventGroupHandle_t xEventGroup,const EventBits_t uxBitsToClear )//xEventGroup 待操作的事件标志组句柄 uxBitsToSet 待设置的事件标志位
//返回值 整数,事件组中的事件标志位
EventBits_t xEventGroupSetBits( EventGroupHandle_t xEventGroup,const EventBits_t uxBitsToSet )BaseType_t xEventGroupSetBitsFromISR( EventGroupHandle_t xEventGroup,const EventBits_t uxBitsToSet,BaseType_t * pxHigherPriorityTaskWoken )//xEventGroup 等待的事件标志组句柄 
//uxBitsToWaitFor 等待的事件标志位,可以用逻辑或等待多个事件标志位
//xClearOnExit 成功等待到事件标志位后,清除事件组中对应的事件标志位 pdTRUE 清除uxBitsToWaitFor指定位,pdFALSE不清除
//xWaitForAllBits 等待uxBitsToWaitFor 中的所有事件标志位(逻辑与) pdTRUE等待的位全部为1,pdFALSE等待的位某个为1
//xTicksToWait 等待的阻塞时间
//返回值 等待的事件标志位值(等待事件标志位成功,返回等待到的事件标志位)
//其他值,等待的事件表示为失败,返回事件组中的事件标志位。
EventBits_t xEventGroupWaitBits( EventGroupHandle_t xEventGroup,const EventBits_t uxBitsToWaitFor,const BaseType_t xClearOnExit,const BaseType_t xWaitForAllBits,TickType_t xTicksToWait )
//xEventGroup 等待事件标志所在事件组
//uxBitsToSet 达到同步点后,要设置的事件标志
//uxBitsToWaitFor 等待的事件标志
//xTicksToWait 等待的阻塞时间
//返回值 等待的事件标志位,等待事件标志位成功,返回等待到的事件标志位
//其他值 等待事件标志位失败,返回事件组中的事件标志位
EventBits_t xEventGroupSync( EventGroupHandle_t xEventGroup,const EventBits_t uxBitsToSet,const EventBits_t uxBitsToWaitFor,TickType_t xTicksToWait )

代码示例

#define EVENTBIT_0 (1<<0)
#define EVENTBIT_1 (1<<1)EventGroupHandle_t eventgroup_handle;
void init(){eventgroup_handle = xEventGroupCreate();
}void task1(){uint8_t key = 0;while(1){key = key_scan();if(key == KEY0_PRES){xEventGroupSetBits(eventgroup_handle,EVENTBIT_0);}else if(key == KEY1_PRES){xEventGroupSetBits(eventgroup_handle,EVENTBIT_1);}}
}void task2(){EventBits_t event_bit = 0;while(1){event_bit  = xEventGroupWaitBits(eventgroup_handle,EVENTBIT_0 | EVENTBIT_1 ,pdTRUE,pdTRUE,portMax_DELAY);printf("event_bit = %x",event_bit);}
}

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

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

相关文章

Citrix替换:不只是功能拉齐,更是性能体验的超越

用户在选择Citrix替换方案时&#xff0c;除了关注架构和功能的全面性&#xff0c;也期待着国产桌面办公方案带来的惊喜。 深信服桌面云不仅在基础能力和功能上做到了全面对标Citrix&#xff0c;还在用户极为重视的安全、可靠性、智能监控与排障、信创生态等方面做到了全面超越…

如何用SRM管理供应商,轻松又高效?

在企业运营的日常里&#xff0c;你是否常常为那些繁杂的供应商信息而头疼&#xff1f;每当项目紧急需要某个物料时&#xff0c;你是否会为了寻找可靠的供应商而焦头烂额&#xff1f;更别提那些层出不穷的交货延期、质量问题&#xff0c;以及难以追踪的合同条款了。这些问题&…

基于AGX ORIN与FPGA K7实现PCIE高速数据通信/Orin与FPGA高速数据传输/XDMA在linux系统使用教程

因最近想学习AGX orin和FPGA实现数据高速通信&#xff0c;借此机会和大家一起学习AGX orin和FPGA 制作不易&#xff0c;记得三连哦&#xff0c;给我动力&#xff0c;持续更新&#xff01;&#xff01;&#xff01; 完整工程文件下载&#xff1a;AGX orin与FPGA实现PCIE完整…

【深度学习】图形模型基础(5):线性回归模型第一部分:认识线性回归模型

1. 回归模型定义 最简单的回归模型是具有单一预测变量的线性模型&#xff0c;其基本形式如下&#xff1a; y a b x ϵ y a bx \epsilon yabxϵ 其中&#xff0c; a a a 和 b b b 被称为模型的系数或更一般地&#xff0c;模型的参数。 ϵ \epsilon ϵ 代表误差项&#…

如何使用 AI 提高程序猿的工作效率

我们程序猿其实是距离AI最近的一批人 也是别人眼中最有可能被AI代替的人 但是光恐惧或者排斥是没用的 有一句话说得好&#xff1a; 与其想办法跑的AI跑的快 不如考一张AI驾照 - 鲁迅 下面就分享3个我在日常工作中 使用的AI来提高效率的场景 1.使用AI来辅助编码&#xff0c;…

通证经济重塑经济格局

在数字化转型的全球浪潮中&#xff0c;通证经济模式犹如一股新兴力量&#xff0c;以其独特的价值传递与共享机制&#xff0c;重塑着经济格局&#xff0c;引领我们步入数字经济的新纪元。 通证&#xff0c;作为这一模式的核心&#xff0c;不仅是权利与权益的数字化凭证&#xf…

C语言 | Leetcode C语言题解之第213题打家劫舍II

题目&#xff1a; 题解&#xff1a; int robRange(int* nums, int start, int end) {int first nums[start], second fmax(nums[start], nums[start 1]);for (int i start 2; i < end; i) {int temp second;second fmax(first nums[i], second);first temp;}retur…

需求分析分类和层级、分析步骤

需求分析是软件工程和系统开发中至关重要的阶段&#xff0c;它帮助确立和理解系统或软件的需求&#xff0c;为后续的设计和开发工作奠定基础。以下是需求分析的分类、层级和分析步骤的详细讨论&#xff1a; 需求分析的分类和层级 功能需求和非功能需求&#xff1a; 功能需求&…

今天的一次有效沟通,人必须学会和他人、社会好好相处

今天遇到的沟通情景分享&#xff0c;文字有点长&#xff1a; 今天我发现自己实践了一次还ok的沟通&#xff0c;做到了&#xff1a;先聆听自己&#xff0c;然后表达尊重、倾听、不评判、认同朋友我也认同的部分、表达用词时尽量客观和让对方看到她自己想表达的目的&#xff0c;…

MySQL数据库碎片化:隐患与解决策略

为什么我们经常说不建议使用简单的 UUID 做 ID&#xff0c;当唯一索引&#xff0c;其实很大原因就是因为不规则的 UUID 会导致存储碎片&#xff0c;接下来聊一聊 MySQL 为什么会有存储碎片&#xff0c;影响大不大。关于 UUID 做主键还是自增主键&#xff0c;可参考往期文章&…

coco dataset标签数据结构(json文件)

COCO数据集现在有3种标注类型&#xff1a;object instances&#xff08;目标实例&#xff09;, object keypoints&#xff08;目标上的关键点&#xff09;, 和image captions&#xff08;看图说话&#xff09;&#xff0c;使用json文件存储。 NameImagesLabelstrain linkhttp:…

Golang基础问题

Go基础 文章目录 Go基础● Go有那些关键字&#xff1f;● Go方法与函数的区别&#xff1f;● Go函数返回局部变量的指针是否安全&#xff1f;● Go函数参数传递是值传递还是引用传递&#xff1f;● defer关键字的实现原理&#xff1f;● 内置函数make和new的区别&#xff1f;●…

Yarn的安装方法

Yarn是由Facebook开发的一款快速、可靠、安全的JavaScript包管理工具&#xff0c;它是npm的替代品&#xff0c;提供了更快速的安装速度和更稳定的依赖版本管理。Yarn的安装与配置主要包括以下几个步骤&#xff1a; 一、安装Yarn Yarn的安装方法多种多样&#xff0c;以下是几种…

SVM的代码实现

生成假数据集&#xff1a;创建一个简单的二分类数据集。数据标准化&#xff1a;标准化特征。定义线性核函数&#xff1a;选择一个简单的线性核。定义优化问题&#xff1a;使用对偶问题进行求解。求解对偶问题&#xff1a;通过简单的梯度上升法求解对偶问题。确定支持向量&#…

kotlin协程的理解

伴生对象&#xff1a;companion object 其实质等同于Java中的单例模式 协程&#xff1a;通常实现是用户态的任务协作式调度 一段可执行代码可挂起/可恢复执行概念上与语言无关&#xff0c;协程这个概念于1958年提出 依赖框架&#xff1a; 协程的启动&#xff1a; 1.协程体&a…

大模型LLMs概述:利用大模型 (LLMs) 解决信息抽取任务

论文标题&#xff1a;Large Language Models for Generative Information Extraction: A Survey 论文链接&#xff1a;https://arxiv.org/pdf/2312.17617.pdf 论文主要探讨了大型语言模型&#xff08;LLMs&#xff09;在生成式信息抽取&#xff08;IE&#xff09;任务中的应用…

属性描述符初探——Vue实现数据劫持的基础

目录 属性描述符——Vue实现数据劫持的基础 一、属性描述符是什么&#xff1f; ​编辑 1.1、属性描述符示例 1.2、用属性描述符定义属性及获取对象的属性描述符 1.3、带有读取器和设置器的属性描述符 二、使用属性描述符的情景 2.1、封装和数据隐藏 使用getter和setter…

Desktop docker 部署 WordPress

Desktop Docker 部署 WordPress 之前都是在Linux里面玩的,今天看到别人在windwos下安装docker,一时兴起装了一个试试,效果一般,很吃硬盘空间和内存。 首先在docker官方下载桌面版,安装下一步一直到完成。 安装完docker会自动加入到环境变量,而且docker-compose也会一并安…

sql业务场景分析思路参考

1、时间可以进行排序&#xff0c;也可以用聚合函数对时间求最大值max&#xff08;时间&#xff09; 例如下面的例子&#xff1a;取最晚入职的人&#xff0c;那就是将入职时间倒序排序&#xff0c;然后limit 1 表&#xff1a; 场景&#xff1a;查找最晚入职员工的所有信息 se…