Skip to content

Commit 274e0f1

Browse files
committed
add more test
1 parent 05f39df commit 274e0f1

File tree

1 file changed

+171
-19
lines changed

1 file changed

+171
-19
lines changed

Diff for: examples/utest/testcases/kernel/mutex_pi_tc.c

+171-19
Original file line numberDiff line numberDiff line change
@@ -105,12 +105,19 @@ static void test_main_thread_entry(void *para)
105105
_sync_flag ++;
106106
}
107107

108-
static void test_mutex_pi_protocol(void)
108+
static void test_mutex_pi(void)
109109
{
110110
rt_thread_t t_main;
111111
rt_thread_t t[THREAD_NUM];
112112
rt_uint8_t prio[THREAD_NUM] = {13, 9, 8, 7, 11}; // prio of threads
113113

114+
for (int i = 0; i < MUTEX_NUM; i++)
115+
{
116+
rt_mutex_init(&_mutex[i], "test1", 0);
117+
}
118+
119+
_sync_flag = 0;
120+
114121
t_main = rt_thread_create("t_main", test_main_thread_entry, RT_NULL, THREAD_STACKSIZE, 12, 10000);
115122
uassert_true(t_main != RT_NULL);
116123
rt_thread_startup(t_main);
@@ -128,6 +135,11 @@ static void test_mutex_pi_protocol(void)
128135
{
129136
rt_thread_mdelay(1000);
130137
}
138+
139+
for (int i = 0; i < MUTEX_NUM; i++)
140+
{
141+
rt_mutex_detach(&_mutex[i]);
142+
}
131143
}
132144

133145
static struct rt_mutex _timeout_mutex;
@@ -137,24 +149,31 @@ static void test_main_timeout_entry(void *para)
137149
rt_err_t ret;
138150

139151
ret = rt_mutex_take(&_timeout_mutex, RT_WAITING_FOREVER);
140-
rt_thread_mdelay(3000);
152+
uassert_true(ret == -RT_EOK);
153+
rt_thread_mdelay(1000);
141154
uassert_true(RT_SCHED_PRIV(rt_thread_self()).current_priority == 10);
142-
rt_thread_mdelay(3000);
155+
rt_thread_mdelay(1000);
143156
uassert_true(RT_SCHED_PRIV(rt_thread_self()).current_priority == 12);
144157
rt_mutex_release(&_timeout_mutex);
158+
_sync_flag ++;
145159
}
146160

147161
static void test_timeout_entry(void *para)
148162
{
149163
rt_err_t ret;
150164

151-
rt_thread_mdelay(2000);
152-
ret = rt_mutex_take(&_timeout_mutex, rt_tick_from_millisecond(3000));
165+
rt_thread_mdelay(500);
166+
ret = rt_mutex_take(&_timeout_mutex, rt_tick_from_millisecond(1000));
153167
uassert_true(ret == -RT_ETIMEOUT);
168+
_sync_flag ++;
154169
}
155170

156-
static void test_mutex_pi_protocol_timeout(void)
171+
static void test_mutex_pi_timeout(void)
157172
{
173+
_sync_flag = 0;
174+
175+
rt_mutex_init(&_timeout_mutex, "_timeout_mutex", 0);
176+
158177
rt_thread_t t1 = rt_thread_create("t1", test_main_timeout_entry, RT_NULL, THREAD_STACKSIZE, 12, 10000);
159178
uassert_true(t1 != RT_NULL);
160179
rt_thread_startup(t1);
@@ -163,38 +182,171 @@ static void test_mutex_pi_protocol_timeout(void)
163182
uassert_true(t2 != RT_NULL);
164183
rt_thread_startup(t2);
165184

166-
rt_thread_mdelay(8000);
185+
while (_sync_flag != 2)
186+
{
187+
rt_thread_mdelay(1000);
188+
}
189+
190+
rt_mutex_detach(&_timeout_mutex);
167191
}
168192

193+
#define TC_THREAD_NUM 4
194+
#define TC_MUTEX_NUM TC_THREAD_NUM
195+
static rt_thread_t t[TC_THREAD_NUM], t_hi_prio;
196+
static struct rt_mutex m[TC_MUTEX_NUM];
169197

170-
static rt_err_t utest_tc_init(void)
198+
static void test_recursive_mutex_depend_entry(void *para)
171199
{
172-
for (int i = 0; i < MUTEX_NUM; i++)
200+
rt_ubase_t id = (rt_ubase_t)para;
201+
202+
rt_mutex_take(&m[id], RT_WAITING_FOREVER);
203+
204+
rt_thread_mdelay(500);
205+
206+
if (id != 0)
173207
{
174-
rt_mutex_init(&_mutex[i], "test1", 0);
208+
rt_mutex_take(&m[id - 1], RT_WAITING_FOREVER);
175209
}
176210

177-
rt_mutex_init(&_timeout_mutex, "_timeout_mutex", 0);
178-
_sync_flag = 0;
211+
if (id == 0)
212+
{
213+
rt_thread_mdelay(2500);
214+
rt_mutex_release(&m[id]);
215+
}
216+
else
217+
{
218+
rt_mutex_release(&m[id - 1]);
219+
rt_mutex_release(&m[id]);
220+
}
221+
_sync_flag ++;
222+
}
179223

180-
return RT_EOK;
224+
static void test_recursive_mutex_depend_hi_pri_entry(void *para)
225+
{
226+
rt_thread_mdelay(1000);
227+
rt_err_t err = rt_mutex_take(&m[TC_MUTEX_NUM - 1], rt_tick_from_millisecond(1000));
228+
uassert_true(err == -RT_ETIMEOUT);
229+
_sync_flag ++;
181230
}
182231

183-
static rt_err_t utest_tc_cleanup(void)
232+
static void test_mutex_pi_recursive_prio_update(void)
184233
{
185-
for (int i = 0; i < MUTEX_NUM; i++)
234+
_sync_flag = 0;
235+
236+
for (int i = 0; i < TC_MUTEX_NUM; i++)
186237
{
187-
rt_mutex_detach(&_mutex[i]);
238+
rt_mutex_init(&m[i], "test", 0);
188239
}
189240

190-
rt_mutex_detach(&_timeout_mutex);
241+
for (rt_ubase_t i = 0; i < TC_THREAD_NUM; i++)
242+
{
243+
t[i] = rt_thread_create("t", test_recursive_mutex_depend_entry, (void *)i, THREAD_STACKSIZE, 10, 10000);
244+
rt_thread_startup(t[i]);
245+
}
246+
t_hi_prio = rt_thread_create("t", test_recursive_mutex_depend_hi_pri_entry, (void *)RT_NULL, THREAD_STACKSIZE, 3, 10000);
247+
rt_thread_startup(t_hi_prio);
248+
249+
rt_thread_mdelay(1500);
250+
251+
for (int i = 0; i < TC_THREAD_NUM; i++)
252+
{
253+
uassert_true(RT_SCHED_PRIV(t[i]).current_priority == 3);
254+
}
255+
256+
rt_thread_mdelay(1000);
257+
258+
for (int i = 0; i < TC_THREAD_NUM; i++)
259+
{
260+
uassert_true(RT_SCHED_PRIV(t[i]).current_priority == 10);
261+
}
262+
263+
while (_sync_flag != TC_THREAD_NUM + 1)
264+
{
265+
rt_thread_mdelay(1000);
266+
}
267+
268+
for (int i = 0; i < TC_MUTEX_NUM; i++)
269+
{
270+
rt_mutex_detach(&m[i]);
271+
}
272+
_sync_flag ++;
273+
}
274+
275+
static void test_mutex_waiter_to_wakeup_entry(void *para)
276+
{
277+
rt_thread_mdelay(1000);
278+
rt_err_t err = rt_mutex_take(&m[TC_MUTEX_NUM - 1], RT_WAITING_FOREVER);
279+
uassert_true(err == -RT_EINTR);
280+
_sync_flag ++;
281+
}
282+
283+
static void wakeup_func(void *para)
284+
{
285+
rt_thread_resume(t_hi_prio);
286+
}
287+
static void test_mutex_pi_wakeup_mutex_waiter(void)
288+
{
289+
struct rt_timer wakeup_timer;
290+
291+
_sync_flag = 0;
292+
293+
for (int i = 0; i < TC_MUTEX_NUM; i++)
294+
{
295+
rt_mutex_init(&m[i], "test", 0);
296+
}
297+
298+
for (rt_ubase_t i = 0; i < TC_THREAD_NUM; i++)
299+
{
300+
t[i] = rt_thread_create("t", test_recursive_mutex_depend_entry, (void *)i, THREAD_STACKSIZE, 10, 10000);
301+
rt_thread_startup(t[i]);
302+
}
303+
t_hi_prio = rt_thread_create("t", test_mutex_waiter_to_wakeup_entry, (void *)RT_NULL, THREAD_STACKSIZE, 3, 10000);
304+
rt_thread_startup(t_hi_prio);
305+
306+
rt_timer_init(&wakeup_timer, "wakeup_timer", wakeup_func, RT_NULL, rt_tick_from_millisecond(2000), RT_TIMER_FLAG_ONE_SHOT);
307+
rt_timer_start(&wakeup_timer);
308+
rt_thread_mdelay(1500);
309+
310+
for (int i = 0; i < TC_THREAD_NUM; i++)
311+
{
312+
uassert_true(RT_SCHED_PRIV(t[i]).current_priority == 3);
313+
}
314+
315+
rt_thread_mdelay(1000);
316+
317+
for (int i = 0; i < TC_THREAD_NUM; i++)
318+
{
319+
uassert_true(RT_SCHED_PRIV(t[i]).current_priority == 10);
320+
}
321+
322+
while (_sync_flag != TC_THREAD_NUM + 1)
323+
{
324+
rt_thread_mdelay(1000);
325+
}
326+
327+
for (int i = 0; i < TC_MUTEX_NUM; i++)
328+
{
329+
rt_mutex_detach(&m[i]);
330+
}
331+
rt_timer_detach(&wakeup_timer);
332+
}
333+
334+
static rt_err_t utest_tc_init(void)
335+
{
336+
return RT_EOK;
337+
}
338+
339+
static rt_err_t utest_tc_cleanup(void)
340+
{
191341
return RT_EOK;
192342
}
193343

194344
static void testcase(void)
195345
{
196-
UTEST_UNIT_RUN(test_mutex_pi_protocol);
197-
UTEST_UNIT_RUN(test_mutex_pi_protocol_timeout);
346+
UTEST_UNIT_RUN(test_mutex_pi);
347+
UTEST_UNIT_RUN(test_mutex_pi_recursive_prio_update);
348+
UTEST_UNIT_RUN(test_mutex_pi_timeout);
349+
UTEST_UNIT_RUN(test_mutex_pi_wakeup_mutex_waiter);
198350
}
199351
UTEST_TC_EXPORT(testcase, "testcases.kernel.mutex_pi_tc", utest_tc_init, utest_tc_cleanup, 1000);
200352

0 commit comments

Comments
 (0)