FreeRTOS实时操作系统(十二)事件标志组

news2024/12/29 13:13:42

系列文章目录


文章目录

  • 系列文章目录
  • 事件标志组
  • 事件标志组API函数
  • 实验测试


事件标志组

事件标志位:用一个位来表示事件是否可以发生。

事件标志组是一组事件标志位的集合

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

一个事件组包含了一个EventBits_t数据类型的变量,是一个16位或32位的无符号数据类型

typedef TickType_t EventBits_t;
#if ( configUSE_16_BIT_TICKS  = =  1 )
	typedef   uint16_t   TickType_t;
#else	
	typedef   uint32_t   TickType_t;
#endif

在这里插入图片描述

但是高8位用作存储事件标志组的控制信息,低24位用作存储事件标志,最多存储24个事件标志。

队列和信号量在事件发生的时候,只能有一个任务被唤醒,而且队列的数据在读取后就消失了,信号量在获取后就减少了;
事件标志组不同,事件发生的时候,会唤醒所有符合条件的任务,且可以选择保留事件或者清除事件。

事件标志组API函数

函数描述
xEventGroupCreate()使用动态方式创建事件标志组
xEventGroupCreateStatic()使用静态方式创建事件标志组
xEventGroupClearBits()清零事件标志位
xEventGroupClearBitsFromISR()在中断中清零事件标志位
xEventGroupSetBits()设置事件标志位
xEventGroupSetBitsFromISR()在中断中设置事件标志位
xEventGroupWaitBits()等待事件标志位
xEventGroupSync()设置事件标志位,并等待事件标志位

1.动态创建API函数

EventGroupHandle_t    xEventGroupCreate ( void ) ; 

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

2.清除事件标志位API函数

EventBits_t  xEventGroupClearBits( EventGroupHandle_t xEventGroup,const EventBits_t uxBitsToClear ) 

形参:
xEventGroup:待操作的事件标志组句柄
uxBitsToSet :待清零的事件标志位

返回值:
整数 :清零事件标志位之前事件组中事件标志位的值

3.设置事件标志位API函数

EventBits_t   xEventGroupSetBits(  EventGroupHandle_t xEventGroup,const EventBits_t uxBitsToSet ) 

形参:
xEventGroup :待操作的事件标志组句柄
uxBitsToSet :待设置的事件标志位

返回值:
整数:函数返回时,事件组中的事件标志位值

4.等待事件标志位API函数

EventBits_t   xEventGroupWaitBits( EventGroupHandle_t 	xEventGroup,
                             	   const EventBits_t 	uxBitsToWaitFor,
                                   const BaseType_t 	xClearOnExit,
                                   const BaseType_t 	xWaitForAllBits,
                                   TickType_t 		    xTicksToWait  )

形参:
xEvenrGroup :等待的事件标志组句柄
uxBitsToWaitFor:等待的事件标志位,可以用逻辑或等待多个事件标志位
xClearOnExit:等待到事件标志位后,清除对应的事件标志位,pdTRUE 清除uxBitsToWaitFor指定位,pdFALSE不清除
xWaitForAllBits :等待 uxBitsToWaitFor 中的所有事件标志位(逻辑与)pdTRUE等待的位全部为1,pdFALSE某个为1
xTicksToWait:等待的阻塞时间

返回值:
等待的事件标志位值 :等待事件标志位成功,返回等待到的事件标志位
其他值 :等待事件标志位失败,返回事件组中的事件标志位

可以等待某一位,也可以等待多位

5.同步函数

EventBits_t    xEventGroupSync(  EventGroupHandle_t xEventGroup,
								const EventBits_t uxBitsToSet,
								const EventBits_t 	uxBitsToWaitFor,
								TickType_t 		xTicksToWait) 

形参:
xEventGroup :等待事件标志所在事件组
uxBitsToSet :达到同步点后,要设置的事件标志
uxBitsToWaitFor: 等待的事件标志
xTicksToWait: 等待的阻塞时间

返回值:
等待的事件标志位值 :等待事件标志位成功,返回等待到的事件标志位
其他值 :等待事件标志位失败,返回事件组中的事件标志位

实验测试

任务1:创建任务2和任务3,并且创建事件标志组
任务2;将事件标志组相应事件位置1,模拟事件发生
任务3:同时等待事件标志组中的多个事件位发生,发生全部置1进行处理

在这里插入图片描述

EventGroupHandle_t  eventgroup_handle;
#define EVENTBIT_0  (1 << 0)
#define EVENTBIT_1  (1 << 1)
/**
 * @brief       FreeRTOS例程入口函数
 * @param       无
 * @retval      无
 */
void freertos_demo(void)
{    
    xTaskCreate((TaskFunction_t         )   start_task,
                (char *                 )   "start_task",
                (configSTACK_DEPTH_TYPE )   START_TASK_STACK_SIZE,
                (void *                 )   NULL,
                (UBaseType_t            )   START_TASK_PRIO,
                (TaskHandle_t *         )   &start_task_handler );
    vTaskStartScheduler();
}


void start_task( void * pvParameters )
{
    taskENTER_CRITICAL();               /* 进入临界区 */
    eventgroup_handle = xEventGroupCreate();
    if(eventgroup_handle != NULL)
    {
        printf("事件标志组创建成功!!\r\n");
    }
    
    xTaskCreate((TaskFunction_t         )   task1,
                (char *                 )   "task1",
                (configSTACK_DEPTH_TYPE )   TASK1_STACK_SIZE,
                (void *                 )   NULL,
                (UBaseType_t            )   TASK1_PRIO,
                (TaskHandle_t *         )   &task1_handler );
                
    xTaskCreate((TaskFunction_t         )   task2,
                (char *                 )   "task2",
                (configSTACK_DEPTH_TYPE )   TASK2_STACK_SIZE,
                (void *                 )   NULL,
                (UBaseType_t            )   TASK2_PRIO,
                (TaskHandle_t *         )   &task2_handler );
                             
    vTaskDelete(NULL);
    taskEXIT_CRITICAL();                /* 退出临界区 */
}

/* 任务一,释放二值信号量 */
void task1( void * pvParameters )
{
    uint8_t key = 0;
    while(1) 
    {
        key = key_scan(0);
        if(key == KEY0_PRES)
        {
            xEventGroupSetBits( eventgroup_handle, EVENTBIT_0); /* 将事件标志组的bit0位置1 */
        }else if(key == KEY1_PRES)
        {
            xEventGroupSetBits( eventgroup_handle, EVENTBIT_1); /* 将事件标志组的bit1位置1 */
        }
        vTaskDelay(10);
    }
}

/* 任务二,获取二值信号量 */
void task2( void * pvParameters )
{
    EventBits_t event_bit = 0;
    while(1)
    {
        event_bit = xEventGroupWaitBits( eventgroup_handle,         /* 事件标志组句柄 */
                                         EVENTBIT_0 | EVENTBIT_1,   /* 等待事件标志组的bit0和bit1位 */
                                         pdTRUE,                    /* 成功等待到事件标志位后,清除事件标志组中的bit0和bit1位 */
                                         pdTRUE,                    /* 等待事件标志组的bit0和bit1位都置1,就成立 */
                                         portMAX_DELAY );           /* 死等 */
        printf("等待到的事件标志位值为:%#x\r\n",event_bit);
    }
}

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

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

相关文章

Java的异常Exception

异常 1、异常概述与异常体系结构 1.1、异常概述 异常&#xff1a;在Java语言中&#xff0c;将程序执行中发生的不正常情况称为“异常”&#xff08;开发过程中的语法错误和逻辑错误不是异常&#xff09; Java程序在执行过程中所发生的异常事件可分为两类&#xff1a; Erro…

装饰器模式:通过剖析Java IO类库源码学习装饰器模式

我们通过剖析Java IO类的设计思想&#xff0c;再学习一种新的结构型模式&#xff0c;装饰器模式。它的代码结构跟桥接模式非常相似&#xff0c;不过&#xff0c;要解决的问题却大不相同。 Java IO类库非常庞大和复杂&#xff0c;有几十个类&#xff0c;负责IO数据的读取…

Appium: Windows系统桌面应用自动化测试(三) 【脚本操作】

Appium: Windows系统桌面应用自动化测试 【脚本操作】 一、常用操作1、添加被测程序1.1示例一&#xff1a;通过程序路径指定应用程序&#xff0c;例如指定写字板程序路径。1.2示例二&#xff1a;通过程序ID指定应用程序&#xff0c;例如指定计算器ID。1.3 应用程序ID&#xff0…

芯片工程师求职题目之验证篇(2)

1. 事件驱动的仿真器和和基于周期的仿真器有什么区别&#xff1f; 事件驱动的仿真器顾名思义就是根据事件(event)触发仿真进行的&#xff0c;在进入一个周期中&#xff0c;它会获取每个事件并通过设计传播求值&#xff0c;直到达到稳定状态的条件&#xff0c;接着进入下一个周…

Android:安卓开发采用Volley网络框架+MySQL数据库,实现从服务器获取数据并展示完成记单词APP

一、功能与要求 实现功能&#xff1a;设计一个记单词APP。服务器采用Tomcat&#xff0c;数据库采用Mysql。实现用户的注册登录功能以及单词的增删改查。 指标要求&#xff1a;实现UI布局&#xff1b;将系统数据保存到Mysql数据库中&#xff0c;并采用Volley网络框架实现从服务…

【机器学习核心总结】什么是随机森林

什么是随机森林 森林里有很多树&#xff0c;随机森林里有很多决策树。 随机森林是决策树的升级版&#xff0c;随机指的是树的生长过程。世上没有两片相同的树叶&#xff0c;随机森林中的树也各不相同。在构建决策树时&#xff0c;我们会从训练数据中有放回的随机选取一部分样本…

Kubernetes service服务的发布 - kube-proxy(负载均衡器)-IPVS

目录 Service Service将内部的pod暴露到外面&#xff0c;让用户可以访问 负载均衡策略&#xff1a; Service 的类型&#xff1a; 案例&#xff1a;Service服务发布案例 扩展&#xff1a;我们在案例再加入一个探针的使用 更改后的my_nginx.yaml文件&#xff1a; 创建Pod&…

ChatGLM2-6B发布,C-Eval超GPT4,支持32k上下文!

自清华大学数据挖掘实验室&#xff08;THUDM&#xff09;3月开源ChatGLM-6B已经过去了3个多月&#xff0c;最近他们又带来了性能全面提升的“船新”版本-ChatGLM2-6B。别看名字变化小&#xff0c;其实更新的模型性能是又有量又实用。不了解ChatGLM的小伙伴可以看我这篇文章&…

Java基础之五 反射

通过Java反射机制&#xff0c;可以在程序中访问已经装载到JVM中的Java对象的描述&#xff0c;实现访问、检测和修改描述Java对象本身信息的功能。 通过反射可以访问的主要描述信息 访问成员变量 常用方法&#xff1a;getFields()、getField(String name)、getDeclaredFields()…

第 353 场LeetCode周赛

A 找出最大的可达成数字 签到题 class Solution { public:int theMaximumAchievableX(int num, int t) {return numt*2;} };B 达到末尾下标所需的最大跳跃次数 动态规划: 定义 p i p_i pi​为跳至 i i i处所需的最大跳跃次数, 有状态转移方程 p i m a x { p j 1 ∣ 0 ≤ j &…

文档管理:PaperPort Professional 14.7 Crack

文档管理变得简单 PaperPort Professional 快速、轻松地访问重要文档对于保持组织平稳运行至关重要。与其浪费时间在文件夹中搜索所需的文件&#xff0c;不如在PC上扫描&#xff0c;转换&#xff0c;组织&#xff0c;组装和共享文档和图像&#xff0c;或者更好的是&#xff0c;…

vue对于数组的数据监听变化和object是不一样的吗?

我们知道vue对于数组的数据监听变化和object是不一样的&#xff0c;因为我们常说的Object.defineProperty是对象上面的方法&#xff0c;所以对于array数组需要实现另外一套变化侦测机制。 今天我们就来研究下。 在哪里收集依赖 array数据设计了新的变化侦测机制&#xff0c;…

阿里云服务器架构X86计算、ARM、GPU/FPGA、裸金属和超级计算集群

阿里云服务器架构有什么区别&#xff1f;X86计算、ARM计算、GPU/FPGA/ASIC、弹性裸金属服务器、超级计算集群有什么区别&#xff1f;阿里云服务器网分享云服务器ECS架构详细说明&#xff1a; 目录 阿里云服务器ECS架构说明 X86计算 ARM计算 GPU/FPGA/ASIC 弹性裸金属服务…

第八章:L2JMobius学习 – 游戏服务GameServer讲解

本章节我们来讲解GameServer服务&#xff0c;首先来查看它的文件结构 ai&#xff1a;游戏角色自动化处理&#xff0c;比如说&#xff0c;自动攻击。 cache&#xff1a;数据缓存&#xff0c;里面就一个HtmCache.java类&#xff0c;缓存HTML文件内容。 communitybbs&#xff1a;b…

【C语言】1-Visual C++ 2010 的简单使用和第一个 C 语言程序

1. Visual C++ 2010 的简单使用 1.1 面板介绍 1.2 新建C语言项目 打开 Visual C++ 2010,点击 New Project 根据下面的图示进行操作,其中需要注意 ③:这里输入的为项目名(建议和我的命名保持一致) ④:这里是项目存放的位置,可以自己选择,最好不要有中文路径(只要是使…

苹果用户要留意?女子FaceTime通话面临巨额骗局,损失高达160万

FaceTime通话是苹果提供的一项服务&#xff0c;可以让使用iOS、iPadOS设备或Mac电脑的用户进行视频或音频通话。只要知道对方的Apple ID&#xff0c;世界各地的苹果设备都可以通过该ID进行呼叫。 据报道&#xff0c;一名居住在上海金山的女性最近遭受了一种新型诈骗&#xff0c…

js逆向补环境-调试工具vscode与nodejs使用之无环境联调

目录 一、啊哈一、Nodejs安装1、nodejs最新版本的安装&#xff08;windows&#xff09;2、旧版nodejs更新成最新版本&#xff08;windows&#xff09;3、nodejs安装&#xff08;linux&#xff09; 二、vscode安装使用(windows)1、下载安装vscode2、vscode运行插件Code Runner安…

多元分类预测 | Matlab基于K近邻算法(KNN)的数据分类预测,多特征输入模型

文章目录 效果一览文章概述部分源码参考资料效果一览 文章概述 基于K近邻算法(KNN)的数据分类预测,多特征输入模型 多特征输入单输出的二分类及多分类模型。程序内注释详细,直接替换数据就可以用。程序语言为matlab,程序可出分类效果图,迭代优化图,混淆矩阵图。 部分源码

MAYA粒子爆炸

创建粒子替代 中心归零 只有一种石头 particleShape1.shitourand(0,5); 设置石头大小 等比例变小 particleShape1.daxiao<<0.2,0.2,0.2>>; 使用变量代替 float $daxiaorand(0.2,0.5); particleShape1.daxiao<<$daxiao,$daxiao,$daxiao>>; 非等比例缩…