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。不可在中断中调用。
uint32_t osThreadFlagsWait (uint32_t flags, uint32_t options, uint32_t timeout)
当前线程等待相应标志位,默认情况下,该函数返回时,会将相应的等待标志位清零,其他位保持不变。不可在中断中调用。
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 }