freeRTOS——事件标志组知识总结及实战

1事件标志组概念

事件标志组:是一组事件标志位的集合, 可以简单的理解事件标志组,就是一个整数。
其特点:
1)它的每一个位表示一个事件(高8位不算)
2)每一位事件的含义,由用户自己决定,如:bit0表示按键是否按下,bit1表示是否接受到消息,值为1:表示事件发生了;值为0:表示事件未发生
3)任意任务或中断都可以读写这些位
4)可以等待某一位成立,或者等待多位同时成立

2 事件标志组变量定义

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

EventBits_t 实际上是一个 16 位或 32 位无符号的数据类型
注意:一个事件组最多可以存储 24 个事件标志!

3 事件标志组与队列、信号量的比较

在这里插入图片描述

4 事件标志组API函数

在这里插入图片描述
1)创建事件标志位
EventGroupHandle_t xEventGroupCreate ( void )
返回值:NULL 失败
其他 成功返回句柄
2)清零时间标志位
EventBits_t xEventGroupClearBits( EventGroupHandle_t xEventGroup,
const EventBits_t uxBitsToClear )
形参: xEventGroup 事件标志组
uxBitsToClear 待清零的事件标志位
返回值:整数 清零事件标志位之前事件组中事件标志位的值
3)设置事件标志位
EventBits_t xEventGroupSetBits( EventGroupHandle_t xEventGroup,
const EventBits_t uxBitsToSet )
形参: xEventGroup 事件标志组
uxBitsToSet 待设置的事件标志位
返回值:整数 函数返回时,事件标志位值
4)等待事件标志位
EventBits_t xEventGroupWaitBits( EventGroupHandle_t xEventGroup,
const EventBits_t uxBitsToWaitFor,
const BaseType_t xClearOnExit,
const BaseType_t xWaitForAllBits,
TickType_t xTicksToWait )
形参: xEventGroup 事件标志组句柄
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)
在这里插入图片描述 在这里插入图片描述

5事件标志组实战在这里插入图片描述

5.1freertos_demo.c


#include "freertos_demo.h"
#include "./BSP/LCD/lcd.h"
#include "./BSP/KEY/key.h"
/*FreeRTOS*********************************************************************************************/
#include "FreeRTOS.h"
#include "task.h"
#include "event_groups.h"/******************************************************************************************************/
/*FreeRTOS配置*//* START_TASK 任务 配置* 包括: 任务句柄 任务优先级 堆栈大小 创建任务*/
#define START_TASK_PRIO 1                   /* 任务优先级 */
#define START_STK_SIZE  128                 /* 任务堆栈大小 */
TaskHandle_t            StartTask_Handler;  /* 任务句柄 */
void start_task(void *pvParameters);        /* 任务函数 *///1.FreeRTOS配置
//1.1 START_TASK 任务 配置
//包括: 任务句柄 任务优先级 堆栈大小 创建任务#define START_TASK_PRIO 1                   /* 任务优先级 */
#define START_STK_SIZE  128                 /* 任务堆栈大小 */
TaskHandle_t            StartTask_Handler;  /* 任务句柄 */
void start_task(void *pvParameters);        /* 任务函数 *///1.2 TASK1 任务 配置
//包括: 任务句柄 任务优先级 堆栈大小 创建任务#define TASK1_PRIO      2                   /* 任务优先级 */
#define TASK1_STK_SIZE  128                 /* 任务堆栈大小 */
TaskHandle_t            Task1Task_Handler;  /* 任务句柄 */
void task1(void *pvParameters);             /* 任务函数 *///1.3 TASK2 任务 配置
//包括: 任务句柄 任务优先级 堆栈大小 创建任务#define TASK2_PRIO      4                   /* 任务优先级 */
#define TASK2_STK_SIZE  128                 /* 任务堆栈大小 */
TaskHandle_t            Task2Task_Handler;  /* 任务句柄 */
void task2(void *pvParameters);             /* 任务函数 *///1.4 TASK3 任务 配置
//包括: 任务句柄 任务优先级 堆栈大小 创建任务#define TASK3_PRIO      3                   /* 任务优先级 */
#define TASK3_STK_SIZE  128                 /* 任务堆栈大小 */
TaskHandle_t            Task3Task_Handler;  /* 任务句柄 */
void task3(void *pvParameters);             /* 任务函数 *///1.5 定义事件组句柄、将事件组位0、位1设置为1
EventGroupHandle_t   eventgroup_handle;
#define EVENTBIT_0    (1 << 0 )
#define EVENTBIT_1    (1 << 1 )//2 FreeRTOS例程入口函数
// @param       无
//@retval      无
void freertos_demo(void)
{//创建事件组eventgroup_handle = xEventGroupCreate ();if(eventgroup_handle != NULL){printf("事件标志组创建成功!!\r\n");}        xTaskCreate((TaskFunction_t )start_task,            /* 任务函数 */(const char*    )"start_task",          /* 任务名称 */(uint16_t       )START_STK_SIZE,        /* 任务堆栈大小 */(void*          )NULL,                  /* 传入给任务函数的参数 */(UBaseType_t    )START_TASK_PRIO,       /* 任务优先级 */(TaskHandle_t*  )&StartTask_Handler);   /* 任务句柄 */vTaskStartScheduler();
}//2 start_task
// @param       pvParameters : 传入参数(未用到)
//@retval      无
void start_task(void *pvParameters)
{taskENTER_CRITICAL();           /* 进入临界区 *//* 创建任务1 */xTaskCreate((TaskFunction_t )task1,(const char*    )"task1",(uint16_t       )TASK1_STK_SIZE,(void*          )NULL,(UBaseType_t    )TASK1_PRIO,(TaskHandle_t*  )&Task1Task_Handler);/* 创建任务2 */xTaskCreate((TaskFunction_t )task2,(const char*    )"task2",(uint16_t       )TASK2_STK_SIZE,(void*          )NULL,(UBaseType_t    )TASK2_PRIO,(TaskHandle_t*  )&Task2Task_Handler);vTaskDelete(StartTask_Handler); /* 删除开始任务 */taskEXIT_CRITICAL();            /* 退出临界区 */
}//3 task1,释放二值信号量
//@param       pvParameters : 传入参数(未用到)
// @retval      无
void task1(void *pvParameters)
{uint8_t key = 0;while (1){key = key_scan(0);       //扫描事件标志组if(key == KEY0_PRES){xEventGroupSetBits(eventgroup_handle,EVENTBIT_0);      //将事件标志组的bit 0位置置为1}else if(key == KEY1_PRES){xEventGroupSetBits(eventgroup_handle,EVENTBIT_1);      //将事件标志组的bit 1位置置为1}vTaskDelay(10);}
}//task2
//@param       pvParameters : 传入参数(未用到)
//@retval      无
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.mzph.cn/news/596023.shtml

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

相关文章

JDK8新特性:方法引用

静态方法引用 类名 ::静态方法。 使用场景 如果某个Lambda表达式里只是调用一个静态方法&#xff0c;并且前后参数的形式一致&#xff0c;就可以使用静态方法引用。 CompareByDate类 public class CompareByDate {public static int compareByAge(Student o1,Student o2){…

创建企业邮箱帐户指南:常见问题与解决方法分享

专业的电子邮件地址可以帮助客户识别商务人士&#xff0c;并了解公司给他们发邮件的目的。如果你从事管理、信息技术或人力资源工作&#xff0c;你可能会负责为一个企业建立一个企业邮箱帐户。了解如何为新员工和现有员工设置电子邮件帐户可以帮助您简化公司内部的沟通。 在这篇…

python中的tree

在Python中&#xff0c;常见的树的实现方式有以下几种&#xff1a; 二叉树&#xff08;Binary Tree&#xff09;&#xff1a;每个节点最多有两个子节点&#xff0c;分别称为左子节点和右子节点。它们的区别在于二叉树没有严格的限制条件&#xff0c;可以是满二叉树、完全二叉树…

关于户口本等户籍材料翻译

户籍材料&#xff0c;作为证明公民户籍与身份的关键文件&#xff0c;在每个实施户籍制度的国家中均不可或缺。它们不仅是登记、变更或注销户籍的依据&#xff0c;更是多种生活场景中不可或缺的证明。举例来说&#xff0c;一个在国外出生的孩子若想在中国落户&#xff0c;就必须…

Linux 用户以及用户权限

一、用户管理 从用户的配置文件以及配置命令的方式来了解用户管理&#xff0c;命令也是将结果写入到配置文件 用户配置文件 不建议直接修改配置文件&#xff01;&#xff01;&#xff01; 账号 /etc/passwd 内容解析root:x:0:0:root:/root:/bin/bash用户名:密码:UID:GID:账…

LN和BN

假设batch为2&#xff0c;&#xff08;2&#xff0c;3&#xff0c;256&#xff0c;256&#xff09;这样的样本 LN比较直观就是在每个独立的样本上计算均值和方差&#xff0c;然后归一化。&#xff08;2&#xff0c;3&#xff0c;256&#xff0c;256&#xff09; 归一化是将数…

小H靶场笔记:DC-4

DC-4 January 4, 2024 2:37 PM Tags: teehee提权 Owner&#xff1a;只惠摸鱼 信息收集 探测靶机ip&#xff0c;发现应该是192.168.199.134 扫一下开放端口&#xff08;22、80&#xff09;、服务、版本、漏洞 根据扫描结果&#xff0c;在80端口可能有CSRF漏洞&#xff0c;…

石头剪刀布游戏 - 华为OD统一考试

OD统一考试 分值: 100分 题解: Java / Python / C++ 题目描述 石头剪刀布游戏有 3 种出拳形状: 石头、剪刀、布。分别用字母 A,B,C 表示游戏规则: 出拳形状之间的胜负规则如下: A>B; B>C; C>A; 左边一个字母,表示相对优势形状。右边一个字母,表示相对劣势形状。…

Java里的Collections算法类

Collections算法类 Collections算法类里定义一系列用于操作集合的静态方法。 当谈到Java中的集合框架时&#xff0c;Collections 类是一个十分重要的类。它提供了一系列静态方法&#xff0c;用于操作和处理各种集合对象。 Java中的Collections类 Collections类是Java集合框架…

【SpringBoot系列】springboot中拦截器Interceptor使用

🤵‍♂️ 个人主页:@香菜的个人主页,加 ischongxin ,备注csdn ✍🏻作者简介:csdn 认证博客专家,游戏开发领域优质创作者,华为云享专家,2021年度华为云年度十佳博主 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞👍🏻 收…

vue项目中axios拦截器配置及不同接口对应不同后端接口域名配置

vue项目中axios拦截器配置及不同接口对应不同后端接口域名配置 一、axios基础配置二、不同接口对应不同后端接口域名配置 一、axios基础配置 import axios from axios import store from /store import { Message } from element-ui //创建axios实例 const service axios.cre…

使用 express 实现反向代理,解决跨域问题

反向代理是对服务器的代理&#xff0c;可以使用 express 实现反向代理&#xff0c;很简单&#xff0c;具体代码请参考 彻底理解前端安全面试题&#xff08;3&#xff09;—— CORS跨域资源共享&#xff0c;解决跨域问题&#xff0c;建议收藏&#xff08;含源码&#xff09;-CS…

AI:108-基于深度学习的通信干扰抑制技术研究

🚀点击这里跳转到本专栏,可查阅专栏顶置最新的指南宝典~ 🎉🎊🎉 你的技术旅程将在这里启航! 从基础到实践,深入学习。无论你是初学者还是经验丰富的老手,对于本专栏案例和项目实践都有参考学习意义。 ✨✨✨ 每一个案例都附带有在本地跑过的关键代码,详细讲解供…

企语iFair 协同管理系统 任意文件读取漏洞复现(CVE-2023-47473)

0x01 产品简介 企语iFair协同管理系统是一款专业的协同办公软件,该管理系统兼容性强,适合多种企业类型。该软件永久免费,绿色安全,无需收取费用即可使用所有功能。企语iFair协同管理系统同时兼容了Linux、Windows两种操作系统 0x02 漏洞概述 企语iFair协同管理系统getup…

AE (4)_ 直方图调整的理论

#灵感# 在短暂的高通平台调试中&#xff0c;很看重直方图调整的理解。后来其它平台&#xff0c;不怎么调整这个了。但还是记录一下。 我个人还是倾向 招式简单&#xff0c;但应用到极致。 绝大部分内容来自&#xff1a;刘斯宁&#xff0c;Image Enhancement - CLAHE - 知乎 (z…

Mybatis源码基本原理--XML版

文章目录 mybatis是什么架构设计首先建立起Mapper的代理工程和代理映射器的注册和使用XML文件解析数据源解析、创建和使用SQL执行器&#xff08;Executor&#xff09;的定义与实现SQL解析参数处理器&#xff1a;策略模式实现封装处理结果注解 mybatis 是什么 MyBatis 是一款优…

SecOC中新鲜度值和MAC都按照完整的值来生成,但是在发送和认证的时候只会截取一部分。这边截取的部分一般取多长?由什么参数设定?

新鲜度值(Freshness Value, FV)和消息验证码(Message Authentication Code, MAC)是SecOC协议中用于保证数据的真实性和新鲜度的重要信息。它们的长度取决于不同的因素,如加密算法、安全级别、通信带宽等。 一般来说,FV和MAC的长度越长,安全性越高,但也会占用更多的通信…

IDEA 每次新建工程都要重新配置 Maven的解决方案

文章目录 IDEA 每次新建工程都要重新配置 Maven 解决方案一、选择 File -> New Projects Setup -> Settingsfor New Projects…二、选择 Build,Execution,Deployment -> Build Tools -> Maven IDEA 每次新建工程都要重新配置 Maven 解决方案 DEA 每次新建工程都要…

用大模型读取你的想法,并转化成文本!恐怖的DeWave模型

悉尼科技大学的科研人员&#xff0c;通过大语言模型、EEG&#xff08;大脑活动检测工具&#xff09;、脑机接口等技术&#xff0c;开发了一个可自动读取人类想法&#xff0c;并转化成文本的AI大模型——DeWave。 DeWave的使用方法非常简单&#xff0c;用户只需要戴上EEG&#…

vivo 互联网技术 2023 年度盘点

在龙年到来之际&#xff0c;vivo互联网技术2023年货如约而至&#xff0c;让我们一起盘点下vivo互联网技术在过去一年的成长与收获吧。 01 年度技术文章 2023年&#xff0c;vivo 互联网技术公众号共推送技术干货文章 70&#xff0c;我们根据文章阅读量等指标&#xff0c;精选出…