IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> STM32MP157开发教程之FreeRTOS系统篇7:FreeRTOS 事件标志组 -> 正文阅读

[嵌入式]STM32MP157开发教程之FreeRTOS系统篇7:FreeRTOS 事件标志组

1.写在前面:

本文章为《STM32MP157开发教程之FreeRTOS操作系统篇》系列中的一篇,笔者使用的开发平台为华清远见FS-MP1A开发板(STM32MP157开发板)。stm32mp157是ARM双核,2个A7核,1个M4核,A7核上可以跑Linux操作系统,M4核上可以跑FreeRTOS、RT-Thread等实时操作系统,STM32MP157开发板所以既可以学嵌入式linux,也可以学stm32单片机。

针对FS-MP1A开发板,除了FreeRTOS操作系统篇外,还包括其他多系列教程,包括Cortex-A7开发篇、Cortex-M4开发篇、扩展板驱动移植篇、Linux应用开发篇、Linux系统移植篇、Linux驱动开发篇、硬件设计篇、人工智能机器视觉篇、Qt应用编程篇、Qt综合项目实战篇等。欢迎关注,更多stm32mp157开发教程及视频,可加技术交流Q群459754978,感谢关注。

FS-MP1A开发板详情介绍:https://item.taobao.com/item.htm?id=622457259672

2.FreeRTOS事件标志组

2.1事件标志组简介

从前几章中我们知道可以用信号量实现同步,但信号量只能实现与单个任务或中断之间的同步,当某个任务需要与多个任务或事件进行同步时,这时候我们可以使用事件标志组。

讲到事件标志组,首先要提到事件位,事件位用来表明某个事件是否发生,通常用作事件标志。比如:从中断中接收指令需要处理时将某个位(标志)置1,当处理结束以后就讲这个位(标志)置0。

一个事件组就是一组的事件位,事件组中的事件位通过位编号来访问。

2.2事件标志组函数

2.2.1 创建事件标志组

创建事件标志组的函数有两个,分别如下:

xEventGroupCreate(),此函数用于动态创建事件标志组,所需要的内存通过动态内存管理方法分配,事件标志组可用的bits数取决于宏configUSE_16_BIT_TICKS,当此宏为1时,事件标志组有8个可用位,当为0时有24个可用位。其函数原型如下:

EventGroupHandle_t xEventGroupCreate( void )

参数:无

返回值:

NULL:事件标志组创建失败。

其他值:创建成功的事件标志组句柄。

xEventGroupCreateStatic(),此函数也用于创建事件标志组,所需要的内存通过用户自行分配,其函数原型如下:

EventGroupHandle_t xEventGroupCreateStatic( StaticEventGroup_t *pxEventGroupBuffer )

参数:

pxEventGroupBuffer: 指向一个StaticEventGroup_t类型的变量,用来保存件标志组结构体。

返回值:

NULL:事件标志组创建失败。

其他值:创建成功的事件标志组句柄。

2.2.2 设置事件位

设置事件位包括置1与清零操作,FreeRTOS提供了四个函数可以设置事件标志组的事件位,分别如下:

在任务级中将指定事件位清零函数xEventGroupClearBits(),其函数原型如下:

EventBits_t xEventGroupClearBits(EventGroupHandle_t xEventGroup,

Const EventBits_t uxBitsToClear)

参数:

xEventGroup: 要操作的事件标志组句柄。

uxBitsToClear: 要清除的事件位。

返回值:

任何值: 将指定事件位清零之前的事件组值。

中断级清零函数
xEventGroupClearBitsFromISR(),此函数为xEventGroupClearBits()的中断版本,只能用于中断服务函数中,其函数原型如下:

BaseType_t xEventGroupClearBitsFromISR( EventGroupHandle_t xEventGroup,

const EventBits_t uxBitsToSet )

参数:

xEventGroup: 要操作的事件标志组句柄。

uxBitsToSet: 要清除的事件位。

返回值:

pdPASS: 事件位清零成功。

pdFAISE: 事件位清零失败。

置1函数xEventGroupSetBits(),此函数可在任务级中将指定事件位置1,其函数原型如下:

EventBits_t xEventGroupSetBits(EventGroupHandle_t xEventGroup,

Const EventBits_t uxBitsToSet)

参数:

xEventGroup: 要操作的事件标志组句柄。

uxBitsToSet: 指定要置1的事件位。

返回值:

任何值: 将指定事件位置1后的事件组值。

中断xEventGroupSetBitsFromISR(),此函数为xEventGroupSetBits()的中断版本,只能用于中断服务函数中,其函数原型如下:

BaseType_t xEventGroupSetBitsFromISR( EventGroupHandle_t xEventGroup,

const EventBits_t uxBitsToSet

BaseType_t* pxHigherPriorityTaskWoken)

参数:

xEventGroup: 要操作的事件标志组句柄。

uxBitsToSet: 指定要置1的事件位。

pxHigherPriorityTaskWoken: 标记退出此函数以后是否进行任务切换

返回值:

pdPASS: 事件位置1成功。

pdFAISE: 事件位置1失败。

2.2.3 获取事件标志组值

FreeRTOS中提供了可以查询事件标志组值的API函数,分别如下:

xEventGroupGetBits(),此函数用于任务中获取当前事件标志组的值,即各个事件位的值,此函数是个宏,其函数原型如下:

EventBits_t xEventGroupGetBits( EventGroupHandle_t xEventGroup )

参数:

xEventGroup: 要获取的事件标志组的句柄。

返回值:

任何值: 当前事件标志组的值。

xEventGroupGetBitsFromISR(),此函数用于在中断服务函数中获取当前事件标志组的值,为函数xEventGroupGetBits()的中断版本,此函数也是个宏,其函数原型如下:

BaseType_t xEventGroupGetBitsFromISR ( EventGroupHandle_t xEventGroup);

参数:

xEventGroup: 要获取的事件标志组的句柄。

返回值:

任何值: 当前事件标志组的值。

2.2.4 等待指定是事件位

当某个任务需要与多个事件进行同步时,那么它就需要等待并判断多个事件位,此时可以调用函数xEventGroupWaitBits()完成功能。调用此函数以后如果等待的事件位还没有准备好的话进入阻塞状态,直到等待的事件位准备好或者阻塞时间到达,其函数原型如下

EventBits_t xEventGroupWaitBits( EventGroupHandle_t xEventGroup,

const EventBits_t uxBitsToWaitFord,

const BaseType_t xClearOnExit,

const BaseType_t xWaitForAllBits,

const TickType_t xTicksToWait )

参数:

xEventGroup: 指定要等待的事件标志组。

uxBitsToWaitFord: 指定要等待的事件位。

xClearOnExit: 此参数要是为pdTRUE的话,那么在退出此函数之前由参数

uxBitsToWaitFor所设置的这些事件位就会清零。如果设置位pdFALSE

的话这些事件位就不会改变。

xWaitForAllBits: 此参数如果设置为 pdTRUE 的话,当 uxBitsToWaitFord 所设置的

这些事件位都置 1,或者指定的阻塞时间到的时候函数

xEventGroupWaitBits()才会返回。当此函数为 pdFALSE 的话,只要

uxBitsToWaitFor 所设置的这些事件位其中的任意一个置1,或者指

定 的 阻 塞 时 间到 的 话 函 数xEventGroupWaitBits()就会返回。

返回值:

任何值: 返回当所等待的事件位置 1 以后的事件标志组的值,或者阻塞时间到。根

据这个值我们就知道哪些事件位置 1 了。如果函数因为阻塞时间到而返回的

话这个返回值就不代表任何的含义。

2.3操作实验

2.3.1实验设计

本次设计通过检测三个按键状态,设置事件组中不同事件位,当全设置1之后,所有事件位清零,翻转LED电平。

可参考12.3.2章节进行导入已有工程,工程存放路径【华清远见-FS-MP1A开发资料\02-程序源码\ARM体系结构与接口技术\FreeRTOS\5_MP1A-FreeRTOS-EVENT】

任务及其功能如下:

StartTask02(): 等待事件组的所有事件位,若不全为1,则进入阻塞状态,当全设置为1时,通过翻转LED1电平表示。

StartDefaultTask(): 检测按键状态,当不同按键按下时,设置事件组对应事件位。

2.3.2实验过程与分析

首先,根据之前几章内容配置好CubeMX,按照上一节配置“FREERTOS”,完成后生成代码。 在StartDefaultTask() 与StartTask02()中添加代码如下。

另外,首先在主函数中调用xEventGroupCreate()函数创建事件标志组,获得事件标志组句柄。

当KEY1、KEY2、KEY3分别按下时,调用xEventGroupSetBits()函数分别将事件标志组的bit0、bit1、bit2置1,函数xEventGroupWaitBits()同时等待标志组的bit0、bit1、bit2,当这三个事件位都置为1时,才会执行任务中的其他程序。另外调用函数xEventGroupGetBits()可以查询标志组EventGroupHandler的值变化,结果如下所示。

硬件平台:华清远见FS-MP1A开发板(STM32MP157)
部分开发教程下载:加QQ群459754978,群文件里有。
部分视频课程收看:https://space.bilibili.com/670826565/channel/detail?cid=145472
淘宝购买链接:https://item.taobao.com/item.htm?id=622457259672
手机淘宝分享码:复制本行文字打开手淘?T4FPXn3YYJ2?

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-08-31 15:36:26  更:2021-08-31 15:37:51 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 1:51:42-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码