xref: /nrf52832-nimble/rt-thread/examples/kernel/thread_resume.c (revision 042d53a763ad75cb1465103098bb88c245d95138)
1 /*
2  * 程序清单:唤醒线程
3  *
4  * 这个例子中将创建两个动态线程,低优先级线程将挂起自身,然后
5  * 高优先级线程将在一定时刻后唤醒低优先级线程。
6  */
7 #include <rtthread.h>
8 #include "tc_comm.h"
9 
10 /* 指向线程控制块的指针 */
11 static rt_thread_t tid1 = RT_NULL;
12 static rt_thread_t tid2 = RT_NULL;
13 /* 线程1入口 */
14 static void thread1_entry(void* parameter)
15 {
16     /* 低优先级线程1开始运行 */
17     rt_kprintf("thread1 startup%d\n");
18 
19     /* 挂起自身 */
20     rt_kprintf("suspend thread self\n");
21     rt_thread_suspend(tid1);
22     /* 主动执行线程调度 */
23     rt_schedule();
24 
25     /* 当线程1被唤醒时 */
26     rt_kprintf("thread1 resumed\n");
27 }
28 static void thread_cleanup(rt_thread_t tid)
29 {
30     if (tid == tid1)
31     {
32         tid1 = RT_NULL;
33     }
34     if (tid == tid2)
35     {
36         tid = RT_NULL;
37     }
38 }
39 
40 /* 线程2入口 */
41 static void thread2_entry(void* parameter)
42 {
43     /* 延时10个OS Tick */
44     rt_thread_delay(10);
45 
46     /* 唤醒线程1 */
47     rt_thread_resume(tid1);
48     rt_kprintf("thread2: to resume thread1\n");
49 
50     /* 延时10个OS Tick */
51     rt_thread_delay(10);
52 
53     /* 线程2自动退出 */
54 }
55 
56 int thread_resume_init()
57 {
58     /* 创建线程1 */
59     tid1 = rt_thread_create("thread",
60         thread1_entry, RT_NULL, /* 线程入口是thread1_entry, 入口参数是RT_NULL */
61         THREAD_STACK_SIZE, THREAD_PRIORITY, THREAD_TIMESLICE);
62     if (tid1 != RT_NULL)
63     {
64         tid1->cleanup = thread_cleanup;
65         rt_thread_startup(tid1);
66     }
67     else
68         tc_stat(TC_STAT_END | TC_STAT_FAILED);
69 
70     /* 创建线程2 */
71     tid2 = rt_thread_create("thread",
72         thread2_entry, RT_NULL, /* 线程入口是thread2_entry, 入口参数是RT_NULL */
73         THREAD_STACK_SIZE, THREAD_PRIORITY - 1, THREAD_TIMESLICE);
74     if (tid2 != RT_NULL)
75     {
76         tid2->cleanup = thread_cleanup;
77         rt_thread_startup(tid2);
78     }
79     else
80         tc_stat(TC_STAT_END | TC_STAT_FAILED);
81 
82     return 0;
83 }
84 
85 #ifdef RT_USING_TC
86 static void _tc_cleanup()
87 {
88     /* 调度器上锁,上锁后,将不再切换到其他线程,仅响应中断 */
89     rt_enter_critical();
90 
91     /* 删除线程 */
92     if (tid1 != RT_NULL && tid1->stat != RT_THREAD_CLOSE)
93         rt_thread_delete(tid1);
94     if (tid2 != RT_NULL && tid2->stat != RT_THREAD_CLOSE)
95         rt_thread_delete(tid2);
96 
97     /* 调度器解锁 */
98     rt_exit_critical();
99 
100     /* 设置TestCase状态 */
101     tc_done(TC_STAT_PASSED);
102 }
103 
104 int _tc_thread_resume()
105 {
106     /* 设置TestCase清理回调函数 */
107     tc_cleanup(_tc_cleanup);
108     thread_resume_init();
109 
110     /* 返回TestCase运行的最长时间 */
111     return 25;
112 }
113 /* 输出函数命令到finsh shell中 */
114 FINSH_FUNCTION_EXPORT(_tc_thread_resume, a thread resume example);
115 #else
116 /* 用户应用入口 */
117 int rt_application_init()
118 {
119     thread_resume_init();
120 
121     return 0;
122 }
123 #endif
124