1 /* 2 * 程序清单:动态线程 3 * 4 * 这个程序会初始化2个动态线程,它们拥有共同的入口函数,但参数不相同 5 */ 6 #include <rtthread.h> 7 #include "tc_comm.h" 8 9 /* 指向线程控制块的指针 */ 10 static rt_thread_t tid1 = RT_NULL; 11 static rt_thread_t tid2 = RT_NULL; 12 /* 线程入口 */ 13 static void thread_entry(void* parameter) 14 { 15 rt_uint32_t count = 0; 16 rt_uint32_t no = (rt_uint32_t) parameter; /* 获得正确的入口参数 */ 17 18 while (1) 19 { 20 /* 打印线程计数值输出 */ 21 rt_kprintf("thread%d count: %d\n", no, count ++); 22 23 /* 休眠10个OS Tick */ 24 rt_thread_delay(10); 25 } 26 } 27 28 int thread_dynamic_simple_init() 29 { 30 /* 创建线程1 */ 31 tid1 = rt_thread_create("t1", 32 thread_entry, (void*)1, /* 线程入口是thread_entry, 入口参数是1 */ 33 THREAD_STACK_SIZE, THREAD_PRIORITY, THREAD_TIMESLICE); 34 if (tid1 != RT_NULL) 35 rt_thread_startup(tid1); 36 else 37 tc_stat(TC_STAT_END | TC_STAT_FAILED); 38 39 /* 创建线程2 */ 40 tid2 = rt_thread_create("t2", 41 thread_entry, (void*)2, /* 线程入口是thread_entry, 入口参数是2 */ 42 THREAD_STACK_SIZE, THREAD_PRIORITY, THREAD_TIMESLICE); 43 if (tid2 != RT_NULL) 44 rt_thread_startup(tid2); 45 else 46 tc_stat(TC_STAT_END | TC_STAT_FAILED); 47 48 return 0; 49 } 50 51 #ifdef RT_USING_TC 52 static void _tc_cleanup() 53 { 54 /* 调度器上锁,上锁后,将不再切换到其他线程,仅响应中断 */ 55 rt_enter_critical(); 56 57 /* 删除线程 */ 58 if (tid1 != RT_NULL && tid1->stat != RT_THREAD_CLOSE) 59 rt_thread_delete(tid1); 60 if (tid2 != RT_NULL && tid2->stat != RT_THREAD_CLOSE) 61 rt_thread_delete(tid2); 62 63 /* 调度器解锁 */ 64 rt_exit_critical(); 65 66 /* 设置TestCase状态 */ 67 tc_done(TC_STAT_PASSED); 68 } 69 70 int _tc_thread_dynamic_simple() 71 { 72 /* 设置TestCase清理回调函数 */ 73 tc_cleanup(_tc_cleanup); 74 thread_dynamic_simple_init(); 75 76 /* 返回TestCase运行的最长时间 */ 77 return 100; 78 } 79 /* 输出函数命令到finsh shell中 */ 80 FINSH_FUNCTION_EXPORT(_tc_thread_dynamic_simple, a dynamic thread example); 81 #else 82 /* 用户应用入口 */ 83 int rt_application_init() 84 { 85 thread_dynamic_simple_init(); 86 87 return 0; 88 } 89 #endif 90