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

【学习FreeRTOS】第16章——FreeRTOS事件标志组

1.事件标志组简介

事件标志位:用一个位,来表示事件是否发生
事件标志组是一组事件标志位的集合, 可以简单的理解事件标志组,就是一个整数。

事件标志组的特点:

  • 它的每一个位表示一个事件(高8位不算)
  • 每一位事件的含义,由用户自己决定,如:bit0表示按键是否按下,bit1表示是否接受到消息
    这些位的值为1:表示事件发生了;值为0:表示事件未发生
  • 任意任务或中断都可以读写这些位
  • 可以等待某一位成立,或者等待多位同时成立
    在这里插入图片描述

一个事件组就包含了一个 EventBits_t 数据类型的变量,变量类型 EventBits_t 的定义如下所示。EventBits_t 实际上是一个 16 位或 32 位无符号的数据类型 (一般设为32位)

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

事件标志组与队列、信号量的区别

事件标志组和信号量存在区别,它们之间有一个可以沟通的桥梁——队列集,通过队列集可以模拟事件标志位
在这里插入图片描述

2.事件标志组相关API函数介绍

  • xEventGroupCreate():使用动态方式创建事件标志组
  • xEventGroupCreateStstic():使用静态方式创建事件标志组
  • xEventGroupClearBits():清零事件标志位
  • xEventGroupClearBitsFromISR():在中断中清零事件标志位
  • xEventGroupSetBits():设置事件标志位
  • xEventGroupSetBitsFromISR():在中断中设置事件标志位
  • xEventGroupWaitBits():等待事件标志位
  • xEventGroupSync():设置事件标志位,并等待事件标志位
  • vEventGroupDelete():删除事件标志组
  • xEventGroupGetBits():获取事件组中各事件标志位的值
  • xEventGroupGetBitsFromISR():在中断中获取事件组中各事件标志位的值

2.1.使用动态方式创建事件标志组xEventGroupCreate()

EventGroupHandle_t    xEventGroupCreate (void) ; 
  • 返回值:NULL,事件标志组创建失败;其他值,事件标志组创建成功,返回其句柄

2.2.清零事件标志位xEventGroupClearBits()

EventBits_t xEventGroupClearBits( 	EventGroupHandle_t 	xEventGroup,const EventBits_t 	uxBitsToClear) 
  • 形参xEventGroup:待操作的事件标志组句柄
  • 形参uxBitsToSet:待清零的事件标志位
  • 返回值:整数,清零事件标志位之前事件组中事件标志位的值

2.3.设置事件标志位xEventGroupSetBits()

EventBits_t  xEventGroupSetBits(  	EventGroupHandle_t 	xEventGroup,const EventBits_t 	uxBitsToSet)
  • 形参xEventGroup:待操作的事件标志组句柄
  • 形参uxBitsToSet:待设置的事件标志位
  • 返回值:整数,函数返回时事件组中事件标志位的值

2.4.等待事件标志位xEventGroupWaitBits()

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清除;pdFALSE:不清除
  • 形参xWaitForAllBits:等待uxBitsToWaitFor 中的所有事件标志位(逻辑与)pdTRUE,等待的位全部为1;pdFALSE,等待的位某个为1
  • 形参xTicksToWait:等待的阻塞时间
  • 返回值
    等待的事件标志位值:等待事件标志位成功,返回等待到的事件标志位
    其他值:等待事件标志位失败,返回事件组中的事件标志位
  • 特点:可以等待某一位、也可以等待多位,等到期望的事件后,还可以清除某些位

注意,本函数只能完成设置标志位的某一位或者全部,并不能设置某几位。比如8各中的1个或8个,不能设置2-7个

2.5.设置事件标志位,并等待事件标志位xEventGroupSync()

EventBits_t	xEventGroupSync(EventGroupHandle_t	xEventGroup,const EventBits_t 	uxBitsToSet,const EventBits_t 	uxBitsToWaitFor,TickType_t 			xTicksToWait)
  • 形参xEvenrGroup:等待的事件标志组句柄
  • uxBitsToSet:达到同步点后,要设置的事件标志
  • uxBitsToWaitFor:等待的事件标志
  • xTicksToWait:等待的阻塞时间
  • 返回值
    等待的事件标志位值:等待事件标志位成功,返回等待到的事件标志位
    其他值:等待事件标志位失败,返回事件组中的事件标志位
  • 特点:同步——用于Task1完成后置1,等待Task2完成之后才算完成事件

3.事件标志组实验

  • 实验目的:学习 FreeRTOS 的事件标志组API函数的使用。
  • 实验设计:将设计三个任务:start_task、task1、task2
    start_task-用来创建task1和task2任务,并创建事件标志组
    task1-读取按键按下键值,根据不同键值将事件标志组相应事件位置一,模拟事件发生
    task2-同时等待事件标志组中的多个事件位,当这些事件位都置 1 的话就执行相应的处理
    在这里插入图片描述
http://www.lryc.cn/news/139288.html

相关文章:

  • Echarts 柱状图的 itemStyle的normal中label如何format?
  • 我的笔记:数据体系规则
  • 苍穹外卖 day2 反向代理和负载均衡
  • 【SpringBoot】SpringBoot完整实现电子商务系统
  • RT-Thread 线程管理(学习二)
  • ESP32应用教程(1)— VL53L3CX距离传感器
  • Redis从基础到进阶篇(一)
  • postgresql的基本使用
  • ABC 258 G Triangle(bitset 优化)
  • 使用StreamLold写入 Starrocks报错:Caused by org
  • WX1860- ngbe-1.2.5 xdp程序在路由模式下,使用iperf工具测试数据包不转发,用jmeter可以
  • PHPStudy 安装tp8 php8.2.9 安装XDbug、redis扩展
  • 结构体指针和结构体数组指针
  • libdrm全解析二十 —— 源码全解析(17)
  • 基于docker搭建owncloud Harbor 构建镜像
  • 往Buildroot中增加Qt项目
  • C#-Tolewer和ToUpper的使用
  • RabbitMQ集群搭建和测试总结_亲测
  • SQLSTATE[IMSSP]: The active result for the query contains no fields.
  • 在Flutter应用内部实现分屏功能
  • Docker常用操作命令(二)
  • vue3 tailwindcss的使用
  • redis 基础篇(redis 理解)
  • C++系列-函数重载
  • leetcode-23.合并k个升序链表-day17
  • Linux scp命令
  • vue 简单实验 v-bind 变量与html属性绑定
  • 114.(cesium篇)cesium去掉时间轴并用按钮控制运动
  • 2023年清洁能源与智能电网国际会议(CCESG 2023)
  • RISC-V中国峰会 | 256核服务器高调亮相,谁与争锋?