@@ -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,9 +149,9 @@ 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
+ rt_thread_mdelay (1000 );
141
153
uassert_true (RT_SCHED_PRIV (rt_thread_self ()).current_priority == 10 );
142
- rt_thread_mdelay (3000 );
154
+ rt_thread_mdelay (1000 );
143
155
uassert_true (RT_SCHED_PRIV (rt_thread_self ()).current_priority == 12 );
144
156
rt_mutex_release (& _timeout_mutex );
145
157
}
@@ -148,13 +160,15 @@ static void test_timeout_entry(void *para)
148
160
{
149
161
rt_err_t ret ;
150
162
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 ));
153
165
uassert_true (ret == - RT_ETIMEOUT );
154
166
}
155
167
156
- static void test_mutex_pi_protocol_timeout (void )
168
+ static void test_mutex_pi_timeout (void )
157
169
{
170
+ rt_mutex_init (& _timeout_mutex , "_timeout_mutex" , 0 );
171
+
158
172
rt_thread_t t1 = rt_thread_create ("t1" , test_main_timeout_entry , RT_NULL , THREAD_STACKSIZE , 12 , 10000 );
159
173
uassert_true (t1 != RT_NULL );
160
174
rt_thread_startup (t1 );
@@ -163,38 +177,152 @@ static void test_mutex_pi_protocol_timeout(void)
163
177
uassert_true (t2 != RT_NULL );
164
178
rt_thread_startup (t2 );
165
179
166
- rt_thread_mdelay (8000 );
180
+ rt_thread_mdelay (3000 );
181
+
182
+ rt_mutex_detach (& _timeout_mutex );
167
183
}
168
184
185
+ static rt_thread_t t [4 ], t_hi_prio ;
186
+ static struct rt_mutex m [4 ];
169
187
170
- static rt_err_t utest_tc_init (void )
188
+ static void test_recursive_mutex_depend_entry (void * para )
171
189
{
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 )
173
197
{
174
- rt_mutex_init ( & _mutex [ i ], "test1" , 0 );
198
+ rt_mutex_take ( & m [ id - 1 ], RT_WAITING_FOREVER );
175
199
}
176
200
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
+ }
179
212
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 );
181
218
}
182
219
183
- static rt_err_t utest_tc_cleanup (void )
220
+ static void test_mutex_pi_recursive_prio_update (void )
184
221
{
185
- for (int i = 0 ; i < MUTEX_NUM ; i ++ )
222
+ for (int i = 0 ; i < 4 ; i ++ )
186
223
{
187
- rt_mutex_detach ( & _mutex [i ]);
224
+ rt_mutex_init ( & m [i ], "test" , 0 );
188
225
}
189
226
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
+ {
191
317
return RT_EOK ;
192
318
}
193
319
194
320
static void testcase (void )
195
321
{
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 );
198
326
}
199
327
UTEST_TC_EXPORT (testcase , "testcases.kernel.mutex_pi_tc" , utest_tc_init , utest_tc_cleanup , 1000 );
200
328
0 commit comments