线程标志组是在线程创建的时候,一起创建的一种专用事件标志组,包含在线程控制块内。线程标志组可以用于线程同步,而不需要花费额外的资源。
uint32_t osThreadFlagsSet (osThreadId_t thread_id, uint32_t flags)
设置线程thread_id的标志位flags,返回设置后的线程标志或者错误码。线程标志组的最高bit位不能设置,否则报错。可在中断中调用。
uint32_t osThreadFlagsClear (uint32_t flags)
清除当前线程的标志组 flags,返回清除前的标志位flags或者错误码。不能清除最高bit位,否则返回错误码。不可在中断中调用。
uint32_t osThreadFlagsGet (void)
获取当前线程的标志组flags。不可在中断中调用。
Option | |
---|---|
osFlagsWaitAny | Wait for any flag (default). |
osFlagsWaitAll | Wait for all flags. |
osFlagsNoClear | Do not clear flags which have been specified to wait for. |
1 static void
2 _ledThread(void *argument)
3 {
4 (void)argument;
5 uint32_t flags;
6
7 for(;;) {
8 flags = osThreadFlagsWait(0x00000001, osFlagsWaitAny, osWaitForever);
9 menuShow(&seg_led, flags, 0);
10
11 flags = osThreadFlagsWait(0x00000002, osFlagsWaitAny, osWaitForever);
12 menuShow(&seg_led, flags, 0);
13
14 flags = osThreadFlagsWait(0x0000000C, osFlagsWaitAll | osFlagsNoClear, osWaitForever);
15 flags = osThreadFlagsGet();
16 menuShow(&seg_led, flags, 0);
17 osThreadFlagsClear(0x0000000C);
18
19 flags = osThreadFlagsWait(0x00000007, osFlagsWaitAll, osWaitForever);
20 menuShow(&seg_led, flags, 0);
21 }
22 }
23
24 static void
25 _thread2(void *argument)
26 {
27 (void)argument;
28 for(;;) {
29 osThreadFlagsSet(led_thread, 0x00000001);
30 osDelay(1000);
31
32 osThreadFlagsSet(led_thread, 0x00000002);
33 osDelay(1000);
34
35 osThreadFlagsSet(led_thread, 0x0000000C);
36 osDelay(1000);
37
38 osThreadFlagsSet(led_thread, 0x00000007);
39 osDelay(1000);
40 }
41 }