一、前言
事件标志组是独自存在的,线程标志组只是线程的一部分。事件标志组的使用方法与线程标志组的使用方法一样,学会使用线程标志组就等于学会使用事件标志组,反之亦然。当线程退出之后,其线程标志组就会消失。创建线程就等于创建了一个线程标志组,它们是一块的。事件标志组需要单独创建,所以事件标志组需要额外占用内存池的内存。那为什么需要事件标志组?全部用线程标志组不就好了吗?
通过一个事件标志组,一个线程可以同步多个线程。1个事件标志组里有32个事件位,每1个事件位同步1个线程的话,那么1个事件标志组最大能同步32个线程。线程标志组只能用于同步本线程,例如线程A通过线程B的线程标志组,只能同步线程B了,不能用于同步线程C。总的来说,事件标志组的使用比较灵活。
事件标志组与线程标志组都能实现逻辑与,还有逻辑或同步线程。
STM32工程:
链接:https://pan.baidu.com/s/114jsUS5R_NEw8WjD3Lazug
提取码:yxvq
二、实验目的
长按按钮KEY0 或 长按KEY1(逻辑或
),线程LED通过事件标志组A同步线程A,printf一些信息。
三、API
3.1、osEventFlagsWait
/* 使用举例1 */
void thread_A_App(void *argument)
{
osStatus_t os_Status;
while(1)
{
os_Status = osEventFlagsWait(event_Flags1_ID, /* 事件标志组ID */
0x00000003U, /* 等待事件标志位0与事件标志位1 */
osFlagsWaitAny, /* 逻辑或 */
osWaitForever /* 一直等待 */
);
printf("thread A is running.\r\n");
}
}
/* 使用举例2 */
void thread_A_App(void *argument)
{
osStatus_t os_Status;
while(1)
{
os_Status = osEventFlagsWait(event_Flags1_ID, /* 事件标志组ID */
0x00000003U, /* 等待事件标志位0与事件标志位1 */
osFlagsWaitAny, /* 逻辑或 */
2000U /* 超时时间2S */
);
printf("thread A is running.\r\n");
}
}
四、代码
4.1、main.h
4.2、main.c