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

系列文章目录


文章目录

  • 系列文章目录
  • 事件标志组
  • 事件标志组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.hqwc.cn/news/14276.html

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

相关文章

ncnn源码阅读(二)----网络模型结构和权重参数的加载

网络模型结构和权重参数的加载 ncnn推理框架中把模型的结构和权重参数分为两个文件进行存储&#xff0c;实现了结构和权重的分离。在xxx.param中存储了模型的结构信息&#xff0c;在xxx.bin中存储了模型的权重信息。xxx.param的文件结构如下&#xff1a; layer&#xff1a;描…

开源防病毒引擎ClamAV

本文软件是应网友 Windows 的要求折腾的&#xff1b; 什么是 ClamAV &#xff1f; ClamAV 是一个开源 ( GPLv2 ) 反病毒工具包&#xff0c;专为邮件网关上的电子邮件扫描而设计。它提供了许多实用程序&#xff0c;包括灵活且可扩展的多线程守护程序、命令行扫描程序和用于自动数…

进程池线程池实现TCP高性能并发通信

进程池线程池实现TCP高性能并发通信 使用进程池与线程池实现并发服务&#xff0c;为多个客户进行接收和发送消息的服务 代码实现 # 导入进程池 from multiprocessing import Pool, cpu_count # 导入线程池 from multiprocessing.pool import ThreadPool from socket import …

Linux操作系统详解

文章目录 引言1. 认识Linux1.1 操作系统概述1.2 认识Linux1.3 虚拟机介绍1.4 远程连接Linux操作系统1.5 WSL1.6 虚拟机快照 2. Linux基础命令2.1 Linux的目录结构2.2 命令入门2.3 目录切换相关命令&#xff08;cd/pwd&#xff09;2.4 相对路径&#xff0c;绝对路径和特殊路径符…

【计算机视觉 | 目标检测】arxiv 计算机视觉关于目标检测的学术速递(7 月 4 日论文合集)

文章目录 一、检测相关(15篇)1.1 Artifacts Mapping: Multi-Modal Semantic Mapping for Object Detection and 3D Localization1.2 Shi-NeSS: Detecting Good and Stable Keypoints with a Neural Stability Score1.3 HODINet: High-Order Discrepant Interaction Network for…

centos7安装git及maven

安装git 直接使用yum安装&#xff0c;指令如下&#xff1a; yum install git然后执行如下指令判断是否安装完成&#xff1a; git --version紧接着需要维护git的用户名及邮箱等信息 git config --global user.name "zzy" git config --global user.email "ex…

Spring MVC 程序开发

什么是 Spring MVC&#xff1f; 官⽅对于 Spring MVC 的描述是这样的&#xff1a; Spring Web MVC is the original web framework built on the Servlet API and has been included in the Spring Framework from the very beginning. The formal name, “Spring Web MVC,”…

Android App的几个核心概念

Application启动 点击桌面图标启动App(如下流程图) 针对以上流程图示&#xff1a; ActivityManagerService#startProcessLocked()Process#start()ActivityThread#main()&#xff0c;入口分析的地方ActivityThread#attach()&#xff0c;这个里面的逻辑很核心 ActivityManagerS…

【Springboot集成Neo4j完整版教程】

&#x1f680; Neo4j &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;C…

python绘制带有误差棒的条形图

文章目录 bar和barh加入误差棒定制误差棒颜色 bar和barh 在matplotlib中&#xff0c;通过bar和barh来绘制条形图&#xff0c;分别表示纵向和横向的条形图。二者的输入数据均主要为高度x和标签height&#xff0c;示例如下 import matplotlib.pyplot as plt import numpy as np…

使用RabbitMQ

使用RabbitMQ 1 Docker安装RabbitMQ 1.1 安装RabbitMQ # 下载含有管理页面的镜像 docker pull rabbitmq:3.8.8-management# 创建容器 # 5672&#xff1a;应用访问端口&#xff1b;15672&#xff1a;控制台Web端口号&#xff1b; docker run -itd \ --namemy-rabbitmq \ --re…

html,css笔记1

这里写目录标题 一、快捷键及基础常识基础框架2.lang语言种类3.字符集4.HTML常用标签4.1标题标签&#xff08;重要&#xff09;4.2段落和换行标签(重要)4.3文本格式化标签 一、快捷键及基础常识 1.快速复制一行 快捷键&#xff1a;shiftalt下箭头 光标定位到要复制的一行 2.…