【STM32 FreeRTOS Cubemx学习笔记】第4篇:FreeRTOS事件组知识详解与记录
文章目录
FreeRTOS学习笔记记录 4
第六章 事件组
简述:事件组是RTOS中另一种进程间通信,其中事件组允许任务等待一个或多个事件的组合。事件组适用于多个事件触发一个或多个任务的运行,相当于广播的机制。如若不引入事件组,一个任务就只能处理一个事件,例如同时两个按键被按下需要检测那就只能拆分成两个任务设置多个信号量来处理。
6.1 事件组的原理与功能
创建事件组对象时,有一个内部变量存储事件标志,通过设置configUSE_16_BIT_TICKS实现变量位数改变,当=0时变量是32位,反之16位。其中32位事件组存储结构中,第0~23位是事件位,剩余位为保留位,当有事件发生时对应的事件位置1,可以处理24个事件。 具体运行原理这里直接贴图,对应视频链接也会放在文章末尾~~
6.2 事件组相关函数
6.2.1事件组操作函数
xEventGroupCreate():动态创建事件组(对应末尾加Static为静态)
vEventGroupDelete():删除创建的事件组
vEventGroupSetNumber():给事件组设置编号,用户自定义
uxEventGroupGetNumber():读取事件组编号
6.2.2事件位操作函数
xEventGroupSetBits():将1位或多位事件位设置为1
xEventGroupSetBitsFromISR():ISR版本
xEventGroupClearBits():清零某些事件位
xEventGroupClearBitsFromISR():ISR版本
xEventGroupGetBits():返回事件组当前值
xEventGroupGetBitsFromISR():ISR版本
6.2.3 等待事件函数
xEventGroupWaitBits( EventGroupHandle_t xEventGroup,
const EventBits_t uxBitsToWaitFor,
const BaseType_t xClearOnExit,
const BaseType_t xWaitForAllBits,
TickType_t xTicksToWait ):用于在任务里面调用,使得任务进入阻塞状态,直到事件位被置1,这里单独对这个函数的里面参数进行说明
第一个参数就是传入你在Cubemx中创建Event的句柄(Flags name)。
第二个参数就是设置你想要等待的事件组的位数对应的十六进制,例如等到第7位和第2位均被置位时则对应二进制为1000 0100—>0x84。
第三个参数通过设置pdTRUE会开启在调用该函数后清除事件位,反之则不清除(俗话说就是:完事之后是否清除位)
第四个参数设置pdTRUE代表的是需要所有事件位的触发才会使得任务退出 阻塞,设置pdFALSE代表至少有一个事件位触发就会使得任务退出阻塞。(可以通过数电中的与门,或门来理解,触发位均为1则与门输出为1,反之至少有一个为1或门输出为1)可以假设有两个按键分别对应一个事件位,当设置pdTRUE时,需要两个按键同时按下后两个事件位为1时,才可以执行任务。设置为pdFALSE时只要有一个按键按下就可以执行任务。
最后一个参数就是等待时间,可以设置为portMAX_DELAY,一直等待
xEventGroupSync():用于多任务同步,可以省去调用SetBits和WaitBits两个函数,下一小节详细展开
6.2.4 事件组实现多任务同步
事件组实现的多任务同步的原理就是利用到事件位全部置1后才执行剩余代码的原理。也就是上述小节中xEventGroupWaitBits()函数中第四个参数的原理。
xEventGroupSync(EventGroupHandle_t xEventGroup,
const EventBits_t uxBitsToSet,
const EventBits_t uxBitsToWaitFor,
TickType_t xTicksToWait)
第一个参数就是传入你在Cubemx中创建Event的句柄(Flags name)。
第二个参数是任务要置位的事件位的十六进制,例如任务1置位Bit3,则设置为0x08
第三个参数就是设置你想要等待的事件组的位数对应的十六进制,例如等到第7位和第2位均被置位时则对应二进制为1000 0100—>0x84。
第四个参数:任务在阻塞状态的节拍数
目前学习记录就是这些啦,参考的视频是:Kevin带你读《STM32Cube高效开发教程高级篇》,经验有限不足之处希望各位指正,也是想给国内学习环境做一点贡献!
接下来会等段时间在更新了,先用所学的RTOS去敲一个毕设出来,之后会把我毕设的应用的帖子发出来。
作者:Mystery2003