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入口 */
thread1_entry(void * parameter)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 }
thread_cleanup(rt_thread_t tid)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入口 */
thread2_entry(void * parameter)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
thread_resume_init()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
_tc_cleanup()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
_tc_thread_resume()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 /* 用户应用入口 */
rt_application_init()117 int rt_application_init()
118 {
119 thread_resume_init();
120
121 return 0;
122 }
123 #endif
124