xref: /nrf52832-nimble/rt-thread/examples/kernel/mutex_simple.c (revision 104654410c56c573564690304ae786df310c91fc)
1 /*
2  * 程序清单:
3  */
4 #include <rtthread.h>
5 #include "tc_comm.h"
6 
7 /* 指向线程控制块的指针 */
8 static rt_thread_t tid1 = RT_NULL;
9 static rt_thread_t tid2 = RT_NULL;
10 static rt_thread_t tid3 = RT_NULL;
11 static rt_mutex_t mutex = RT_NULL;
12 
13 /* 线程1入口 */
thread1_entry(void * parameter)14 static void thread1_entry(void* parameter)
15 {
16     /* 先让低优先级线程运行 */
17     rt_thread_delay(10);
18 
19     /* 此时thread3持有mutex,并且thread2等待持有mutex */
20 
21     /* 检查thread2与thread3的优先级情况 */
22     if (tid2->current_priority != tid3->current_priority)
23     {
24         /* 优先级不相同,测试失败 */
25         tc_stat(TC_STAT_END | TC_STAT_FAILED);
26         return;
27     }
28 }
29 
30 /* 线程2入口 */
thread2_entry(void * parameter)31 static void thread2_entry(void* parameter)
32 {
33     rt_err_t result;
34 
35     /* 先让低优先级线程运行 */
36     rt_thread_delay(5);
37 
38     while (1)
39     {
40         /*
41          * 试图持有互斥锁,此时thread3持有,应把thread3的优先级提升到thread2相同
42          * 的优先级
43          */
44         result = rt_mutex_take(mutex, RT_WAITING_FOREVER);
45 
46         if (result == RT_EOK)
47         {
48             /* 释放互斥锁 */
49             rt_mutex_release(mutex);
50         }
51     }
52 }
53 
54 /* 线程3入口 */
thread3_entry(void * parameter)55 static void thread3_entry(void* parameter)
56 {
57     rt_tick_t tick;
58     rt_err_t result;
59 
60     while (1)
61     {
62         result = rt_mutex_take(mutex, RT_WAITING_FOREVER);
63         if (result != RT_EOK)
64         {
65             tc_stat(TC_STAT_END | TC_STAT_FAILED);
66         }
67         result = rt_mutex_take(mutex, RT_WAITING_FOREVER);
68         if (result != RT_EOK)
69         {
70             tc_stat(TC_STAT_END | TC_STAT_FAILED);
71         }
72 
73         /* 做一个长时间的循环,总共50个OS Tick */
74         tick = rt_tick_get();
75         while (rt_tick_get() - tick < 50) ;
76 
77         rt_mutex_release(mutex);
78         rt_mutex_release(mutex);
79     }
80 }
81 
mutex_simple_init()82 int mutex_simple_init()
83 {
84     /* 创建互斥锁 */
85     mutex = rt_mutex_create("mutex", RT_IPC_FLAG_FIFO);
86     if (mutex == RT_NULL)
87     {
88         tc_stat(TC_STAT_END | TC_STAT_FAILED);
89         return 0;
90     }
91 
92     /* 创建线程1 */
93     tid1 = rt_thread_create("t1",
94                             thread1_entry, RT_NULL, /* 线程入口是thread1_entry, 入口参数是RT_NULL */
95                             THREAD_STACK_SIZE, THREAD_PRIORITY - 1, THREAD_TIMESLICE);
96     if (tid1 != RT_NULL)
97         rt_thread_startup(tid1);
98     else
99         tc_stat(TC_STAT_END | TC_STAT_FAILED);
100 
101     /* 创建线程2 */
102     tid2 = rt_thread_create("t2",
103                             thread2_entry, RT_NULL, /* 线程入口是thread2_entry, 入口参数是RT_NULL */
104                             THREAD_STACK_SIZE, THREAD_PRIORITY, THREAD_TIMESLICE);
105     if (tid2 != RT_NULL)
106         rt_thread_startup(tid2);
107     else
108         tc_stat(TC_STAT_END | TC_STAT_FAILED);
109 
110     /* 创建线程3 */
111     tid3 = rt_thread_create("t3",
112                             thread3_entry, RT_NULL, /* 线程入口是thread3_entry, 入口参数是RT_NULL */
113                             THREAD_STACK_SIZE, THREAD_PRIORITY + 1, THREAD_TIMESLICE);
114     if (tid3 != RT_NULL)
115         rt_thread_startup(tid3);
116     else
117         tc_stat(TC_STAT_END | TC_STAT_FAILED);
118 
119     return 0;
120 }
121 
122 #ifdef RT_USING_TC
_tc_cleanup()123 static void _tc_cleanup()
124 {
125     /* 调度器上锁,上锁后,将不再切换到其他线程,仅响应中断 */
126     rt_enter_critical();
127 
128     /* 删除线程 */
129     if (tid1 != RT_NULL && tid1->stat != RT_THREAD_CLOSE)
130         rt_thread_delete(tid1);
131     if (tid2 != RT_NULL && tid2->stat != RT_THREAD_CLOSE)
132         rt_thread_delete(tid2);
133     if (tid3 != RT_NULL && tid3->stat != RT_THREAD_CLOSE)
134         rt_thread_delete(tid3);
135 
136     if (mutex != RT_NULL)
137     {
138         rt_mutex_delete(mutex);
139     }
140 
141     /* 调度器解锁 */
142     rt_exit_critical();
143 
144     /* 设置TestCase状态 */
145     tc_done(TC_STAT_PASSED);
146 }
147 
_tc_mutex_simple()148 int _tc_mutex_simple()
149 {
150     /* 设置TestCase清理回调函数 */
151     tc_cleanup(_tc_cleanup);
152     mutex_simple_init();
153 
154     /* 返回TestCase运行的最长时间 */
155     return 100;
156 }
157 /* 输出函数命令到finsh shell中 */
158 FINSH_FUNCTION_EXPORT(_tc_mutex_simple, sime mutex example);
159 #else
160 /* 用户应用入口 */
rt_application_init()161 int rt_application_init()
162 {
163     mutex_simple_init();
164 
165     return 0;
166 }
167 #endif
168