source: asp3_wo_tecs/trunk/test/test_mutex6.c@ 302

Last change on this file since 302 was 302, checked in by ertl-honda, 7 years ago

TECSレスのASP3の開発のため以下のtrunkからコピー
http://dev.toppers.jp/svn/asp3/branches/WO_TECS-3.C.0

File size: 13.7 KB
RevLine 
[302]1/*
2 * TOPPERS Software
3 * Toyohashi Open Platform for Embedded Real-Time Systems
4 *
5 * Copyright (C) 2007-2015 by Embedded and Real-Time Systems Laboratory
6 * Graduate School of Information Science, Nagoya Univ., JAPAN
7 *
8 * 上記著作権者
9は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
10 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
11 * 変・再é…
12å¸ƒï¼ˆä»¥ä¸‹ï¼Œåˆ©ç”¨ã¨å‘¼ã¶ï¼‰ã™ã‚‹ã“とを無償で許諾する.
13 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
14 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
15 * スコード中に含まれていること.
16 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
17 * 用できる形で再é…
18å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é…
19å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨
20 * 者
21マニュアルなど)に,上記の著作権表示,この利用条件および下記
22 * の無保証規定を掲載すること.
23 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
24 * 用できない形で再é…
25å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã„ずれかの条件を満たすこ
26 * と.
27 * (a) 再é…
28å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€…
29マニュアルなど)に,上記の著
30 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
31 * (b) 再é…
32å¸ƒã®å½¢æ…
33‹ã‚’,別に定める方法によって,TOPPERSプロジェクトに
34 * 報告すること.
35 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
36 * 害からも,上記著作権者
37およびTOPPERSプロジェクトをå…
38è²¬ã™ã‚‹ã“と.
39 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
40 * 由に基づく請求からも,上記著作権者
41およびTOPPERSプロジェクトを
42 * å…
43è²¬ã™ã‚‹ã“と.
44 *
45 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者
46お
47 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
48 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
49 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
50 * の責任を負わない.
51 *
52 * $Id: test_mutex6.c 310 2015-02-08 13:46:46Z ertl-hiro $
53 */
54
55/*
56 * ミューテックスのテスト(6)
57 *
58 * 【テストの目的】
59 *
60 * 優å…
61ˆåº¦ä¸Šé™ãƒŸãƒ¥ãƒ¼ãƒ†ãƒƒã‚¯ã‚¹ã«å¯¾ã—て,タスクの終了時,タスクの優å…
62ˆé †ä½
63 * の回転時のミューテックス関連の処理を網羅
64的にテストする.
65 *
66 * 【テスト項
67目】
68 *
69 * (A) タスクの終了時(ext_tsk)
70 * (A-1) ロックしていたミューテックス(1つ)がロック解除されること.
71 * (A-2) ロックしていたミューテックス(1つ)がロック解除され,ロッ
72 * クを待
73っていたタスクがそれをロックし,優å…
74ˆåº¦ãŒå¤‰åŒ–し,待
75
76 * ち解除されること.
77 * (A-3) ロックしていたミューテックス(複数)がすべてロック解除さ
78 * れること.
79 * (A-4) ロックしていたミューテックス(複数)がロック解除され,ロッ
80 * クを待
81っていたタスク(複数)がそれをロックし,優å…
82ˆåº¦ãŒå¤‰
83 * 化し,待
84ち解除されること.その時に,後でミューテックスを
85 * ロックしたタスク(å…
86ˆã«ãƒ­ãƒƒã‚¯ã—ていたミューテックスを待
87っ
88 * ていたタスク)の方が,優å…
89ˆé †ä½ãŒé«˜ããªã‚‹ã“と.
90 * (B) タスクの優å…
91ˆé †ä½ã®å›žè»¢ï¼ˆrot_rdq)
92 * (B-1) TPRI_SELFを指定した時に,タスクのベース優å…
93ˆåº¦ã®å„ªå…
94ˆé †ä½ãŒ
95 *    回転すること.
96 * (B-2) TPRI_SELFを指定した時に,タスクの現在優å…
97ˆåº¦ã®å„ªå…
98ˆé †ä½ãŒå›ž
99 *    転しないこと.
100 *
101 * 【テスト項
102目の実現方法】
103 *
104 * (A-1)
105 * 低優å…
106ˆåº¦ã‚¿ã‚¹ã‚¯ï¼ˆTASK2)にミューテックス(MTX1)をロックさせ,
107 * ext_tskすると,ロックが解除されることを確認する.
108 * (A-2)
109 * 低優å…
110ˆåº¦ã‚¿ã‚¹ã‚¯ï¼ˆTASK2)に高優å…
111ˆåº¦ä¸Šé™ãƒŸãƒ¥ãƒ¼ãƒ†ãƒƒã‚¯ã‚¹ï¼ˆMTX1)をロッ
112 * クさせ,別の低優å…
113ˆåº¦ã‚¿ã‚¹ã‚¯ï¼ˆTASK3)にMTX1を待
114たせた状æ…
115‹ã§ï¼Œ
116 * TASK2 がext_tskすると,TASK3が高優å…
117ˆåº¦ã«ãªã£ã¦å¾…
118ち解除されるこ
119 * とを確認する.
120 * (A-3)
121 * 低優å…
122ˆåº¦ã‚¿ã‚¹ã‚¯ï¼ˆTASK2)にミューテックスを2つ(MTX1,MTX2)ロッ
123 * クさせ,ext_tskすると,両方のロックが解除されることを確認する.
124 * (A-4)
125 * 低優å…
126ˆåº¦ã‚¿ã‚¹ã‚¯ï¼ˆTASK2)に高優å…
127ˆåº¦ä¸Šé™ãƒŸãƒ¥ãƒ¼ãƒ†ãƒƒã‚¯ã‚¹2つ(MTX1,
128 * MTX2)をこの順でロックさせ,別の低優å…
129ˆåº¦ã‚¿ã‚¹ã‚¯2つ(TASK3,
130 * TASK4)にそれぞれのロックを待
131たせた状æ…
132‹ã§ï¼ŒTASK2をext_tskすると,
133 * TASK3とTASK4が高優å…
134ˆåº¦ã«ãªã£ã¦å¾…
135ち解除されることを確認する.ま
136 * た,å…
137ˆã«ãƒ­ãƒƒã‚¯ã—ていたミューテックス(MTX1)を待
138っていたタスク
139 * (TASK3)が,TASK4よりも優å…
140ˆé †ä½ãŒé«˜ããªã‚‹ã“とを確認する.
141 * (B-1)
142 * 低優å…
143ˆåº¦ã‚¿ã‚¹ã‚¯ãŒ3つ(TASK2,TASK3,TASK4)が実行できる状æ…
144‹ã®æ™‚
145 * に,1つの低優å…
146ˆåº¦ã‚¿ã‚¹ã‚¯ï¼ˆTASK2)に高優å…
147ˆåº¦ä¸Šé™ãƒŸãƒ¥ãƒ¼ãƒ†ãƒƒã‚¯ã‚¹ã‚’
148 * ロックさせ,rot_rdq(TPRI_SELF)すると,残りの2つの低優å…
149ˆåº¦ã‚¿ã‚¹ã‚¯
150 * の優å…
151ˆé †ä½ãŒå›žè»¢ã™ã‚‹ã“とを確認する.
152 * (B-2)
153 * 上と同じ状況で,高優å…
154ˆåº¦ã‚¿ã‚¹ã‚¯ã®å„ªå…
155ˆé †ä½ãŒå›žè»¢ã—ないことを確認
156 * する.
157 *
158 * 【使用リソース】
159 *
160 * TASK1: 低優å…
161ˆåº¦ã‚¿ã‚¹ã‚¯ï¼Œãƒ¡ã‚¤ãƒ³ã‚¿ã‚¹ã‚¯ï¼Œæœ€åˆã‹ã‚‰èµ·å‹•
162 * TASK2: 低優å…
163ˆåº¦ã‚¿ã‚¹ã‚¯
164 * TASK3: 低優å…
165ˆåº¦ã‚¿ã‚¹ã‚¯
166 * TASK4: 低優å…
167ˆåº¦ã‚¿ã‚¹ã‚¯
168 * MTX1: ミューテックス(TA_CEILING属性,上限は高優å…
169ˆåº¦ï¼‰
170 * MTX2: ミューテックス(TA_CEILING属性,上限は高優å…
171ˆåº¦ï¼‰
172 *
173 * 【テストシーケンス】
174 *
175 * == TASK1(優å…
176ˆåº¦ï¼šä½Žï¼‰==
177 * call(set_bit_func(bit_mutex))
178 * 1: act_tsk(TASK2)
179 * 2: rot_rdq(TPRI_SELF)
180 * // 低:TASK2→TASK1
181 * == TASK2-1(優å…
182ˆåº¦ï¼šä½Žï¼‰1回め ==
183 * 3: loc_mtx(MTX1)
184 * // 高:TASK2,低:TASK1,MTX1:TASK2
185 * 4: ext_tsk() -> noreturn ... (A-1)
186 * // 低:TASK1
187 * == TASK1(続き)==
188 * 5: ref_mtx(MTX1, &rmtx)
189 * assert(rmtx.htskid == TSK_NONE)
190 * assert(rmtx.wtskid == TSK_NONE)
191 *
192 * 6: act_tsk(TASK2)
193 * act_tsk(TASK3)
194 * 7: rot_rdq(TPRI_SELF)
195 * // 低:TASK2→TASK3→TASK1
196 * == TASK2-2(優å…
197ˆåº¦ï¼šä½Žï¼‰2回め ==
198 * 8: loc_mtx(MTX1)
199 * // 高:TASK2,低:TASK3→TASK1,MTX1:TASK2
200 * 9: slp_tsk()
201 * // 低:TASK3→TASK1,MTX1:TASK2
202 * == TASK3(優å…
203ˆåº¦ï¼šä½Žï¼‰==
204 * 10: loc_mtx(MTX1)
205 * // 低:TASK1,MTX1:TASK2→TASK3
206 * == TASK1(続き)==
207 * 11: wup_tsk(TASK2)
208 * // 高:TASK2,低:TASK1,MTX1:TASK2→TASK3
209 * == TASK2-2(続き)==
210 * 12: ext_tsk() -> noreturn ... (A-2)
211 * // 高:TASK3,低:TASK1,MTX1:TASK3
212 * == TASK3(続き)==
213 * 13: ref_mtx(MTX1, &rmtx)
214 * assert(rmtx.htskid == TASK3)
215 * assert(rmtx.wtskid == TSK_NONE)
216 * get_pri(TPRI_SELF, &tskpri)
217 * assert(tskpri == HIGH_PRIORITY)
218 * unl_mtx(MTX1)
219 * slp_tsk()
220 * // 低:TASK1
221 *
222 * == TASK1(続き)==
223 * 14: act_tsk(TASK2)
224 * 15: rot_rdq(TPRI_SELF)
225 * // 低:TASK2→TASK1
226 * == TASK2-3(優å…
227ˆåº¦ï¼šä½Žï¼‰3回め ==
228 * 16: loc_mtx(MTX1)
229 * loc_mtx(MTX2)
230 * // 高:TASK2,低:TASK1,MTX1:TASK2,MTX2:TASK2
231 * 17: ext_tsk() -> noreturn ... (A-3)
232 * // 低:TASK1
233 * == TASK1(続き)==
234 * 18: ref_mtx(MTX1, &rmtx)
235 * assert(rmtx.htskid == TSK_NONE)
236 * assert(rmtx.wtskid == TSK_NONE)
237 * ref_mtx(MTX2, &rmtx)
238 * assert(rmtx.htskid == TSK_NONE)
239 * assert(rmtx.wtskid == TSK_NONE)
240 *
241 * 19: act_tsk(TASK2)
242 * wup_tsk(TASK3)
243 * act_tsk(TASK4)
244 * 20: rot_rdq(TPRI_SELF)
245 * // 低:TASK2→TASK3→TASK4→TASK1
246 * == TASK2-4(優å…
247ˆåº¦ï¼šä½Žï¼‰4回め ==
248 * 21: loc_mtx(MTX1)
249 * loc_mtx(MTX2)
250 * // 高:TASK2,低:TASK3→TASK4→TASK1,MTX1:TASK2,MTX2:TASK2
251 * 22: chg_pri(TASK1, HIGH_PRIORITY)
252 * // 高:TASK2→TASK1,低:TASK3→TASK4,MTX1:TASK2,MTX2:TASK2
253 * 23: rot_rdq(TPRI_SELF) ... (B-1)(B-2)
254 * // 高:TASK2→TASK1,低:TASK4→TASK3,MTX1:TASK2,MTX2:TASK2
255 * 24: slp_tsk()
256 * // 高:TASK1,低:TASK4→TASK3,MTX1:TASK2,MTX2:TASK2
257 * == TASK1(続き)==
258 * 25: chg_pri(TSK_SELF, TPRI_INI)
259 * // 低:TASK4→TASK3→TASK1,MTX1:TASK2,MTX2:TASK2
260 * == TASK4(優å…
261ˆåº¦ï¼šä½Žï¼‰==
262 * 26: loc_mtx(MTX2)
263 * // 低:TASK3→TASK1,MTX1:TASK2,MTX2:TASK2→TASK4
264 * == TASK3(続き)==
265 * 27: loc_mtx(MTX1)
266 * // 低:TASK1,MTX1:TASK2→TASK3,MTX2:TASK2→TASK4
267 * == TASK1(続き)==
268 * 28: wup_tsk(TASK2)
269 * // 高:TASK2,低:TASK1,MTX1:TASK2→TASK3,MTX2:TASK2→TASK4
270 * == TASK2-4(続き)==
271 * 29: ext_tsk() -> noreturn ... (A-4)
272 * // 高:TASK4→TASK3,低:TASK1,MTX1:TASK3,MTX2:TASK4
273 * == TASK4(続き)==
274 * 30: ref_mtx(MTX1, &rmtx)
275 * assert(rmtx.htskid == TASK3)
276 * assert(rmtx.wtskid == TSK_NONE)
277 * ref_mtx(MTX2, &rmtx)
278 * assert(rmtx.htskid == TASK4)
279 * assert(rmtx.wtskid == TSK_NONE)
280 * get_pri(TPRI_SELF, &tskpri)
281 * assert(tskpri == HIGH_PRIORITY)
282 * ext_tsk() -> noreturn
283 * // 高:TASK3,低:TASK1,MTX2:TASK4
284 * == TASK3(続き)==
285 * 31: get_pri(TPRI_SELF, &tskpri)
286 * assert(tskpri == HIGH_PRIORITY)
287 * ext_tsk() -> noreturn
288 * // 低:TASK1
289 * == TASK1(続き)==
290 * 32: END
291 */
292
293#include <kernel.h>
294#include <t_syslog.h>
295#include "syssvc/test_svc.h"
296#include "kernel_cfg.h"
297#include "test_mutex6.h"
298
299extern ER bit_mutex(void);
300
301/* DO NOT DELETE THIS LINE -- gentest depends on it. */
302
303void
304task1(intptr_t exinf)
305{
306 ER_UINT ercd;
307 T_RMTX rmtx;
308
309 test_start(__FILE__);
310
311 set_bit_func(bit_mutex);
312
313 check_point(1);
314 ercd = act_tsk(TASK2);
315 check_ercd(ercd, E_OK);
316
317 check_point(2);
318 ercd = rot_rdq(TPRI_SELF);
319 check_ercd(ercd, E_OK);
320
321 check_point(5);
322 ercd = ref_mtx(MTX1, &rmtx);
323 check_ercd(ercd, E_OK);
324
325 check_assert(rmtx.htskid == TSK_NONE);
326
327 check_assert(rmtx.wtskid == TSK_NONE);
328
329 check_point(6);
330 ercd = act_tsk(TASK2);
331 check_ercd(ercd, E_OK);
332
333 ercd = act_tsk(TASK3);
334 check_ercd(ercd, E_OK);
335
336 check_point(7);
337 ercd = rot_rdq(TPRI_SELF);
338 check_ercd(ercd, E_OK);
339
340 check_point(11);
341 ercd = wup_tsk(TASK2);
342 check_ercd(ercd, E_OK);
343
344 check_point(14);
345 ercd = act_tsk(TASK2);
346 check_ercd(ercd, E_OK);
347
348 check_point(15);
349 ercd = rot_rdq(TPRI_SELF);
350 check_ercd(ercd, E_OK);
351
352 check_point(18);
353 ercd = ref_mtx(MTX1, &rmtx);
354 check_ercd(ercd, E_OK);
355
356 check_assert(rmtx.htskid == TSK_NONE);
357
358 check_assert(rmtx.wtskid == TSK_NONE);
359
360 ercd = ref_mtx(MTX2, &rmtx);
361 check_ercd(ercd, E_OK);
362
363 check_assert(rmtx.htskid == TSK_NONE);
364
365 check_assert(rmtx.wtskid == TSK_NONE);
366
367 check_point(19);
368 ercd = act_tsk(TASK2);
369 check_ercd(ercd, E_OK);
370
371 ercd = wup_tsk(TASK3);
372 check_ercd(ercd, E_OK);
373
374 ercd = act_tsk(TASK4);
375 check_ercd(ercd, E_OK);
376
377 check_point(20);
378 ercd = rot_rdq(TPRI_SELF);
379 check_ercd(ercd, E_OK);
380
381 check_point(25);
382 ercd = chg_pri(TSK_SELF, TPRI_INI);
383 check_ercd(ercd, E_OK);
384
385 check_point(28);
386 ercd = wup_tsk(TASK2);
387 check_ercd(ercd, E_OK);
388
389 check_finish(32);
390 check_point(0);
391}
392
393static uint_t task2_count = 0;
394
395void
396task2(intptr_t exinf)
397{
398 ER_UINT ercd;
399
400 switch (++task2_count) {
401 case 1:
402 check_point(3);
403 ercd = loc_mtx(MTX1);
404 check_ercd(ercd, E_OK);
405
406 check_point(4);
407 ercd = ext_tsk();
408
409 check_point(0);
410
411 case 2:
412 check_point(8);
413 ercd = loc_mtx(MTX1);
414 check_ercd(ercd, E_OK);
415
416 check_point(9);
417 ercd = slp_tsk();
418 check_ercd(ercd, E_OK);
419
420 check_point(12);
421 ercd = ext_tsk();
422
423 check_point(0);
424
425 case 3:
426 check_point(16);
427 ercd = loc_mtx(MTX1);
428 check_ercd(ercd, E_OK);
429
430 ercd = loc_mtx(MTX2);
431 check_ercd(ercd, E_OK);
432
433 check_point(17);
434 ercd = ext_tsk();
435
436 check_point(0);
437
438 case 4:
439 check_point(21);
440 ercd = loc_mtx(MTX1);
441 check_ercd(ercd, E_OK);
442
443 ercd = loc_mtx(MTX2);
444 check_ercd(ercd, E_OK);
445
446 check_point(22);
447 ercd = chg_pri(TASK1, HIGH_PRIORITY);
448 check_ercd(ercd, E_OK);
449
450 check_point(23);
451 ercd = rot_rdq(TPRI_SELF);
452 check_ercd(ercd, E_OK);
453
454 check_point(24);
455 ercd = slp_tsk();
456 check_ercd(ercd, E_OK);
457
458 check_point(29);
459 ercd = ext_tsk();
460
461 check_point(0);
462
463 default:
464 check_point(0);
465 }
466 check_point(0);
467}
468
469void
470task3(intptr_t exinf)
471{
472 ER_UINT ercd;
473 PRI tskpri;
474 T_RMTX rmtx;
475
476 check_point(10);
477 ercd = loc_mtx(MTX1);
478 check_ercd(ercd, E_OK);
479
480 check_point(13);
481 ercd = ref_mtx(MTX1, &rmtx);
482 check_ercd(ercd, E_OK);
483
484 check_assert(rmtx.htskid == TASK3);
485
486 check_assert(rmtx.wtskid == TSK_NONE);
487
488 ercd = get_pri(TPRI_SELF, &tskpri);
489 check_ercd(ercd, E_OK);
490
491 check_assert(tskpri == HIGH_PRIORITY);
492
493 ercd = unl_mtx(MTX1);
494 check_ercd(ercd, E_OK);
495
496 ercd = slp_tsk();
497 check_ercd(ercd, E_OK);
498
499 check_point(27);
500 ercd = loc_mtx(MTX1);
501 check_ercd(ercd, E_OK);
502
503 check_point(31);
504 ercd = get_pri(TPRI_SELF, &tskpri);
505 check_ercd(ercd, E_OK);
506
507 check_assert(tskpri == HIGH_PRIORITY);
508
509 ercd = ext_tsk();
510
511 check_point(0);
512}
513
514void
515task4(intptr_t exinf)
516{
517 ER_UINT ercd;
518 PRI tskpri;
519 T_RMTX rmtx;
520
521 check_point(26);
522 ercd = loc_mtx(MTX2);
523 check_ercd(ercd, E_OK);
524
525 check_point(30);
526 ercd = ref_mtx(MTX1, &rmtx);
527 check_ercd(ercd, E_OK);
528
529 check_assert(rmtx.htskid == TASK3);
530
531 check_assert(rmtx.wtskid == TSK_NONE);
532
533 ercd = ref_mtx(MTX2, &rmtx);
534 check_ercd(ercd, E_OK);
535
536 check_assert(rmtx.htskid == TASK4);
537
538 check_assert(rmtx.wtskid == TSK_NONE);
539
540 ercd = get_pri(TPRI_SELF, &tskpri);
541 check_ercd(ercd, E_OK);
542
543 check_assert(tskpri == HIGH_PRIORITY);
544
545 ercd = ext_tsk();
546
547 check_point(0);
548}
Note: See TracBrowser for help on using the repository browser.