Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit 1ce6262

Browse files
committedAug 28, 2024·
add more test
1 parent 05f39df commit 1ce6262

File tree

1 file changed

+147
-19
lines changed

1 file changed

+147
-19
lines changed
 

‎examples/utest/testcases/kernel/mutex_pi_tc.c

+147-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,9 +149,9 @@ 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+
rt_thread_mdelay(1000);
141153
uassert_true(RT_SCHED_PRIV(rt_thread_self()).current_priority == 10);
142-
rt_thread_mdelay(3000);
154+
rt_thread_mdelay(1000);
143155
uassert_true(RT_SCHED_PRIV(rt_thread_self()).current_priority == 12);
144156
rt_mutex_release(&_timeout_mutex);
145157
}
@@ -148,13 +160,15 @@ static void test_timeout_entry(void *para)
148160
{
149161
rt_err_t ret;
150162

151-
rt_thread_mdelay(2000);
152-
ret = rt_mutex_take(&_timeout_mutex, rt_tick_from_millisecond(3000));
163+
rt_thread_mdelay(500);
164+
ret = rt_mutex_take(&_timeout_mutex, rt_tick_from_millisecond(1000));
153165
uassert_true(ret == -RT_ETIMEOUT);
154166
}
155167

156-
static void test_mutex_pi_protocol_timeout(void)
168+
static void test_mutex_pi_timeout(void)
157169
{
170+
rt_mutex_init(&_timeout_mutex, "_timeout_mutex", 0);
171+
158172
rt_thread_t t1 = rt_thread_create("t1", test_main_timeout_entry, RT_NULL, THREAD_STACKSIZE, 12, 10000);
159173
uassert_true(t1 != RT_NULL);
160174
rt_thread_startup(t1);
@@ -163,38 +177,152 @@ static void test_mutex_pi_protocol_timeout(void)
163177
uassert_true(t2 != RT_NULL);
164178
rt_thread_startup(t2);
165179

166-
rt_thread_mdelay(8000);
180+
rt_thread_mdelay(3000);
181+
182+
rt_mutex_detach(&_timeout_mutex);
167183
}
168184

185+
static rt_thread_t t[4], t_hi_prio;
186+
static struct rt_mutex m[4];
169187

170-
static rt_err_t utest_tc_init(void)
188+
static void test_recursive_mutex_depend_entry(void *para)
171189
{
172-
for (int i = 0; i < MUTEX_NUM; i++)
190+
rt_ubase_t id = (rt_ubase_t)para;
191+
192+
rt_mutex_take(&m[id], RT_WAITING_FOREVER);
193+
194+
rt_thread_mdelay(500);
195+
196+
if (id != 0)
173197
{
174-
rt_mutex_init(&_mutex[i], "test1", 0);
198+
rt_mutex_take(&m[id - 1], RT_WAITING_FOREVER);
175199
}
176200

177-
rt_mutex_init(&_timeout_mutex, "_timeout_mutex", 0);
178-
_sync_flag = 0;
201+
if (id == 0)
202+
{
203+
rt_thread_mdelay(2500);
204+
rt_mutex_release(&m[id]);
205+
}
206+
else
207+
{
208+
rt_mutex_release(&m[id - 1]);
209+
rt_mutex_release(&m[id]);
210+
}
211+
}
179212

180-
return RT_EOK;
213+
static void test_recursive_mutex_depend_hi_pri_entry(void *para)
214+
{
215+
rt_thread_mdelay(1000);
216+
rt_err_t err = rt_mutex_take(&m[3], rt_tick_from_millisecond(1000));
217+
uassert_true(err == -RT_ETIMEOUT);
181218
}
182219

183-
static rt_err_t utest_tc_cleanup(void)
220+
static void test_mutex_pi_recursive_prio_update(void)
184221
{
185-
for (int i = 0; i < MUTEX_NUM; i++)
222+
for (int i = 0; i < 4; i++)
186223
{
187-
rt_mutex_detach(&_mutex[i]);
224+
rt_mutex_init(&m[i], "test", 0);
188225
}
189226

190-
rt_mutex_detach(&_timeout_mutex);
227+
for (rt_ubase_t i = 0; i < 4; i++)
228+
{
229+
t[i] = rt_thread_create("t", test_recursive_mutex_depend_entry, (void *)i, THREAD_STACKSIZE, 10, 10000);
230+
rt_thread_startup(t[i]);
231+
}
232+
t_hi_prio = rt_thread_create("t", test_recursive_mutex_depend_hi_pri_entry, (void *)RT_NULL, THREAD_STACKSIZE, 3, 10000);
233+
rt_thread_startup(t_hi_prio);
234+
235+
rt_thread_mdelay(1500);
236+
237+
for (int i = 0; i < 4; i++)
238+
{
239+
uassert_true(RT_SCHED_PRIV(t[i]).current_priority == 3);
240+
}
241+
242+
rt_thread_mdelay(1000);
243+
244+
for (int i = 0; i < 4; i++)
245+
{
246+
uassert_true(RT_SCHED_PRIV(t[i]).current_priority == 10);
247+
}
248+
249+
rt_thread_mdelay(1000);
250+
251+
for (int i = 0; i < 4; i++)
252+
{
253+
rt_mutex_detach(&m[i]);
254+
}
255+
}
256+
257+
static void test_mutex_waiter_to_wakeup_entry(void *para)
258+
{
259+
rt_thread_mdelay(1000);
260+
rt_err_t err = rt_mutex_take(&m[3], RT_WAITING_FOREVER);
261+
uassert_true(err == -RT_EAGAIN);
262+
}
263+
264+
static void wakeup_func(void *para)
265+
{
266+
rt_thread_resume(t_hi_prio);
267+
}
268+
static void test_mutex_pi_wakeup_mutex_waiter(void)
269+
{
270+
struct rt_timer wakeup_timer;
271+
272+
for (int i = 0; i < 4; i++)
273+
{
274+
rt_mutex_init(&m[i], "test", 0);
275+
}
276+
277+
for (rt_ubase_t i = 0; i < 4; i++)
278+
{
279+
t[i] = rt_thread_create("t", test_recursive_mutex_depend_entry, (void *)i, THREAD_STACKSIZE, 10, 10000);
280+
rt_thread_startup(t[i]);
281+
}
282+
t_hi_prio = rt_thread_create("t", test_mutex_waiter_to_wakeup_entry, (void *)RT_NULL, THREAD_STACKSIZE, 3, 10000);
283+
rt_thread_startup(t_hi_prio);
284+
285+
rt_timer_init(&wakeup_timer, "wakeup_timer", wakeup_func, RT_NULL, rt_tick_from_millisecond(2000), RT_TIMER_FLAG_ONE_SHOT);
286+
rt_timer_start(&wakeup_timer);
287+
rt_thread_mdelay(1500);
288+
289+
for (int i = 0; i < 4; i++)
290+
{
291+
uassert_true(RT_SCHED_PRIV(t[i]).current_priority == 3);
292+
}
293+
294+
rt_thread_mdelay(1000);
295+
296+
for (int i = 0; i < 4; i++)
297+
{
298+
uassert_true(RT_SCHED_PRIV(t[i]).current_priority == 10);
299+
}
300+
301+
rt_thread_mdelay(1000);
302+
303+
for (int i = 0; i < 4; i++)
304+
{
305+
rt_mutex_detach(&m[i]);
306+
}
307+
rt_timer_detach(&wakeup_timer);
308+
}
309+
310+
static rt_err_t utest_tc_init(void)
311+
{
312+
return RT_EOK;
313+
}
314+
315+
static rt_err_t utest_tc_cleanup(void)
316+
{
191317
return RT_EOK;
192318
}
193319

194320
static void testcase(void)
195321
{
196-
UTEST_UNIT_RUN(test_mutex_pi_protocol);
197-
UTEST_UNIT_RUN(test_mutex_pi_protocol_timeout);
322+
UTEST_UNIT_RUN(test_mutex_pi);
323+
UTEST_UNIT_RUN(test_mutex_pi_recursive_prio_update);
324+
UTEST_UNIT_RUN(test_mutex_pi_timeout);
325+
UTEST_UNIT_RUN(test_mutex_pi_wakeup_mutex_waiter);
198326
}
199327
UTEST_TC_EXPORT(testcase, "testcases.kernel.mutex_pi_tc", utest_tc_init, utest_tc_cleanup, 1000);
200328

0 commit comments

Comments
 (0)
Please sign in to comment.