FreeRTOS学习-事件标志组
转载自https://blog.csdn.net/weixin_43866583/article/details/125567314?spm=1001.2014.3001.5502
假如在项目中,有些任务或者动作需要等到某种条件成立的时候才能被执行,不成立的时候不执行,这种情况就可以考虑使用事件标志组。设定一个事件标志,在项目运行过程中监控某种条件是否成立,如果条件成立了就设置这个事件标志位,另外一个地方如果发现这个标志位有效了,就执行这个任务或者动作,完成这个同步的过程。
事件标志组的配置 & 原理
选择 8 个可用的事件标志组
1 |
|
配置宏定义 configUSE_16_BIT_TICKS 为 1 时,每创建一个事件标志组,用户可以使用的事件标志是8 个。
选择 24 个可用的事件标志组
1 |
|
配置宏定义 configUSE_16_BIT_TICKS 为 0 时,每创建一个事件标志组,用户可以使用的事件标志是24 个。
FreeRTOS的事件标志组的实现原理就是定义了一个变量,如果是 16 位变量,就仅使用了低 8bit
;如果定义了一个 32 位变量,就仅使用了低 24bit。
每一个 bit 用 0 和 1 两种状态来代表事件标志。
事件标志组的创建
1 |
|
函数描述:
函数 xEventGroupCreate 用于创建事件标志组。
返回值,如果创建成功,此函数返回事件标志组的句柄,失败会返回 NULL。
事件标志组的位设置
1 |
|
函数描述:
函数 xEventGroupSetBits 用于设置指定的事件标志位为 1。
第 1 个参数是事件标志组句柄。
第 2 个参数表示 24 个可设置的事件标志位,EventBits_t 是定义的 32 位变量,低 24 位用于事件标志设置。变量 uxBitsToSet 的低 24 位的某个位设置为 1,那么被设置的事件标志组的相应位就设置为 1。变量 uxBitsToSet 设置为 0 的位对事件标志相应位没有影响。比如设置变量 uxBitsToSet = 0x0003 就表示将事件标志的位 0 和位 1 设置为1,其余位没有变化。
返回当前的事件标志组数值。
中断中设置事件标志组
1 |
|
函数描述:
函数 xEventGroupSetBits 用于设置指定的事件标志位为 1。
第 1 个参数是事件标志组句柄。
第 2 个参数表示 24 个可设置的事件标志位,EventBits_t 是定义的 32 位变量,低 24 位用于事件标志设置。变量 uxBitsToSet 的低 24 位的某个位设置为 1,那么被设置的事件标志组的相应位就设置为 1。变量 uxBitsToSet 设置为 0 的位对事件标志相应位没有影响。比如设置变量 uxBitsToSet = 0x0003 就表示将事件标志的位 0 和位 1 设置为 1,其余位没有变化。
第3个参数用于保存是否有高优先级任务准备就绪。如果函数执行完毕后,此参数的数值pdTRUE,
说明有高优先级任务要执行,否则没有。
返回值,如果消息成功发送给 daemon 任务(就是 FreeRTOS 的定时器任务)返回 pdPASS,否则
返回 pdFAIL,另外 daemon 任务中的消息队列满了也会返回 pdFAIL。
使用前一定要保证事件标志已经通过函数 xEventGroupCreate 创建了。同时要在 FreeRTOSConfig.h
文件中使能如下三个宏定义:
1 |
|
事件标志组的位清除
1 |
|
函数描述:
xEventGroup:需要操作的事件标志组;
uxBitsToClear:要清零的事件位,比如要清楚bit2就设置为0x04。
返回值:将指定事件位清零之前的事件组值。
等待时间标志组中的指定位被设置
1 |
|
函数描述:
函数 xEventGroupWaitBits 等待事件标志被设置。
第 1 个参数是事件标志组句柄。
第 2 个参数表示等待 24 个事件标志位中的指定标志,EventBits_t 是定义的 32 位变量,低 24 位用于事件标志设置。比如设置变量 uxBitsToWaitFor = 0x0003 就表示等待事件标志的位 0 和位 1 设置为 1。此参数切不可设置为 0。
第 3 个参数选择是否清除已经被置位的事件标志,如果这个参数设置为 pdTRUE,且函数
xEventGroupWaitBits 在参数 xTicksToWait 设置的溢出时间内返回,那么相应被设置的事件标志
位会被清零。如果这个参数设置为 pdFALSE,对已经被设置的事件标志位没有影响。
第 4 个参数选择是否等待所有的标志位都被设置,如果这个参数设置为 pdTRUE,要等待第 2 个参
数 uxBitsToWaitFor 所指定的标志位全部被置 1,函数才可以返回。当然,超出了在参数
xTicksToWait 设置的溢出时间也是会返回的。如果这个参数设置为 pdFALSE,第 2 个参数
uxBitsToWaitFor 所指定的任何标志位被置 1,函数都会返回,超出溢出时间也会返回。
第 5 个参数设置等待时间,单位时钟节拍周期。如果设置为 portMAX_DELAY,表示永久等待。
返回值:由于设置的时间超时或者指定的事件标志位被置 1,导致函数退出时返回的事件标志组数值。
删除事件标志组
1 |
|
事件标志组的示例demo
代码中创建了两个任务和一个24bit可用的时间标志组,一个任务通过按键扫描设置事件标志组的值,通过按键按三下设置事件标志组的值为0x00000008,然后另外一个任务阻塞等待,直到检测到事件标志组被设置为0x00000008之后翻转LED的闪烁。
1 |
|