十七、FreeRTOS之FreeRTOS事件标志组

本节需要掌握以下内容:

1,事件标志组简介(了解)

2,事件标志组相关API函数介绍(熟悉)

3,事件标志组实验(掌握)

4,课堂总结(掌握)

一、时间标志组简介(了解)

时间标志位:用一个位,来表示事件是否发生,通常我们会定义一个标志位uint8_t flag = 0,bit0 = 1,表示按键按下了,bit0表示事件未发生。

事件标志组是一组事件标志位的集合,(一个位是一个事件标志位,把么8个位就组成了一个事件标志组,)那么可以简单的理解事件标志组,就是一个整数。

事件标志组的特点:

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

1.1 事件标志组简介

一个事件组就包含了一个EventBits_t数据类型的变量,变量类型EventBits_t的定义如下所示:

 EventBits_t实际上是一个16位或32位的无符号的数据类型

虽然使用了32位无符号的数据类型变量来存储事件标志,但其中的高8位用作存储事件标志组的控制信息,低24位用作存储事件标志,所以说一个事件组最多可以存储24个事件标志!

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

功能

唤醒对象

事件清除

队列、信号量

事件发生时,只会唤醒一个任务

是消耗型的资源,队列的数据被读走就

没了;信号量被获取后就减少了

事件标志组

事件发生时,会唤醒所有符合条件的任务,可以理解为“广播”的作用

被唤醒的任务有两个选择,可以让事件

保留不动,也可以清除事件

二、事件标志组相关API函数介绍(熟悉)

函数

描述

xEventGroupCreate()

使用动态方式创建事件标志组

xEventGroupCreateStatic()

使用静态方式创建事件标志组

xEventGroupClearBits()

清零事件标志位

xEventGroupClearBitsFromISR()

在中断中清零事件标志位

xEventGroupSetBits()

设置事件标志位

xEventGroupSetBitsFromISR()

在中断中设置事件标志位

xEventGroupWaitBits()

等待事件标志位

xEventGroupSync()

设置事件标志位,并等待事件标志位

 此处只列举了常用的一部分,更多事件标志组相关的API函数介绍请查阅FreeRTOS开发指南》-- 第十六章“FreeRTOS事件标志组”

2.1 动态方式创建事件标志组API函数

EventGroupHandle_t    xEventGroupCreate ( void ) ;

返回值

描述

NULL

事件标志组创建失败

其他值

事件标志组创建成功,返回其句柄

2.2 清除事件标志位API函数

EventBits_t  xEventGroupClearBits( EventGroupHandle_t   xEventGroup,
        const
EventBits_t   uxBitsToClear )

形参

描述

xEventGroup

待操作的事件标志组句柄

uxBitsToSet

待清零的事件标志位

返回值

描述

整数

清零事件标志位之前事件组中事件标志位的值

 2.3 设置事件标志位API函数

EventBits_t   xEventGroupSetBitsEventGroupHandle_t   xEventGroup,
    const
EventBits_t   uxBitsToSet    )

形参

描述

xEventGroup

待操作的事件标志组句柄

uxBitsToSet

待设置的事件标志位

返回值

描述

整数

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

2.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

等待的阻塞时间

拿一个8位的变量来举例,假设设置bit0和bit1都成立,这时候第二个参数就可以或起来,写成0x02|0x01,再多几个也可以这样或起来。

返回值

描述

等待的事件标志位值

等待事件标志位成功,返回等待到的事件标志位

其他值

等待事件标志位失败,返回事件组中的事件标志位

 特点:可以等待某一位、也可以等待多位,等到期望的事件后,还可以清除某些位

2.5 同步函数

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

形参

描述

xEventGroup

等待事件标志所在事件组

uxBitsToSet

达到同步点后,要设置的事件标志

uxBitsToWaitFor

等待的事件标志

xTicksToWait

等待的阻塞时间

返回值

描述

等待的事件标志位值

等待事件标志位成功,返回等待到的事件标志位

其他值

等待事件标志位失败,返回事件组中的事件标志位

举个例子:

Task1:做饭        Task2:做菜 

Task1做好自己的事之后,需要等待菜也做好,大家在一起吃饭。

特点:同步!

三、事件标志组实验(掌握)

3.1、实验目的:

学习 FreeRTOS 的事件标志组相关API的使用。

3.2、实验设计:

将设计三个任务:start_task、task1、task2

三个任务的功能如下:

  • start_task:用来创建task1和task2任务,并创建事件标志组
  • task1:读取按键按下键值,根据不同的键值将事件标志组相应事件位置1,模拟事件发生
  • task2:同时等待事件标志组中的多个事件位,当这些事件位都置1的话就执行相应的处理

3.3 实验代码

demo.c

/******************************************************************************************************/
/*FreeRTOS配置*//* START_TASK 任务 配置* 包括: 任务句柄 任务优先级 堆栈大小 创建任务*/
#define START_TASK_PRIO         1
#define START_TASK_STACK_SIZE   128
TaskHandle_t    start_task_handler;
void start_task( void * pvParameters );/* TASK1 任务 配置* 包括: 任务句柄 任务优先级 堆栈大小 创建任务*/
#define TASK1_PRIO         2
#define TASK1_STACK_SIZE   128
TaskHandle_t    task1_handler;
void task1( void * pvParameters );/* TASK2 任务 配置* 包括: 任务句柄 任务优先级 堆栈大小 创建任务*/
#define TASK2_PRIO         3
#define TASK2_STACK_SIZE   128
TaskHandle_t    task2_handler;
void task2( void * pvParameters );/******************************************************************************************************/
EventGroupHandle_t  eventgroup_handle;
#define EVENTBIT_0  (1 << 0)   /* 0x01 */
#define EVENTBIT_1  (1 << 1)   /* 0x10 */
/*** @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();                /* 退出临界区 */
}/* 任务一,事件标志组相应事件位置1 */
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);}
}

 把程序下进去之后,复位

首先打印的是:事件标志组创建成功!

为什么不打印等待事件的标志位值呢?因为此时BIT0 与 BIT1都不是1,Task2处于阻塞状态,

按下KEY0也不会打印,KEY0与KEY1都按了才会打印:等待事件的标志位值为0x03(0x01|0x02)

当事件等待函数xEventGroupWaitBits()执行完毕之后,BIT0 与 BIT1都会被清除,所以打印一次之后,下次进来之后,就又进入阻塞状态了

如果把第三个参数改为pdFALSE,那就是不清零,就一直打印一直打印。

如果把第四个参数改成pdFLASE,那么BIT0 与 BIT1只有有一个为1,就会打印对应的键值。

四、总结

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

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

相关文章

04_W5500_TCP_Server

上一节我们完成了TCP_Client实验&#xff0c;这节使用W5500作为服务端与TCP客户端进行通信。 目录 1.W5500服务端要做的&#xff1a; 2.代码分析&#xff1a; 3.测试&#xff1a; 1.W5500服务端要做的&#xff1a; 服务端只需要打开socket&#xff0c;然后监听端口即可。 2…

HarmonyOS Developer——鸿蒙【构建第一个JS应用(FA模型)】

创建JS工程 JS工程目录结构 构建第一个页面 构建第二个页面 实现页面间的跳转 使用真机运行应用 说明 为确保运行效果&#xff0c;本文以使用DevEco Studio 3.1 Release版本为例&#xff0c;点击此处获取下载链接。 创建JS工程 若首次打开DevEco Studio&#xff0c;请点击…

虾皮什么商品好卖

在虾皮&#xff08;Shopee&#xff09;平台上&#xff0c;有许多商品类别都表现出了较好的销售情况。然而&#xff0c;随着时间和地区的变化&#xff0c;热销商品也会有所不同。本文将介绍一些在虾皮平台上表现较好的商品类别&#xff0c;并提供一些建议&#xff0c;帮助您在虾…

交换机基本原理和配置

目录 一、数据链路层功能 二、交换机的工作原理 三、交换机的四大功能 一、数据链路层功能 位于网络层与物理层之间 数据链路的建立、维护与拆除帧包装、帧传输、帧同步帧的差错恢复流量控制 二、交换机的工作原理 交换机通过数据帧的源 MAC 地址&#xff0c;学习到交换机端…

【算法】直接插入排序

目录 1. 说明2. 举个例子3. java代码示例4. java示例截图 1. 说明 1.直接插入排序的方式和打牌一样&#xff0c;刚开始数组为空 2.拿到一个数字后从左到右将它与数组中的每一个数字进行比较&#xff0c;然后插入合适的位置 3.到最后&#xff0c;数组按照既定的顺序排序好 2. 举…

OpenCV基础篇

OpenCV基础篇 一、图像、视频读取二、cv::Mat()数据类型三、绘图功能四、鼠标响应事件五、图像像素读写六、图像像素运算七、颜色空间转换八、图像几何变换九、图像滤波十、图像二值化十一、图像梯度十二、Canny边缘检测十三、图像形态学十四、图像直方图十五、霍夫变换十六、分…

springboot_ssm_java学位论文盲审系统

本系统主要实现用户登录验证&#xff0c;用户使用邮箱&#xff0c;密码和选择身份进行登录&#xff0c;用户查看个人中心&#xff0c;提交论文&#xff0c;发表留言和问题反馈。用户在线注册。学生模块功能实现&#xff1a;学生注册&#xff0c;查看信息&#xff0c;修改资料&a…

智能优化算法应用:基于鱼鹰算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于鱼鹰算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于鱼鹰算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.鱼鹰算法4.实验参数设定5.算法结果6.参考文献7.MATLAB…

蓝桥杯航班时间

蓝桥杯其他真题点这里&#x1f448; //飞行时间 - 时差 已过去的时间1 //飞行时间 时差 已过去的时间2 //两个式子相加会发现 飞行时间 两段时间差的和 >> 1import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader;public cl…

[Linux] LAMP架构

一、LAMP架构架构的概述 LAMP 架构是一种流行的 Web 应用程序架构&#xff0c;它的名称是由四个主要组件的首字母组成的&#xff1a; Linux&#xff08;操作系统&#xff09;&#xff1a; 作为操作系统&#xff0c;Linux 提供了服务器的基础。它负责处理硬件资源、文件系统管理…

解读 | 阿里通义千问模型全尺寸开源 “诚意满满“背后的名与利

大家好&#xff0c;我是极智视界&#xff0c;欢迎关注我的公众号&#xff0c;获取我的更多前沿科技分享 邀您加入我的知识星球「极智视界」&#xff0c;星球内有超多好玩的项目实战源码和资源下载&#xff0c;链接&#xff1a;https://t.zsxq.com/0aiNxERDq 12 月 1 日阿里开源…

基于Web和深度学习的辣椒检测产量预测系统

1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 研究背景与意义 辣椒是一种重要的经济作物&#xff0c;被广泛种植和消费。然而&#xff0c;辣椒的产量预测一直是农业生产中的重要问题。准确地预测辣椒的产量可以帮助农民合理安…

高项备考葵花宝典-项目进度管理输入、输出、工具和技术(下,很详细考试必过)

项目进度管理的目标是使项目按时完成。有效的进度管理是项目管理成功的关键之一&#xff0c;进度问题在项目生命周期内引起的冲突最多。 小型项目中&#xff0c;定义活动、排列活动顺序、估算活动持续时间及制定进度模型形成进度计划等过程的联系非常密切&#xff0c;可以视为一…

【论文笔记】FSD V2: Improving Fully Sparse 3D Object Detection with Virtual Voxels

原文链接&#xff1a;https://arxiv.org/abs/2308.03755 1. 引言 完全稀疏检测器在基于激光雷达的3D目标检测中有较高的效率和有效性&#xff0c;特别是对于长距离场景而言。 但是&#xff0c;由于点云的稀疏性&#xff0c;完全稀疏检测器面临的一大困难是中心特征丢失&…

vFW搭建IRF

正文共&#xff1a;2328字 40图&#xff0c;预估阅读时间&#xff1a;5 分钟 IRF&#xff08;Intelligent Resilient Framework&#xff0c;智能弹性架构&#xff09;技术通过将多台设备连接在一起&#xff0c;虚拟化成一台设备&#xff0c;集成多台设备的硬件资源和软件处理能…

两个月软考-高项上岸

文章目录 前言结缘软考功亏一篑有始有终2个月计划资料部分计划截图 总结 前言 我们看小说或者电视剧电影都会看到这样的情节&#xff0c;主角一开始锦衣玉食&#xff0c;突然家道中落&#xff0c;啥都没了&#xff0c;主角再一路奋起重新找回了属于自己的一切&#xff1b;还有…

Vue项目中实现浏览器标签页名字的动态修改

修改router/index.js文件 路由条目下面添加meta属性 meta:{title:DevOps运维平台 }示例 使用Vue的全局守卫函数beforeEach&#xff0c;在路由切换前动态修改浏览器标签页名字 router.beforeEach((to,from,next) > {document.title to.meta.titlenext() })

Error: Cannot find module ‘E:\Workspace_zwf\mall\build\webpack.dev.conf.js‘

执行&#xff1a;npm run dev E:\Workspace_zwf\zengwenfeng-master>npm run dev> mall-app-web1.0.0 dev E:\Workspace_zwf\zengwenfeng-master > webpack-dev-server --inline --progress --config build/webpack.dev.conf.jsinternal/modules/cjs/loader.js:983thr…

[笔记]ARMv7/ARMv8 交叉编译器下载

开发 Cortex-A7、Cortex-A72 或其他 ARM 架构 profile 芯片时&#xff0c;经常需要下载对应架构的交叉编译器&#xff0c;所以写这篇笔记&#xff0c;用于记录一下交叉编译器下载流程&#xff0c;免得搞忘。 编译环境&#xff1a;ubuntu 虚拟机 下载地址 我们可以从 ARM 官网…

09 视频分片上传Minio和播放

文章目录 一、流程设计1. 分片上传实现思路2. 文件分片上传流程3. 视频播放流程 二、代码实现1. 后端代码2. 文件上传前端代码3. 视频播放前端代码 一、流程设计 1. 分片上传实现思路 2. 文件分片上传流程 3. 视频播放流程 二、代码实现 1. 后端代码 pom.xml <dependenc…