RTX笔记12 - 可连接线程 Joinable Threads

  CMSIS-RTOS2的一个新特性是能够创建一个“可连接的”(设置 osThreadJoinable 属性)线程A,并像标准线程一样执行。此外,也容许另外一个B线程通过 osThreadJoin() 函数加入此线程A,这将会导致加入的线程B被重新调度,并进入等待状态,直到被加入的线程A终止。如果被加入的线程已经终止,那么 osThreadJoin() 函数将立即返回osOK

  这允许创建一个临时可连接线程,该线程将从全局内存池中获取一块内存,该线程可以执行一些处理,然后终止,将内存释放回内存池。

 1 #define LED_THREADS_NBR_MAX    5
 2 
 3 osThreadId_t thread[LED_THREADS_NBR_MAX];
 4 osThreadAttr_t thread_attr;
 5 
 6 static void _startThread(void *argument);
 7 static void _ledThread(void *argument);
 8 
 9 void
10 testJoinableThreads(void)
11 {
12     osThreadNew(_startThread, NULL, NULL);
13 }
14 
15 __NO_RETURN static void
16 _startThread(void *argument)
17 {
18     uint8_t ix;
19     
20     uMemSet(&thread_attr, 0, sizeof(thread_attr));
21     thread_attr.attr_bits = osThreadJoinable;
22     
23     thread[0] = osThreadNew(_ledThread, (void *)0, &thread_attr);
24     osThreadJoin(thread[0]); /** 线程_startThread加入线程thread[0],并进入等待状态, **/
25                              /** 直到线程thread[0]终止,然后继续执行 **/
26                              /** 如果线程thread[0]已经终止,那么立即返回 **/
27     
28     thread[1] = osThreadNew(_ledThread, (void *)1, &thread_attr);
29     osThreadJoin(thread[1]); /** 线程_startThread加入线程thread[1],并进入等待状态, **/
30                              /** 直到线程thread[1]终止,然后继续执行 **/
31                              /** 如果线程thread[1]已经终止,那么立即返回 **/
32     
33     thread[2] = osThreadNew(_ledThread, (void *)2, &thread_attr);
34     osThreadJoin(thread[2]); /** 线程_startThread加入线程thread[2],并进入等待状态, **/
35                              /** 直到线程thread[2]终止,然后继续执行 **/
36                              /** 如果线程thread[2]已经终止,那么立即返回 **/
37     
38     thread[3] = osThreadNew(_ledThread, (void *)3, &thread_attr);
39     osThreadJoin(thread[3]); /** 线程_startThread加入线程thread[3],并进入等待状态, **/
40                              /** 直到线程thread[3]终止,然后继续执行 **/
41                              /** 如果线程thread[3]已经终止,那么立即返回 **/
42     
43     thread[4] = osThreadNew(_ledThread, (void *)4, &thread_attr);
44     osThreadJoin(thread[4]); /** 线程_startThread加入线程thread[4],并进入等待状态, **/
45                              /** 直到线程thread[4]终止,然后继续执行 **/
46                              /** 如果线程thread[4]已经终止,那么立即返回 **/
47     
48     menuShow(&seg_led, 5, 0);
49     osThreadExit();
50 }
51 
52 __NO_RETURN static void
53 _ledThread(void *argument)
54 {
55     uint32_t id = (uint32_t)argument;
56     
57     menuShow(&seg_led, id, 0);
58     osDelay(1000);
59     osThreadExit();
60 }

 

posted @ 2021-10-05 22:56  Ivan0512  阅读(433)  评论(0编辑  收藏  举报