事件标志组
事件标志组讲可以用一个例子来理解,“拼车”,一辆车上有32个座位(一个事件标志组的长度)
,前8个座位用来存放车辆信息,车上可以坐24个人。我们可以选择当所有人都坐满再发车,也可以选择只坐一个人就开车,通过使用下边这个函数来等待乘客(即不同的事件是否发生)。
EventBits_t uxBits = xEventGroupWaitBits(
xEventGroup, // 事件标志组句柄
bits_to_wait_for, // 等待的位掩码(BIT_0 和 BIT_1)
pdTRUE, // 当事件位被置位后清除
pdTRUE, // 等待所有事件位
portMAX_DELAY // 无限期等待
);
参数解释:
-
xEventGroup
:- 事件标志组的句柄,类型为
EventGroupHandle_t
。 - 它是由函数
xEventGroupCreate()
创建的事件标志组对象,多个任务可以通过此句柄访问该事件组。
- 事件标志组的句柄,类型为
-
uxBitsToWaitFor
:- 任务希望等待的事件位(即感兴趣的事件位)。它是一个位掩码(bitmask),指定任务等待的事件位,类型为
EventBits_t
。 - 例如,
0x01
表示等待第 0 位,0x03
表示等待第 0 和第 1 位。
- 任务希望等待的事件位(即感兴趣的事件位)。它是一个位掩码(bitmask),指定任务等待的事件位,类型为
-
xClearOnExit
:- 如果设置为
pdTRUE
,在任务成功检测到事件位被置位后,函数返回时会自动清除那些被置位的位。 - 如果设置为
pdFALSE
,事件位在函数返回时不会被清除。 - 这个参数的作用是决定任务是否在检测到事件后,自动清除这些事件,方便用于一些一次性事件的处理场景。
- 如果设置为
-
xWaitForAllBits
:- 如果设置为
pdTRUE
,表示任务希望等待所有指定的事件位都被置位(即与uxBitsToWaitFor
位掩码匹配的所有位都为 1)。 - 如果设置为
pdFALSE
,只要有任何一个指定的事件位被置位,任务就会继续执行。 - 这个参数决定了任务是等待所有位还是部分位。
- 如果设置为
-
xTicksToWait
:- 指定任务等待事件位被置位的最大时间,单位是系统时钟节拍(ticks),类型为
TickType_t
。 - 如果设置为
portMAX_DELAY
,表示任务无限期等待,直到事件位满足条件。 - 如果等待时间到期,但指定的事件位仍未满足条件,任务将停止等待并继续执行。
- 指定任务等待事件位被置位的最大时间,单位是系统时钟节拍(ticks),类型为
每个乘客上车时都要出示车票即
EventBits_t xEventGroupSetBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet )
这个函数包括乘客要乘坐的车次
和座位号
,乘客上车之后对应的座位就变为1,代表该座位已有人。司机师傅可以通过
xEventGroupGetBits( xEventGroup )
xEventGroupGetBits函数来判断哪些座位已经有乘客了。
好的,现在司机师傅已经清点好了人数,要出发了,出发即清零(出发所有的 乘客就下车,这样好理解一些),清零有两种方式。第一种清点完人数清零(出发代表的是将标志组所有位置零),方便下一次上车,上的是同一辆车,同一个时间标志组
,使用这个函数来清零
xEventGroupClearBits((EventGroupHandle_t) EventGroupHandler, ( EventBits_t) EVENTBIT_ALL);
第二种是乘客上来之后司机不清点直接出发(即在xEventGroupWaitBits这个函数中自动清零,第三个参数改为pdTRUE)