【FreeRTOS(十二)】事件标志组

news2024/12/24 9:25:46

文章目录

  • 事件标志组
    • 创建事件标志组 xEventGroupCreate
    • 将指定的事件位清零 xEventGroupClearBits
    • 将指定的事件位置 1 xEventGroupSetBits
    • 获取事件标志组值 xEventGroupGetBits
    • 等待指定的事件位 xEventGroupWaitBits
    • 代码示例

事件标志组

事件标志位

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

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

事件组

一个事件组就是一组的事件位,事件组中的事件位通过位编号来访问,同样,以上面列出的三个例子为例:

  • 事件标志组的 bit0 表示队列中的消息是否处理掉。
  • 事件标志组的 bit1 表示是否有消息需要从网络中发送出去。
  • 事件标志组的 bit2 表示现在是否需要向网络发送心跳信息。

事件标志组的数据类型为 EventGroupHandle_t,当 configUSE_16_BIT_TICKS 为 1 的时候事件标志组可以存储 8 个事件位,当 configUSE_16_BIT_TICKS 为 0 的时候事件标志组存储 24个事件位。
在这里插入图片描述


创建事件标志组 xEventGroupCreate

创建一个事件标志组

EventGroupHandle_t xEventGroupCreate( void )

参数:
	无

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

将指定的事件位清零 xEventGroupClearBits

将事件标志组中的指定事件位清零

EventBits_t xEventGroupClearBits( EventGroupHandle_t xEventGroup, 
								  const EventBits_t uxBitsToClear );

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

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

将指定的事件位置 1 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 后的事件组值。

获取事件标志组值 xEventGroupGetBits

获取当前事件标志组的值,也就是各个事件位的值。

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

代码示例

#include <stdio.h>
#include "sdkconfig.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_system.h"
#include "esp_spi_flash.h"
#include "freertos/event_groups.h"

#define BIT_0 ( 1 << 0 )
#define BIT_4 ( 1 << 4 )

/* Declare a variable to hold the created event group. */
EventGroupHandle_t xCreatedEventGroup;

void Task1(void *pvParam)
{
    while(1)
    {
        printf("----------------!\n");
        printf("task1 begin to wait!\n");

        /* Wait a maximum of 100ms for either bit 0 or bit 4 to be set within the event group. Clear the bits before exiting. */
        xEventGroupWaitBits(xCreatedEventGroup,         /* The event group being tested. */
                                    BIT_0 | BIT_4,      /* The bits within the event group to wait for. */
                                    pdTRUE,             /* BIT_0 and BIT_4 should be cleared before returning. */
                                    pdFALSE,            /* Don't wait for both bits, either bit will do. */
                                    portMAX_DELAY );    /* Wait a maximum of 100ms for either bit to be set. */

        printf("----------------!\n");
        printf("in task1, BIT_0 or BIT_4 is set!\n");

        vTaskDelay(pdMS_TO_TICKS(1000));
    }
}

void Task2(void *pvParam)
{
    vTaskDelay(pdMS_TO_TICKS(1000));

    while(1)
    {
        printf("----------------!\n");
        printf("task2 begin to set bit0!\n");

        xEventGroupSetBits(xCreatedEventGroup, BIT_0);

        vTaskDelay(pdMS_TO_TICKS(5000));

        printf("----------------!\n");
        printf("task2 begin to set bit4!\n");

        xEventGroupSetBits(xCreatedEventGroup, BIT_4);

        vTaskDelay(pdMS_TO_TICKS(5000));
    }
}

void app_main(void)
{

    /* Attempt to create the event group. */
    xCreatedEventGroup = xEventGroupCreate();
    /* Was the event group created successfully? */
    if (xCreatedEventGroup == NULL)
    {
        /* The event group was not created because there was insufficient FreeRTOS heap available. */
        printf("Event group create fail!\n");
    }
    else
    {
        /* The event group was created. */
        vTaskSuspendAll();

        xTaskCreate(Task1, "Task1", 1024 * 5, NULL, 1, NULL);
        xTaskCreate(Task2, "Task2", 1024 * 5, NULL, 1, NULL);

        xTaskResumeAll();
    }
}

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

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

相关文章

嵌入式Linux 开发经验:编写用户态应用程序打开 misc 设备

参考文章 VSCode SSH 连接远程ubuntu Linux 主机 ubuntu 20.04 qemu linux6.0.1 开发环境搭建 ubuntu 20.04 qemu linux6.0.1 制作ext4根文件系统 嵌入式Linux 开发经验&#xff1a;platform_driver_register 的使用方法 嵌入式Linux 开发经验&#xff1a;注册一个 misc 设…

创新案例|实现YouTube超速增长的3大敏捷组织运营机制(上)

从2008年到2014年YouTube进入超速增长模式。时任核心技术负责人的 Shishir Mehrotra回顾了当时公司面临的挑战&#xff0c;以及带领YouTube团队如何建立一套敏捷运营机制的先进实践&#xff0c;以保持战略对齐并运营复杂的业务。这直接推进公司每周高效的工作节奏&#xff0c;以…

【Pytorch】模型的可复现性

背景 在做研究的时候&#xff0c;通常我们希望同样的样本&#xff0c;同样的代码能够得到同样的实验效果&#xff0c;但由于代码中存在一些随机性&#xff0c;导致虽然是同样的样本和程序&#xff0c;但是得到的结果不一致。在pytorch的官方文档中为此提供了一些建议&#xff…

复现 MMDetection

文章目录MMDetection 复现一、环境配置服务器信息安装CUDA下载并安装CUDA配置环境变量多个Cuda版本切换 (可选)安装CUDNN安装Anaconda搭建虚拟环境新建虚拟环境安装pytorchPycharm 远程连接代码同步配置服务器解释器二、训练和推理自制COCO格式数据集训练修改数据集相关参数修改…

Problem C: 算法10-10,10-11:堆排序

Problem Description 堆排序是一种利用堆结构进行排序的方法&#xff0c;它只需要一个记录大小的辅助空间&#xff0c;每个待排序的记录仅需要占用一个存储空间。 首先建立小根堆或大根堆&#xff0c;然后通过利用堆的性质即堆顶的元素是最小或最大值&#xff0c;从而依次得出…

TMS FixInsight代码评估工具

TMS FixInsight代码评估工具 TMS Fix Insight被认为是Delphi程序员的代码评估工具&#xff0c;它也能够在Delphi的源代码中发现问题。它被认为是一个代码分析工具&#xff0c;用于划分过程以及问题的位置以及Delphi的应用。TMS Fix Insight基本上是一个静态的代码列表&#xff…

Spring - SmartInstantiationAwareBeanPostProcessor扩展接口

文章目录Preorg.springframework.beans.factory.config.SmartInstantiationAwareBeanPostProcessor类关系SmartInstantiationAwareBeanPostProcessor接口方法扩展示例Pre Spring Boot - 扩展接口一览 org.springframework.beans.factory.config.SmartInstantiationAwareBeanPo…

HTML5期末大作业:基于HTML+CSS+JavaScript仿蘑菇街购物商城设计毕业论文源码

常见网页设计作业题材有 个人、 美食、 公司、 学校、 旅游、 电商、 宠物、 电器、 茶叶、 家居、 酒店、 舞蹈、 动漫、 服装、 体育、 化妆品、 物流、 环保、 书籍、 婚纱、 游戏、 节日、 戒烟、 电影、 摄影、 文化、 家乡、 鲜花、 礼品、 汽车、 其他等网页设计题目, A…

jdk11新特性——官方的更新列表

目录一、官方的更新列表二、JEP (JDK Enhancement Proposal 特性增强提议)一、官方的更新列表 二、JEP (JDK Enhancement Proposal 特性增强提议) JShell——(java9开始支持)Dynamic Class-File Constants类文件新添的一种结构局部变量类型推断&#xff08;var关键字&#xff…

开荒手册3——构思一篇小论文

0 写在前面 又过了一个gap week&#xff0c;总算想清楚了之前遇到的一些问题&#xff0c;现在需要把之前画的大饼们一个一个消化掉。跳出来就会知道&#xff0c;总有一些something is wrong的人喜欢散播点焦虑&#xff0c;你要做的不是惩戒他们&#xff0c;而是赶紧远离&#…

windows下安装ubuntu linux子系统

windows下安装ubuntu linux子系统一、win10下安装ubuntu linux子系统二、下载ubuntu子系统三、启动ubuntu子系统四、配置ubuntu子系统一、win10下安装ubuntu linux子系统 但我们现在自己的主机上跑linux时&#xff0c;有几种选择 同时安装多个操作系统&#xff0c;每次重启电…

js 代码的运行机制

前言&#xff1a; 自己从一开始学习 javaScript 的时候&#xff0c;踩过很多很多坑&#xff0c;初学之路上也问过很多大佬许多为什么...现在回过头感叹&#xff0c;当时问的某些问题确实是有一丢丢幼稚。但是作为一个过来者&#xff0c;我深知这些问题的对于很多“后来者”来说…

tensorflow的模型持久化

参考 tensorflow的模型持久化 - 云社区 - 腾讯云 目录 1、持久化代码实现 2、持久化原理及数据格式 1、meta_info_def属性 2、graph_def属性 3、saver_def属性 4、collection_def属性 1、持久化代码实现 tensorflow提供了一个非常简单的API来保存和还原一个神经网络模型…

自主式模块化无人机设计

目 录 摘 要 I Abstract II 1 绪论 1 1.1 研究背景与意义 1 1.2 国内外研究现状 1 1.3 主要研究内容 2 2自主式模块化无人机的总体结构设计 3 2.1结构形式 3 2.2工作原理 3 2.3机架及桨叶的选择 5 2.3.1 单个桨叶空气动力分析及桨叶的选择 5 2.3.2材料的选择 6 2.3.3机架结构分…

【教学类-20-01】20221203《世界杯16强国旗》(大班)

展示效果&#xff1a; 单人使用样式&#xff1a; 多页打印样式 ​ 背景需求&#xff1a; 做《蒙德里安》格子画时&#xff0c;我把A4纸分割为正方形画框和长条纸支撑。活动中幼儿询问&#xff1a;为什么我的画站不起来&#xff1f;&#xff08;底边剪的不平整、提手太重、画…

知识直播:时代乐见搜狐的长期主义选择

国内著名商业咨询顾问刘润说&#xff1a;“所有伟大的机会都源自于巨大的结构性改变。大成就背后&#xff0c;一定有涌动的、因商业逻辑巨变而释放出来的红利。” 这话用在当前的互联网行业身上再好不过。面对重重不确定性&#xff0c;如何拨开迷雾&#xff0c;看懂市场趋势&a…

HTTP到底是什么?

文章目录HTTP简介HTTP协议的特点1) 简单快速2) 灵活3) 无连接4) 无状态HTTP协议的发展历程1) HTTP/0.92) HTTP/1.03) HTTP/1.14) HTTP/2.0HTTP的工作流程HTTP简介 HTTP 全称为 Hypertext Transfer Protocol&#xff0c;翻译为中文是“超文本传输协议”的意思&#xff0c;它是互…

Java并发编程—volatile

文章目录volatile的应用volatile的定义与实现原理专业术语&#xff1a;volatile是如何来保证可见性的呢&#xff1f;volatile的原理&#xff1a;volatile的两条实现原则&#xff1a;&#xff08;物理上如何实施&#xff09;volatile的内存语义volatile的特性例&#xff1a;下面…

SpringBoot -集成Druid

文章目录Druid概述使用问题解决Spring监控不生效方式1&#xff1a;修改yml的配置写法方式2&#xff1a;参考DruidSpringAopConfiguration自行注入Bean&#xff0c;灵活&#xff08;更建议&#xff09;Druid 概述 官网&#xff1a; https://github.com/alibaba/druid   文档&a…

校园论坛(Java)—— 用户管理系统模块

校园论坛&#xff08;Java&#xff09;—— 用户管理系统模块 文章目录校园论坛&#xff08;Java&#xff09;—— 用户管理系统模块[toc]1、写在前面2、系统结构设计2.1 各个页面之间的调用关系2.2. 用户管理系统模块各层的设计3、管理员管理用户功能3.1 管理员查看普通用户的…