当前位置: 首页 > 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;若页面中指定了布局&…...

51c自动驾驶~合集58

我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留&#xff0c;CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制&#xff08;CCA-Attention&#xff09;&#xff0c;…...

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...

k8s从入门到放弃之Ingress七层负载

k8s从入门到放弃之Ingress七层负载 在Kubernetes&#xff08;简称K8s&#xff09;中&#xff0c;Ingress是一个API对象&#xff0c;它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress&#xff0c;你可…...

遍历 Map 类型集合的方法汇总

1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...

STM32+rt-thread判断是否联网

一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...

pam_env.so模块配置解析

在PAM&#xff08;Pluggable Authentication Modules&#xff09;配置中&#xff0c; /etc/pam.d/su 文件相关配置含义如下&#xff1a; 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块&#xff0c;负责验证用户身份&am…...

[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...

【决胜公务员考试】求职OMG——见面课测验1

2025最新版&#xff01;&#xff01;&#xff01;6.8截至答题&#xff0c;大家注意呀&#xff01; 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:&#xff08; B &#xff09; A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...

【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)

要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况&#xff0c;可以通过以下几种方式模拟或触发&#xff1a; 1. 增加CPU负载 运行大量计算密集型任务&#xff0c;例如&#xff1a; 使用多线程循环执行复杂计算&#xff08;如数学运算、加密解密等&#xff09;。运行图…...

Xen Server服务器释放磁盘空间

disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...