@@ -105,12 +105,19 @@ static void test_main_thread_entry(void *para)
105
105
_sync_flag ++ ;
106
106
}
107
107
108
- static void test_mutex_pi_protocol (void )
108
+ static void test_mutex_pi (void )
109
109
{
110
110
rt_thread_t t_main ;
111
111
rt_thread_t t [THREAD_NUM ];
112
112
rt_uint8_t prio [THREAD_NUM ] = {13 , 9 , 8 , 7 , 11 }; // prio of threads
113
113
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
+
114
121
t_main = rt_thread_create ("t_main" , test_main_thread_entry , RT_NULL , THREAD_STACKSIZE , 12 , 10000 );
115
122
uassert_true (t_main != RT_NULL );
116
123
rt_thread_startup (t_main );
@@ -128,6 +135,11 @@ static void test_mutex_pi_protocol(void)
128
135
{
129
136
rt_thread_mdelay (1000 );
130
137
}
138
+
139
+ for (int i = 0 ; i < MUTEX_NUM ; i ++ )
140
+ {
141
+ rt_mutex_detach (& _mutex [i ]);
142
+ }
131
143
}
132
144
133
145
static struct rt_mutex _timeout_mutex ;
@@ -137,24 +149,31 @@ static void test_main_timeout_entry(void *para)
137
149
rt_err_t ret ;
138
150
139
151
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 );
141
154
uassert_true (RT_SCHED_PRIV (rt_thread_self ()).current_priority == 10 );
142
- rt_thread_mdelay (3000 );
155
+ rt_thread_mdelay (1000 );
143
156
uassert_true (RT_SCHED_PRIV (rt_thread_self ()).current_priority == 12 );
144
157
rt_mutex_release (& _timeout_mutex );
158
+ _sync_flag ++ ;
145
159
}
146
160
147
161
static void test_timeout_entry (void * para )
148
162
{
149
163
rt_err_t ret ;
150
164
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 ));
153
167
uassert_true (ret == - RT_ETIMEOUT );
168
+ _sync_flag ++ ;
154
169
}
155
170
156
- static void test_mutex_pi_protocol_timeout (void )
171
+ static void test_mutex_pi_timeout (void )
157
172
{
173
+ _sync_flag = 0 ;
174
+
175
+ rt_mutex_init (& _timeout_mutex , "_timeout_mutex" , 0 );
176
+
158
177
rt_thread_t t1 = rt_thread_create ("t1" , test_main_timeout_entry , RT_NULL , THREAD_STACKSIZE , 12 , 10000 );
159
178
uassert_true (t1 != RT_NULL );
160
179
rt_thread_startup (t1 );
@@ -163,38 +182,171 @@ static void test_mutex_pi_protocol_timeout(void)
163
182
uassert_true (t2 != RT_NULL );
164
183
rt_thread_startup (t2 );
165
184
166
- rt_thread_mdelay (8000 );
185
+ while (_sync_flag != 2 )
186
+ {
187
+ rt_thread_mdelay (1000 );
188
+ }
189
+
190
+ rt_mutex_detach (& _timeout_mutex );
167
191
}
168
192
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 ];
169
197
170
- static rt_err_t utest_tc_init (void )
198
+ static void test_recursive_mutex_depend_entry (void * para )
171
199
{
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 )
173
207
{
174
- rt_mutex_init ( & _mutex [ i ], "test1" , 0 );
208
+ rt_mutex_take ( & m [ id - 1 ], RT_WAITING_FOREVER );
175
209
}
176
210
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
+ }
179
223
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 ++ ;
181
230
}
182
231
183
- static rt_err_t utest_tc_cleanup (void )
232
+ static void test_mutex_pi_recursive_prio_update (void )
184
233
{
185
- for (int i = 0 ; i < MUTEX_NUM ; i ++ )
234
+ _sync_flag = 0 ;
235
+
236
+ for (int i = 0 ; i < TC_MUTEX_NUM ; i ++ )
186
237
{
187
- rt_mutex_detach ( & _mutex [i ]);
238
+ rt_mutex_init ( & m [i ], "test" , 0 );
188
239
}
189
240
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
+ {
191
341
return RT_EOK ;
192
342
}
193
343
194
344
static void testcase (void )
195
345
{
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 );
198
350
}
199
351
UTEST_TC_EXPORT (testcase , "testcases.kernel.mutex_pi_tc" , utest_tc_init , utest_tc_cleanup , 1000 );
200
352
0 commit comments