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 }