当前位置: 首页 > news >正文

【STM32 FreeRTOS】事件标志组

事件标志组简介

事件标志组:用一个比特位来表示事件是否发生

事件标志组是一组事件标志位的集合,可以简单理解为事件标志组就是一个整数。

事件标志组的特点:

  • 它的每一位表示一个事件(高八位不算)
  • 每一位事件的含义,幼用户自己决定,这些位的值为1是表示事件发生了。
  • 任意任务或中断都可以读到这些位
  • 可以等待某一位成立,或者等待多位同时成立
  • configUSE_16_BIT_TICKS宏:如果该宏为1,则每个事件组包含8个可用的事件位;如果为0,则包含24个可用的事件位97。

事件标志组API函数

/*** @brief  动态分配内存创建事件组函数* @retval 返回成功创建的事件组的句柄,返回NULL表示因内存空间不足创建失败*/
EventGroupHandle_t xEventGroupCreate(void);
/*** @brief  将事件组某些位置位* @param  xEventGroup:要设置位的事件组* @param  uxBitsToSet:指定要在事件组中设置的一个或多个位的按位值,例如设置为0x09表示置位3 和位0* @retval 调用 xEventGroupSetBits()返回时事件组的值*/
EventBits_t xEventGroupSetBits(EventGroupHandle_t xEventGroup,const EventBits_t uxBitsToSet);/*** @brief  将事件组某些位清零* @param  xEventGroup:要在其中清除位的事件组* @param  uxBitsToSet:表示要在事件组中清除一个或多个位的按位值* @retval 返回清除指定位之前的事件组的值*/
EventBits_t xEventGroupClearBits(EventGroupHandle_t xEventGroup,const EventBits_t uxBitsToClear);/*** @brief  上述两个函数的中断安全版本* @param  pxHigherPriorityTaskWoken:用于通知应用程序编写者是否应该执行上下文切换* @retval 消息已发送到RTOS守护进程任务,则返回pdPASS,否则将返回pdFAIL*/
BaseType_t xEventGroupSetBitsFromISR(EventGroupHandle_t xEventGroup,const EventBits_t uxBitsToSet,BaseType_t *pxHigherPriorityTaskWoken);BaseType_t xEventGroupClearBitsFromISR(EventGroupHandle_t xEventGroup,const EventBits_t uxBitsToClear);/*example1: 将事件组 EventGroup_Test 的位 1 和 3 置位*/
EventBits_t return_value;
return_value = xEventGroupSetBits(EventGroup_Test, 0x0A);/*example2: 将事件组 EventGroup_Test 的位 0 和 2 清零*/
EventBits_t return_value;
return_value = xEventGroupClearBits(EventGroup_Test, 0x05);
/*** @brief  读取事件组的当前值* @param  xEventGroup:正在查询的事件组* @retval 返回事件组当前的值*/
EventBits_t xEventGroupGetBits(EventGroupHandle_t xEventGroup);/*** @brief  上述函数的中断安全版本*/
EventBits_t xEventGroupGetBitsFromISR(EventGroupHandle_t xEventGroup);
/*** @brief  等待事件组中多个事件位表示的事件成立* @param  xEventGroup:所操作事件组的句柄* @param  uxBitsToWaitFor:所等待事件位的掩码,例如设置为0x05表示等待第0位和/或第2位* @param  xClearOnExit:pdTRUE表示事件组条件成立退出阻塞状态时将掩码指定的所有位清零;pdFALSE表示事件组条件成立退出阻塞状态时不将掩码指定的所有位清零* @param  xWaitForAllBits:pdTRUE表示等待掩码中所有事件位都置1,条件才算成立(逻辑与);pdFALSE表示等待掩码中所有事件位中一个置1,条件就成立(逻辑或)* @param  xTicksToWait:任务进入阻塞状态等待时间成立的超时节拍数* @retval 返回事件位等待完成设置或阻塞时间过期时的事件组值*/
EventBits_t xEventGroupWaitBits(const EventGroupHandle_t xEventGroup,const EventBits_t uxBitsToWaitFor,const BaseType_t xClearOnExit,const BaseType_t xWaitForAllBits,TickType_t xTicksToWait); 

事件标志组API实验

void MyEventGroupSetFromISR(uint32_t event_bit)
{//参数event_bit=0 表示发生事件bit0//参数event_bit=1 表示发生事件bit1//参数event_bit=2 表示发生事件bit2//......printf("MyEventGroupSetFromISR Event Bit%d\r\n",event_bit);BaseType_t xHigherPriorityTaskWoken = pdFALSE;//在中断中调用xEventGroupSetBitsFromISR(myEventGroup,1<<event_bit,&xHigherPriorityTaskWoken);portYIELD_FROM_ISR( xHigherPriorityTaskWoken );
}#define EVENT_BIT0  (1<<0)
#define EVENT_BIT1  (1<<1)
#define EVENT_BIT2  (1<<2)
#define EVENT_BIT3  (1<<3)void StartMyTask1(void *argument)
{printf("StartMyTask1\r\n");uint32_t event_bits = 0;for(;;){event_bits= xEventGroupWaitBits(myEventGroup,EVENT_BIT0|EVENT_BIT1|EVENT_BIT2|EVENT_BIT3,pdTRUE,pdFALSE,portMAX_DELAY);printf("event_bits=%d\r\n",event_bits);if((event_bits & EVENT_BIT0) != 0){printf("EVENT_BIT0... \r\n");}else if((event_bits & EVENT_BIT1) != 0){printf("EVENT_BIT1... \r\n");}else if((event_bits & EVENT_BIT2) != 0){printf("EVENT_BIT2... \r\n");}vTaskDelay(pdMS_TO_TICKS(500));//500ms}
}
MyEventGroupSetFromISR Event Bit0
event_bits=1
EVENT_BIT0... 
MyEventGroupSetFromISR Event Bit1
event_bits=2
EVENT_BIT1... 
MyEventGroupSetFromISR Event Bit2
event_bits=4
EVENT_BIT2... 
MyEventGroupSetFromISR Event Bit3
event_bits=8
MyEventGroupSetFromISR Event Bit2
event_bits=4
EVENT_BIT2... 
MyEventGroupSetFromISR Event Bit1
event_bits=2
EVENT_BIT1... 
MyEventGroupSetFromISR Event Bit0
event_bits=1
EVENT_BIT0... 

上述实验中是某一比特的事件发生后都会解除阻塞。如果我们改为如下

		  event_bits= xEventGroupWaitBits(myEventGroup,EVENT_BIT0|EVENT_BIT1|EVENT_BIT2|EVENT_BIT3,pdTRUE,pdTRUE,portMAX_DELAY);

则表示,所有比特位事件都发生后才会解除阻塞。

MyEventGroupSetFromISR Event Bit0
MyEventGroupSetFromISR Event Bit1
MyEventGroupSetFromISR Event Bit2
MyEventGroupSetFromISR Event Bit3
event_bits=15

相关文章:

【STM32 FreeRTOS】事件标志组

事件标志组简介 事件标志组&#xff1a;用一个比特位来表示事件是否发生 事件标志组是一组事件标志位的集合&#xff0c;可以简单理解为事件标志组就是一个整数。 事件标志组的特点&#xff1a; 它的每一位表示一个事件&#xff08;高八位不算&#xff09;每一位事件的含义…...

【启动centos报错】另一个程序已锁定文件的一部分,进程无法访问,打不开磁盘.

启动centos报错 另一个程序已锁定文件的一部分&#xff0c;进程无法访问打不开磁盘“D:\Program2\CentOS\CentOS7\CentOS7.vmdk”或它所依赖的某个快照磁盘。模块“Disk”启动失败。未能启动虚拟机。解决方法 删除.lck文件...

基于YOLOv8-pose的手部关键点检测(3)- 实现实时手部关键点检测

目录 前言 1.扩大检测框区域 2.先检测手部&#xff0c;后检测手部关键点 3.正面视角检测 4.侧面视角检测 5.摄像头视角检测 6.遮挡视角检测 7.结论 前言 使用YOLOv8-m对图像进行手部检测&#xff0c;然后扩大检测框区域&#xff0c;并对该区域使用YOLOv8-s-pose使用关键…...

kylin系统永久关闭iptables

1 关闭iptables, 并且相关规则写入文件firewall.rules sudo iptables-save > /root/firewall.rules iptables -X iptables -t nat -F iptables -t nat -X iptables -t mangle -F iptables -t mangle -X iptables -P INPUT ACCEPT iptables -P FORWARD ACCEPT iptables -P …...

写一个githubDemo

1.List组件 <template><div class"container"><!-- 展示用户列表 --><div class"row"><divv-show"info.users.length"v-for"(item, index) in info.users":key"item.id"><div class"…...

java入门-成员内部类和静态内部类的访问

&#xff08;一&#xff09;成员内部类 package InnerClass;import javax.print.attribute.standard.MediaSize;public class Outer {//2外部类中的成员private int age99;public static String a;public class Inner{//普通的成员内部类//1.1成员变量public String name;priva…...

ansible【自动化配置】(thirty day)

回顾 1、mysql和python &#xff08;1&#xff09;不需要执行mysql_ssl_rsa_setup &#xff08;2&#xff09;Change_master_to.不需要get public key 2、可以使用pymysql非交互的管理mysql &#xff08;1&#xff09;connpymysql.connect(host,user,password,database,prot) …...

GitOps Tekton+ArgoCD

GitOps 提供了一种基于 Git 的操作理念&#xff0c;而 Tekton 和 ArgoCD 分别作为 CI/CD 工具&#xff0c;共同实现了这一理念在 Kubernetes 集群中的应用 k8s只是jenkins 流水线中的一环&#xff0c;但是在tekton中&#xff0c;k8s是基础设施 工作流程&#xff1a; 代码提交…...

uniapp用户列表页面渲染、增删改查逻辑

<template><view class="container">...

力扣高频SQL 50题(基础版)第四十七题之1321.餐馆营业额变化增长

力扣高频SQL 50题&#xff08;基础版&#xff09;第四十七题 1321.餐馆营业额变化增长 题目说明 表: Customer ---------------------- | Column Name | Type | ---------------------- | customer_id | int | | name | varchar | | visited_on | date | | amount | …...

django中的MESSAGE组件

文章目录 message组件1 使用配置2 设置值3 读取值4 源码分析 message组件 1 使用配置 INSTALLED_APPS [# django.contrib.admin,# django.contrib.auth,# django.contrib.contenttypes,# django.contrib.sessions,django.contrib.messages,django.contrib.staticfiles,"…...

【JavaSE】解读Java中的toString方法

前言&#xff1a; 在Java中&#xff0c;toString方法来自java.lang.Object 类&#xff0c;然后所有对象都继承该Object 类。默认情况下&#xff0c;它的作用是返回对象的字符串表示形式。在实际开发中&#xff0c;重写 toString() 方法可以帮助我们以更易读的形式输出对象信息&…...

软件工程的核心原则:KISS, DRY, SOLID, YAGNI

软件工程的核心原则&#xff1a;KISS, DRY, SOLID, YAGNI — 深入解析与实践指南 引言 在软件开发的广阔领域中&#xff0c;原则和实践是构建高质量、可维护系统的基石。本文将深入探讨四个核心原则&#xff1a;KISS&#xff08;保持简单&#xff0c;愚蠢&#xff09;、DRY&a…...

Android 高通7.1系开机动画自动跟随系统方向旋转

本篇博客是记录自己解决开机动画与系统方向不一致方案代码&#xff0c;思路&#xff1a;在系统参数根目录自定义persist.sys.hwrotationxrd0来作为动画方向&#xff0c;当修改系统方向时同时修改这个参数&#xff0c;当系统启动加载动画时在根据这个来旋转动画方式以保证动画方…...

Sentinel入门与进阶:微服务流量控制的最佳实践 ( 三 )

5.配置持久化 目前的sentinel&#xff0c;无法满足我们生产环境的需求&#xff0c;因为一旦sentinel-dashboard发生重启&#xff0c;限流规则也会随之丢失。 sentinel规则的持久化: Sentinel自身就支持了多种不同的数据源来持久化规则配置&#xff0c;比如文件配置&#xff0…...

2021年上半年网络工程师考试上午真题

2021年上半年网络工程师考试上午真题 网络工程师历年真题含答案与解析 第 1 题 以下关于RISC和CISC计算机的叙述中&#xff0c;正确的是&#xff08; &#xff09;。 (A) RISC不采用流水线技术&#xff0c;CISC采用流水线技术(B) RISC使用复杂的指令&#xff0c;CISC使用简…...

SQL触发器的级联魔力:数据完整性的守护者

标题&#xff1a;SQL触发器的级联魔力&#xff1a;数据完整性的守护者 在SQL的丰富世界中&#xff0c;触发器&#xff08;Trigger&#xff09;是一种特殊的存储过程&#xff0c;它能够自动执行响应数据库中的数据修改事件。而级联操作&#xff08;Cascade&#xff09;则是触发…...

ARCGIS PRO 要素标注背景色透明度的设置

使用ArcGIS Pro 设置标注背景色的透明度 一、点击标注属性 二、点击符号、注释 三、下拉框选择背景 四、背景符号 五、点击颜色 六、编辑颜色 七、应用...

探讨MySQL中 “约束“ 下的查询

目录&#xff1a; 一. 数据库约束 二. 表的设计 三. 聚合查询 四.联合查询 一. 数据库约束&#xff1a; 1.约束类型汇总&#xff1a; 约束类型 说明 NULL约束使用NOT NULL指定列不为 空UNIQUE唯一约束指定列为唯一的、不重复的DEFAULT默认值约 …...

Nuxt3【布局】layouts 详解

Nuxt 内置布局框架&#xff0c;用法如下&#xff1a; 修改 app.vue <template><NuxtLayout><NuxtPage /></NuxtLayout> </template>NuxtLayout 为 Nuxt 的内置组件&#xff0c;默认加载 layouts/default.vue &#xff0c;若页面中指定了布局&…...

5分钟搞定fastANI安装与基因组比对:从conda安装到结果解读全流程

5分钟搞定fastANI安装与基因组比对&#xff1a;从conda安装到结果解读全流程 第一次接触基因组比对时&#xff0c;我被各种复杂的参数和晦涩的结果文件搞得晕头转向。直到发现了fastANI这个神器——它不仅能快速计算基因组间的平均核苷酸相似性&#xff08;ANI&#xff09;&am…...

DML实战:价格弹性预测的经济学与机器学习融合之道

1. 价格弹性预测&#xff1a;经济学与机器学习的碰撞 第一次听说价格弹性还能用机器学习预测时&#xff0c;我的反应和大多数经济学背景的同事一样&#xff1a;"这不就是个回归问题吗&#xff1f;"直到亲眼看到某电商平台用DML模型把促销预算节省了23%&#xff0c;才…...

Logisim音乐盒背后的数字电路:计数器、ROM与蜂鸣器如何奏出《终生误》

Logisim音乐盒背后的数字电路&#xff1a;计数器、ROM与蜂鸣器如何奏出《终生误》 当一段熟悉的旋律从蜂鸣器中流淌而出&#xff0c;很少有人会思考这背后隐藏的数字魔法。本文将带您拆解一个基于Logisim的音乐盒设计&#xff0c;揭示计数器如何像指挥家一样协调时序、ROM怎样扮…...

SGMICRO圣邦微 SGM6512YTS28G/TR TDFN-8L(2x2) 模拟开关/多路复用器

特性 典型导通电阻240120开路电阻平坦度3.3V至6V双电源供电操作3.3V至13.2V单电源工作电压-3dB带宽:70MHz轨到轨操作提供绿色TQFN-5x5-32L和TSSOP-28封装 工作温度范围:-40C至85C...

从零上手Neo4j Desktop:CSV数据导入与核心Cypher操作指南

1. Neo4j Desktop环境准备与数据导入 第一次打开Neo4j Desktop时可能会被它的界面搞得有点懵&#xff0c;别担心&#xff0c;我刚开始用的时候也这样。这个工具把数据库管理、浏览器界面和插件都集成在了一起&#xff0c;特别适合新手快速上手。安装过程我就不赘述了&#xff0…...

效率飙升:用快马平台一键生成项目模板,告别重复的vscode环境配置

作为一个经常需要在新设备上配置开发环境的前端开发者&#xff0c;我深刻体会到重复搭建项目的痛苦。每次换电脑或者开新项目&#xff0c;都要从头安装VSCode插件、配置构建工具、集成UI库……这些琐碎工作至少会浪费半小时。最近发现InsCode(快马)平台能完美解决这个问题&…...

Obsidian Full Calendar:5步构建个人知识与时间管理一体化系统

Obsidian Full Calendar&#xff1a;5步构建个人知识与时间管理一体化系统 【免费下载链接】obsidian-full-calendar Keep events and manage your calendar alongside all your other notes in your Obsidian Vault. 项目地址: https://gitcode.com/gh_mirrors/obs/obsidian…...

Python 装饰器实战:用@syntax 优雅地增强函数功能

# Python 装饰器实战&#xff1a;用syntax 优雅地增强函数功能## 什么是装饰器&#xff1f;装饰器&#xff08;Decorator&#xff09;是 Python 中的一种高级特性&#xff0c;它允许你在不修改原函数代码的情况下&#xff0c;动态地给函数添加功能。简单来说&#xff0c;装饰器…...

开源解决方案:企业零代码条码生成的降本实践指南

开源解决方案&#xff1a;企业零代码条码生成的降本实践指南 【免费下载链接】librebarcode Libre Barcode: barcode fonts for various barcode standards. 项目地址: https://gitcode.com/gh_mirrors/li/librebarcode 一、条码管理的隐性成本陷阱&#xff1a;中小企业…...

避开这些坑!高德DragRoute插件获取路线坐标的5个常见问题解决方案

高德地图DragRoute插件实战&#xff1a;路线坐标获取的深度避坑指南 当开发者需要在地图上绘制复杂路线时&#xff0c;高德地图的DragRoute插件无疑是个强大工具。但在实际项目中&#xff0c;从简单的A到B路径绘制&#xff0c;到包含多个途经点的复杂路线坐标获取&#xff0c;开…...