17_FreeRTOS事件标志组

news2025/2/27 12:58:39

目录

事件标志组

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

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

实验源码


事件标志组

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

事件标志组是一组事件标志位的集合,可以简单的理解事件标志组,就是一个整数。

事件标志组的特点:

它的每一个位表示一个事件(高8位不算)

每一位事件的含义,由用户自己决定,如: bit0表示按键是否按下, bit1表示是否接受到消息.

这些位的值为1:表示事件发生了;值为0:表示事件未发生

任意任务或中断都可以读写这些位

可以等待某一位成立,或者等待多位同时成立

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

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

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

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

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

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

EventGroupHandle_t  xEventGroupCreate (void);

清除事件标志位API函数

EventBits_t xEventGroupClearBits( 
EventGroupHandle_t xEventGroup,
const EventBits_tuxBitsToClear)

设置事件标志位API函数

EventBits_t xEventGroupSetBits( 
EventGroupHandle_t xEventGroup,
const EventBits_t uxBitsToSet)

等待事件标志位API函数

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

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

同步函数

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

 例子:

Task1:做饭

Task2:做菜

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

特点:同步!

实验源码

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

start_task:用来创建task1和task2任务,并创建事件标志组

task1:读取按键按下键值,根据不同键值将事件标志组相应事件位置一,模拟事件发生

task2:同时等待事件标志组中的多个事件位,当这些事件位都置1的话就执行相应的处理

/**
  ******************************************************************************
  * @file           : user_mian.h
  * @brief          : V1.00
  ******************************************************************************
  * @attention
  *
  ******************************************************************************
  */

/* Include 包含---------------------------------------------------------------*/
#include "stm32f10x.h"
#include <stdbool.h>
#include "user_gpio.h"
#include "user_delay.h"
#include "user_rcc_config.h"
#include "user_uart.h"
#include "FreeRTOS.h"
#include "task.h"
#include "semphr.h"
#include "user_key.h"
#include "queue.h"
#include "event_groups.h"
/* Typedef 类型----------------------------------------------------------------*/
/* Define  定义----------------------------------------------------------------*/
/* Macro   宏------------------------------------------------------------------*/
/*事件标志组句柄*/
EventGroupHandle_t eventgroup_handle;
/* Variables 变量--------------------------------------------------------------*/ 
/* Constants 常量--------------------------------------------------------------*/
/* Function  函数--------------------------------------------------------------*/

//任务优先级
#define START_TASK_PRIO		1
//任务堆栈大小	
#define START_STK_SIZE 		128  
//任务句柄
TaskHandle_t StartTask_Handler;
//任务函数
void start_task(void *pvParameters);


//任务优先级
#define TASK1_PRIO			4
//任务堆栈大小	
#define TASK1_STK_SIZE 		100  
//任务句柄
TaskHandle_t TASK1_Handler;
//任务函数
void task1(void *pvParameters);


//任务优先级
#define TASK2_PRIO			3
//任务堆栈大小	
#define TASK2_STK_SIZE 		100  
//任务句柄
TaskHandle_t TASK2_Handler;
//任务函数
void task2(void *pvParameters);


 int main(void)
 {	

	/*配置系统中断分组为4位抢占*/
	 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
	 /*延时函数初始化*/
	 delay_init();
	/*RCC配置*/
	 Rcc_config();
	/*GPIO初始化*/ 
	 Gpio_Init();
	/*USART1初始化*/
	 Uart1_Init(9600);
	 /*创建开始任务*/
    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();          //开启任务调度
		

}
 

/*!
	\brief		开始任务函数
	\param[in]	传递形参,创建任务时用户自己传入
	\param[out]	none
	\retval 	none
*/
void start_task(void *pvParameters)
{
	
    taskENTER_CRITICAL();           //进入临界区
	/*创建事件标志组*/
	eventgroup_handle = xEventGroupCreate();
	
	if(eventgroup_handle != NULL)
	{
		printf("创建事件标志组成功\r\n\r\n");
	}
	
    //创建高优先级任务
    xTaskCreate((TaskFunction_t )task1,     	
                (const char*    )"task1",   	
                (uint16_t       )TASK1_STK_SIZE, 
                (void*          )NULL,				
                (UBaseType_t    )TASK1_PRIO,	
                (TaskHandle_t*  )&TASK1_Handler);   
    //创建中优先级任务
    xTaskCreate((TaskFunction_t )task2,     
                (const char*    )"task2",   
                (uint16_t       )TASK2_STK_SIZE, 
                (void*          )NULL,
                (UBaseType_t    )TASK2_PRIO,
                (TaskHandle_t*  )&TASK2_Handler); 

				
    vTaskDelete(StartTask_Handler); //删除开始任务
    taskEXIT_CRITICAL();            //退出临界区
}


/*!
	\brief		任务1模拟事件发生
	\param[in]	传递形参,创建任务时用户自己传入
	\param[out]	none
	\retval 	none
*/
void task1(void *pvParameters)
{
	uint8_t key = 0;
    while(1)
    {	
		key = Key_Scan(0);
		if(key == KEY0_PRES)
		{
			/*设置事件组,BIT0置一*/
			xEventGroupSetBits(eventgroup_handle,0x01);
			
		}else if(key == KEY1_PRES)
		{
			/*设置事件组,BIT1置一*/
			xEventGroupSetBits(eventgroup_handle,0x02);
		}
	
		
		vTaskDelay(10);
    }
} 


/*!
	\brief		任务2处理事件 
	\param[in]	传递形参,创建任务时用户自己传入
	\param[out]	none
	\retval 	none
*/
void task2(void *pvParameters)
{
	
	EventBits_t event_bit = 0;
	
    while(1)
    {		
		event_bit = xEventGroupWaitBits(eventgroup_handle,		/*事件标志组句柄*/
										0x01|0x02,				/*等待事件标志组的BIT0BIT1*/
										pdTRUE,					/*成功等待到事件后,清除事件标志组中的BIT0BIT1*/
										pdTRUE,					/*同时满足才成立*/
										portMAX_DELAY);			/*死等*/
		
		printf("等待到的事件标志位值为:%#x\r\n\r\n",event_bit);
    }
}





 /************************************************************** END OF FILE ****/

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

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

相关文章

如何效率搭建企业流程系统?试试低代码平台吧

编者按&#xff1a;本文介绍了一款可私有化部署的低代码平台&#xff0c;可用于搭建团队流程管理体系&#xff0c;并详细介绍了该平台可实现的流程管理功能。关键词:可视化设计&#xff0c;集成能力&#xff0c;流程审批&#xff0c;流程调试天翎是国内最早从事快速开发平台研发…

Vscode创建vue项目的详细步骤

目录 一、概述 操作的前提 二、操作步骤 一、概述 后端人员想在IDEA里面创建一个Vue的项目&#xff0c;但是这非常麻烦&#xff0c;用vscode这个前端专用软件创建就会非常快速。 操作的前提 1.安装vscode软件的步骤&#xff1a;vscode下载和安装教程和配置中文插件&#…

分析JEP 290机制的Java实现

简介 https://openjdk.org/jeps/290 Filter Incoming Serialization Data过滤传入的序列化数据 JEP290是Java官方提供的一套来防御反序列化的机制&#xff0c;其核心在于提供了一个ObjectInputFilter接口&#xff0c;通过设置filter对象&#xff0c;然后在反序列化&#xff…

springcloud+vue实现图书管理系统

一、前言&#xff1a; 今天我们来分享一下一个简单的图书管理系统 我们知道图书馆系统可以有两个系统&#xff0c;一个是管理员管理图书的系统&#xff0c;管理员可以&#xff08;1&#xff09;查找某一本图书情况、&#xff08;2&#xff09;增加新的图书、&#xff08;3&…

Python+Selenium4三大等待预期条件_web自动化(4)

目录 0. 上节回顾 1. 定位失败的原因 2. 强制等待 3. 隐式等待 4. 显式等待 【重点难点】 4.1. 实例化 WebDriverWait 对象 4.2. 指定等待条件 4.3. 等待条件的具体要求 4.3. 1. 等待条件是一个函数 4.3. 2. 返回值是布尔值 4.3. 3. 只有一个参数&#xff0c;参数值…

查询服务器tns文件路径,oracle数据库tns配置方法详解

查询服务器tns文件路径,oracle数据库tns配置方法详解 TNS简要介绍与应用 Oracle中TNS的完整定义&#xff1a;transparence Network Substrate透明网络底层&#xff0c; 监听服务是它重要的一部分&#xff0c;不是全部&#xff0c;不要把TNS当作只是监听器。 TNS是Oracle Net…

scrum敏捷开发实践—leangoo任务看板

任务板展现了我们在Sprint过程中所有要完成的任务。在Sprint过程中我们要不断的更新它。–如果某个开发人员想到了一个任务他就可以把这个任务写下来放在任务墙上。无论每日站会过程中或者之后&#xff0c;如果估计发生了变化&#xff0c;任务会根据变化在任务墙上做相应的调整…

云业务成本的组成与管理趋势

在过去几年里&#xff0c;社会经济环境对云服务的采用产生了巨大的影响。如今&#xff0c;全球各规模公司都在加速数字化转型&#xff0c;包括转向基于云的应用程序&#xff0c;以支持远程工作人员&#xff0c;同时迅速推出新的云服务来更好地留住客户。在诸多经济环境不稳定因…

linux部署zookeeper

linux部署zookeeper 1、单机部署zk ZooKeeper服务器是用Java创建的&#xff0c;它需要在JVM上运行&#xff0c;所以需要使用JDK1.6及以上版本&#xff0c;一般都是jdk1.8。 选择自己安装本地的jdk&#xff0c;而不是centos自带的openjdk。 查看本地安装的jdk&#xff1a; j…

vue中go.js的使用教学(四:模型及模板)

目录 一、使用代码构建图表 二、使用模型和模板 a、创建基础图表 b、定义模板&#xff08;将节点模板定义为我们上面所做的特定节点构造的泛化&#xff09; 三、使用数据绑定参数化节点 a、使用数据绑定参数化节点 扩展&#xff1a;修改模型 一、使用代码构建图表 场景&…

Goreplay使用教程0221

1、简介Goreplay 是用 Golang 写的一个HTTP 实时流量复制工具。功能更强大&#xff0c;支持流量的放大、缩小&#xff0c;频率限制&#xff0c;还支持把请求记录到文件&#xff0c;方便回放和分析&#xff0c;也支持和 ElasticSearch 集成&#xff0c;将流量存入 ES 进行实时分…

2023 Softing在线培训计划

通过以实践为导向的培训课程提高能力 小型和模块化的培训研讨会&#xff0c;是一种以实践为导向的用户研讨会&#xff0c;并结合了深厚的理论知识。通过Softing的初级和高级研讨会&#xff0c;我们将帮助您应对日常挑战。我们还为初学者和高级用户提供了有关车辆诊断和通信工具…

一维,二维差分の详解(简单易懂)

一,差分定义差分,就是前缀和的逆运算。二,具体过程1.一维差分例题构造差分数组首先给定一个原数组a&#xff1a;a[1], a[2], a[3],,,,,, a[n];然后我们构造一个数组b &#xff1a; b[1], b[2], b[3],,,,,, b[i];使得 a[i] b[1] b[2] b[3] ,,,,,, b[i]也就是说&#xff0c;…

数据挖掘,计算机网络、操作系统刷题笔记52

数据挖掘&#xff0c;计算机网络、操作系统刷题笔记52 2022找工作是学历、能力和运气的超强结合体&#xff0c;遇到寒冬&#xff0c;大厂不招人&#xff0c;可能很多算法学生都得去找开发&#xff0c;测开 测开的话&#xff0c;你就得学数据库&#xff0c;sql&#xff0c;orac…

【Linux】vim的使用及常用快捷键(不会使用vim?有这篇文章就够了)

&#x1f525;&#x1f525; 欢迎来到小林的博客&#xff01;&#xff01;       &#x1f6f0;️博客主页&#xff1a;✈️小林爱敲代码       &#x1f6f0;️欢迎关注&#xff1a;&#x1f44d;点赞&#x1f64c;收藏✍️留言 目录&#x1f496;vim的基本概念vi…

C语言——动态内存管理

目录0. 思维导图&#xff1a;1. 为什么存在动态内存分配2. 动态内存函数介绍2.1 malloc和free2.2 calloc2.3 realloc3. 常见的动态内存错误3.1 对NULL指针的解引用操作3.2 对动态内存开辟的空间越界访问3.3 对非动态开辟内存使用free释放3.4 使用free释放一块动态开辟内存的一部…

读书笔记//来自公众号(2)

非常喜欢阅读同行的文章&#xff0c;彷佛进行一场隔空交流。大家都是数据分析师&#xff0c;有许多共鸣&#xff1b;了解数据分析在不同行业的应用&#xff0c;往往很有收获。 这位朋友在零售行业、工业物联网、汽车互联网、2G电商等做个数据分析&#xff0c;有10多工作经验。…

【STC8A8K64D4开发板】——搭建开发环境

第1-2讲&#xff1a;搭建开发环境 需要安装的工具软件 表1&#xff1a;需要的工具软件 序号 软件工具 说明 1 Keil C51 9.52安装文件 Keil C51集成开发环境。 2 ch341ser驱动 USB最新驱动可到沁恒官网下载&#xff1a;www.wch.cn/downloads/CH341SER_EXE.html 3 st…

JVM运行时数据区

在上篇文章中我们详细介绍了JVM类加载子系统&#xff1a;https://blog.csdn.net/u011837804/article/details/129049418&#xff0c;Class文件被类加载子系统加载后就进入到了运行时数据区等待执行引擎执行&#xff0c;运行时数据区也是JVM中最重要的一部分&#xff0c;GC、OOM…

基于springboot+mybatis+mysql+vue运动会报名管理系统

基于springbootmybatismysqlvue运动会报名管理系统一、系统介绍二、功能展示1.用户登陆2.报名详情(运行员)3.比赛报名&#xff08;运动员&#xff09;4.个人参赛项目&#xff08;运动员&#xff09;5.加油稿展示&#xff08;运动员&#xff09;6.学院积分排名&#xff08;运动员…