xref: /nrf52832-nimble/rt-thread/examples/kernel/thread_dynamic_simple.c (revision 104654410c56c573564690304ae786df310c91fc)
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 /* 线程入口 */
thread_entry(void * parameter)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 
thread_dynamic_simple_init()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
_tc_cleanup()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 
_tc_thread_dynamic_simple()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 /* 用户应用入口 */
rt_application_init()83 int rt_application_init()
84 {
85     thread_dynamic_simple_init();
86 
87     return 0;
88 }
89 #endif
90