FreeRTOS事件标志组

目录

一、事件标志组的概念

1、事件标志位

2、事件标志组

二、事件标志组相关API

1、创建事件标志组

2、设置事件标志位

3、清除事件标志位

4、等待事件标志位

三、事件标志组实操

1、实验需求

2、CubeMX配置

3、代码实现


一、事件标志组的概念

1、事件标志位

表明某个事件是否发生,联想:全局变量flag。通常按位表示每一个位表示一个事件高8位不算

2、事件标志组

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

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

二、事件标志组相关API

    函数                                描述
xEventGroupCreate()使用动态方式创建事件标志组
xEventGroupCreateStatic()使用静态方式创建事件标志组
xEventGroupClearBits()清零事件标志位
xEventGroupClearBitsFromISR()在中断中清零事件标志位
xEventGroupSetBits()设置事件标志位
xEventGroupSetBitsFromISR()在中断中设置事件标志位
xEventGroupWaitBits()等待事件标志位

1、创建事件标志组

EventGroupHandle_t xEventGroupCreate( void );

参数:

返回值:

  • 成功,返回对应事件标志组的句柄;
  • 失败,返回 NULL 。

2、设置事件标志位

EventBits_t xEventGroupSetBits( EventGroupHandle_t xEventGroup,const EventBits_t uxBitsToSet );

参数:

  • xEventGroup:对应事件组句柄。
  • uxBitsToSet:指定要在事件组中设置的一个或多个位的按位 值。

返回值:

  • 设置之后事件组中的事件标志位值。

3、清除事件标志位

EventBits_t xEventGroupClearBits(EventGroupHandle_t xEventGroup,const EventBits_t uxBitsToClear );

参数:

  • xEventGroup:对应事件组句柄。
  • uxBitsToClear:指定要在事件组中清除的一个或多个位的按位 值。

返回值:

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

4、等待事件标志位

EventBits_t xEventGroupWaitBits(const EventGroupHandle_t xEventGroup,const EventBits_t uxBitsToWaitFor,const BaseType_t xClearOnExit,const BaseType_t xWaitForAllBits,TickType_t xTicksToWait );
参数描述
xEventGroup对应的事件标志组句柄
uxBitsToWaitFor指定事件组中要等待的一个或多个事件位的按位值
xClearOnExitpdTRUE——清除对应事件位
pdFALSE——不清除
xWaitForAllBitspdTRUE——所有等待事件位全为1(逻辑与)
pdFALSE——等待的事件位有一个为1(逻辑或)
xTicksToWait超时时间,0 表示不超时
portMAX_DELAY表示卡死等待

返回值:

  • 等待的事件标志位值:等待事件标志位成功,返回等待到的事件标志位
  • 其他值:等待事件标志位失败,返回事件组中的事件标志位

三、事件标志组实操

1、实验需求

创建一个事件标志组和两个任务( task1 和 task2),task1 检测按键,如果检测到 KEY1和KEY2 都按过,则执行 task2 。

2、CubeMX配置

这里已经将FreeRTOS移植到STM32F103C8T6,具体操作流程看前面的文章。

查看原理图配置按键引脚

创建两个优先级相同的任务

3、代码实现

uart.c 重定向printf

#include "stdio.h"
int fputc(int ch,FILE *f)
{unsigned char temp[1] = {ch};HAL_UART_Transmit(&huart1,temp,1,0xffff);return ch;
}

需要打开魔术棒勾上红框内选项实现串口打印

打开freertos.c并添加代码

/*    创建一个事件标志组    */
EventGroupHandle_t eventgroup_handle; // 事件标志组句柄
eventgroup_handle = xEventGroupCreate(); // 创建一个事件标志组void StartTask1(void const * argument)
{for(;;){if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_RESET){osDelay(20);if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_RESET){xEventGroupSetBits(eventgroup_handle, 0x01);//设置事件标志位为第1位}while (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_RESET);}if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_1) == GPIO_PIN_RESET){osDelay(20);if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_1) == GPIO_PIN_RESET){xEventGroupSetBits(eventgroup_handle, 0x02);//设置事件标志位为第2位}while (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_1) == GPIO_PIN_RESET);}osDelay(10);}
}void StartTask2(void const * argument)
{for(;;){event_bit = xEventGroupWaitBits(eventgroup_handle,0x01|0x02,pdTRUE,pdTRUE,portMAX_DELAY);printf("返回值:%#x,按键都按下,任务2可以执行了\r\n",event_bit); // %#x是带格式输出, 效果为在输出前加0x. osDelay(1);}
}

可见只有当按键1和按键2后才能执行task2,task2中的事件标志位值是设置的事件标志位都置为1后返回的值,当第1位和第2位同时为1,十六进制显示后就是0x03。

注意:上述代码中等待事件标志位函数中的第4个参数设置为pdTURE(按位与),即当设置的事件标志位都置1后(按键1和按键2都按下),才能执行task2,那么如果把第4个参数设置为pdFALSE(按位或),会出现什么现象,如下:

event_bit = xEventGroupWaitBits(eventgroup_handle,0x01|0x02,pdTRUE,pdFALSE,portMAX_DELAY);

可见当其中任何一个事件标志位置为1(任意一个按键按下),都会进入执行task2。

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

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

相关文章

【瑞萨RA6M3】1. 基于 vscode 搭建开发环境(后续)

编译 mkdir build cd build cmake .. -G"Unix Makefiles" make -j或者 cmake -Bbuild -G"Unix Makefiles" cmake --build build创建快捷指令: 删除 .vscode/tasks.json, 存储占用和生成 MAP 编译完成后,打印内存占用…

GD32F103C8T6 TQFP-48 32位嵌入式处理器 MCU单片机 微 控制器芯片

GD32F103C8T6 在工业控制领域中有着广泛的应用,下面是一些典型的例子: 1. 电机控制:GD32F103C8T6 可用于直流电机、交流电机和步进电机的控制。它可以通过 PWM、ADC 和 GPIO 等外设实现电机的速度和位置控制。 2. 过程控制:在自…

PDPS15---安装教程---附安装包

目录 第1章 文件准备 1.1 安装包列表 第2章 安装Perl 2.1 Perl安装和路径选择 第3章 安装Java 3.1 Java安装和路径选择 第4章 安装Oracle 4.1 双击Setup 第5章 数据库(Oracle)和注册表(Perl) 5.1 数据库创建 5.2 注册表修改 第6章 安装Tecnomatix 6.1 安装Tecnoma…

如何修复显示器或笔记本电脑屏幕的黄色色调?这里提供几种方法

序言 如果你的笔记本电脑屏幕呈淡黄色,则可以启用夜灯功能。该问题也可能源于连接松散的显示电缆、损坏的显卡驱动程序或错误配置的显示器设置。以下是一些故障排除步骤,你可以尝试解决此问题。 禁用夜间模式 夜间模式功能旨在减少显示器的蓝色色调,使屏幕看起来更温暖,…

在微信小程序项目中安装和使用 Vant 组件库

vant Wwapp 小程序开发组件库官网 Vant Weapp - 轻量、可靠的小程序 UI 组件库 安装 Vant 组件库 1.在微信小程序项目文件目录的空白位置右键,选择在外部终端窗口中打开 2在命令行输入如下命令(在项目中创建包管理配置文件 package.json) …

2024年高考倒计时精品网页

2024年高考倒计时精品网页 前言效果图部分代码领取源码下期更新预报 前言 随着季风轻轻掠过,岁月如梭,再次迎来了这个属于青春与梦想交汇的时刻——高考。这是一场知识的较量,更是一次意志的考验。在这最后的冲刺阶段,每一刻都显…

超级简单的地图操作工具开发可疑应急,地图画点,画线,画区域,获取地图经纬度等

使用echars的地图画点,画线,画区域,获取地图经纬度等 解压密码:10086007 地图也是用临时的bmap.js和china.js纯离线二选一 一共就这么多文件 画点,画线,画区域 点击地图获取经纬度-打印到控制台,这样就能渲染航迹,多变形,结合其他算法算圆等等操作 下载资源:https://download…

Mirror从入门到入神

Mirror从入门到成神 文章目录 Mirror从入门到成神简介NetworkClientRegisterPrefabConnect (string address)Disconnect ()activeactiveHost NetworkServerSpawn 简介 Mirror是一个unity网络同步框架,基于MonoBehaviour生命周期的回调的基础上进行数值的同步&#…

数据新探:用Python挖掘互联网的隐藏宝藏

Hello,我是你们的阿佑,今天给大家上的菜是——数据存储!听起来枯燥无味?错了!阿佑将带你重新认识数据存储的艺术。就像为珍贵的艺术品寻找完美的展览馆,为你的数据选择合适的存储方式同样重要! …

[译文] 恶意代码分析:2.LNK文件伪装成证书传播RokRAT恶意软件(含无文件攻击)

这是作者新开的一个专栏,主要翻译国外知名安全厂商的技术报告和安全技术,了解它们的前沿技术,学习它们威胁溯源和恶意代码分析的方法,希望对您有所帮助。当然,由于作者英语有限,会借助LLM进行校验和润色&am…

【MP C3003】理光打印机驱动下载使用

官方下载链接 https://support.ricoh.com/bb/html/dr_ut_e/apc/model/mpc3003/mpc3003.htm?langen

如何用Rust获取CPU、内存、硬盘的信息?

目录 一、用Rust获取CPU、内存、硬盘的信息 二、知识点 systemstat 一、用Rust获取CPU、内存、硬盘的信息 首先,需要添加systemstat库到Cargo.toml文件: [dependencies] systemstat "0.2.3" 在Rust代码中使用它: extern crat…