天天看点

RTX笔记4 - 线程标志组 thread flags

  线程标志组是在线程创建的时候,一起创建的一种专用事件标志组,包含在线程控制块内。线程标志组可以用于线程同步,而不需要花费额外的资源。

  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 }      

继续阅读