OSDN Git Service

マルチプロジェクト型にレポジトリを変更するために移動した
[toppersasp4lpc/asp.git] / asp / extension / mutex / test / test_mutex8.c
1 /*
2  *  TOPPERS Software
3  *      Toyohashi Open Platform for Embedded Real-Time Systems
4  * 
5  *  Copyright (C) 2009 by Embedded and Real-Time Systems Laboratory
6  *              Graduate School of Information Science, Nagoya Univ., JAPAN
7  * 
8  *  上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
9  *  ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
10  *  変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
11  *  (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
12  *      権表示,この利用条件および下記の無保証規定が,そのままの形でソー
13  *      スコード中に含まれていること.
14  *  (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
15  *      用できる形で再配布する場合には,再配布に伴うドキュメント(利用
16  *      者マニュアルなど)に,上記の著作権表示,この利用条件および下記
17  *      の無保証規定を掲載すること.
18  *  (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
19  *      用できない形で再配布する場合には,次のいずれかの条件を満たすこ
20  *      と.
21  *    (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
22  *        作権表示,この利用条件および下記の無保証規定を掲載すること.
23  *    (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
24  *        報告すること.
25  *  (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
26  *      害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
27  *      また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
28  *      由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
29  *      免責すること.
30  * 
31  *  本ソフトウェアは,無保証で提供されているものである.上記著作権者お
32  *  よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
33  *  に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
34  *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
35  *  の責任を負わない.
36  * 
37  *  @(#) $Id: test_mutex8.c 1696 2010-01-01 16:01:25Z ertl-hiro $
38  */
39
40 /* 
41  *              ミューテックスのテスト(8)
42  *
43  * 【テストの目的】
44  *
45  *  優先度上限ミューテックスに対して,chg_priに伴うミューテックス関連の
46  *  優先度変更処理を網羅的にテストする.ただし,change_priorityと
47  *  mutex_calc_priorityの内容には踏み込まない.
48  *
49  * 【テスト項目】
50  *
51  *      (A) タスクのベース優先度の変更処理(chg_pri)
52  *              (A-1) 対象タスクが実行できる状態で,ミューテックスをロックして
53  *                        いない場合に,同じ優先度内での優先順位が最低になること
54  *              (A-2) 対象タスクが実行できる状態で,優先度上限ミューテックス以
55  *                        外のミューテックスのみをロックしている場合に,同じ優先度
56  *                        内での優先順位が最低になること
57  *              (A-3) 対象タスクが実行できる状態で,優先度上限ミューテックスを
58  *                        ロックしている場合に,同じ優先度内での優先順位が変わらな
59  *                        いこと
60  *              (A-4) 対象タスクが待ち状態で,優先度順の待ち行列につながれてお
61  *                        り,ミューテックスをロックしていない場合に,優先度が正し
62  *                        く変更され,同じ優先度内での順序が最後になること
63  *              (A-5) 対象タスクが待ち状態で,優先度順の待ち行列につながれてお
64  *                        り,優先度上限ミューテックス以外のミューテックスのみをロッ
65  *                        クしている場合に,優先度が正しく変更され,同じ優先度内で
66  *                        の順序が最後になること
67  *              (A-6) 対象タスクが待ち状態で,優先度順の待ち行列につながれてお
68  *                        り,優先度上限ミューテックスをロックしている場合に,同じ
69  *                        優先度内での順序が変わらないこと
70  *      (B) タスクのベース優先度の変更処理(chg_pri)のE_ILUSEエラー
71  *              (B-1) 対象タスクがロックしているミューテックスの上限優先度より
72  *                        も,ベース優先度を高くしようとした時,E_ILUSEエラーになる
73  *                        こと
74  *              (B-2) 対象タスクが優先度上限ミューテックスをロックしていても,
75  *                        ロックしているミューテックスの上限優先度よりも,ベース優
76  *                        先度を高くしようとしない場合には,E_ILUSEエラーにならない
77  *                        こと
78  *              (B-3) 対象タスクがロックを待っているミューテックスの上限優先度
79  *                        よりも,ベース優先度を高くしようとした時,E_ILUSEエラーに
80  *                        なること
81  *              (B-4) 対象タスクが優先度上限ミューテックス待ちであっても,ロッ
82  *                        クを待っているミューテックスの上限優先度よりも,ベース優
83  *                        先度を高くしようとしない場合には,E_ILUSEエラーにならない
84  *                        こと
85  *
86  * 【テスト項目の実現方法】
87  *
88  *      (A-1)
89  *              中優先度タスク(TASK1)が実行可能状態の時に,高優先度タスク
90  *              (TASK5)からTASK1を低優先度にchg_priすると,実行可能状態の他の
91  *              低優先度タスク(TASK4)よりも,優先順位が低くなることを確認する.
92  *      (A-2)
93  *              中優先度タスク(TASK1)が優先度順ミューテックス(MTX3)をロック
94  *              し,実行可能状態の時に,高優先度タスク(TASK5)からTASK1を低優
95  *              先度にchg_priすると,実行可能状態の他の低優先度タスク(TASK4)
96  *              よりも,優先順位が低くなることを確認する.
97  *      (A-3)
98  *              中優先度タスク(TASK1)が中優先度上限ミューテックス(MTX1)をロッ
99  *              クし,実行可能状態の時に,高優先度タスク(TASK5)からTASK1を低
100  *              優先度にchg_priすると,TASK1の優先度が変化しないことを確認する.
101  *              また,実行可能状態の中優先度タスクを2つ(TASK2,TASK3)を用意し
102  *              ておき,優先順位が変わらないことを確認する.
103  *      (A-4)
104  *              中優先度タスク(TASK1)が高優先度上限ミューテックス(MTX2)を待っ
105  *              ている時に,高優先度タスク(TASK5)からTASK1を低優先度に
106  *              chg_priすると,MTX2を待っている他の低優先度タスク(TASK4)より
107  *              も,待ち行列中での順序が後になることを確認する.
108  *      (A-5)
109  *              中優先度タスク(TASK1)が優先度順ミューテックス(MTX3)をロック
110  *              し,高優先度上限ミューテックス(MTX2)を待っている時に,高優先度タ
111  *              スク(TASK5)からTASK1を低優先度にchg_priすると,MTX2を待ってい
112  *              る他の低優先度タスク(TASK4)よりも,待ち行列中での順序が変わら
113  *              ないことを確認する.
114  *      (A-6)
115  *              中優先度タスク(TASK1)が中優先度上限ミューテックス(MTX1)をロッ
116  *              クし,高優先度上限ミューテックス(MTX2)を待っている時に,高優
117  *              先度タスク(TASK5)からTASK1を低優先度にchg_priすると,TASK1の
118  *              優先度が変化しないことを確認する.また,MTX2を待っている中優先
119  *              度タスクを2つ(TASK2,TASK3)を用意しておき,待ち行列中での順序
120  *              が変わらないことを確認する.
121  *      (B-1)
122  *              中優先度タスク(TASK1)が中優先度上限ミューテックス(MTX1)をロッ
123  *              クし,実行可能状態の時に,高優先度タスク(TASK5)からTASK1を高
124  *              優先度にchg_priすると,E_ILUSEエラーになることを確認する.
125  *      (B-2)
126  *              (A-3)のテスト項目で,chg_priがE_ILUSEエラーにならないことで確認
127  *              できている.
128  *      (B-3)
129  *              中優先度タスク(TASK2)が中優先度上限ミューテックス(MTX1)のロッ
130  *              クを待っている時に,高優先度タスク(TASK5)からTASK2を高優先度
131  *              にchg_priすると,E_ILUSEエラーになることを確認する.
132  *      (B-4)
133  *              (A-6)のテスト項目で,chg_priがE_ILUSEエラーにならないことで確認
134  *              できている.
135  *
136  * 【使用リソース】
137  *
138  *      TASK1: 中優先度タスク,メインタスク,最初から起動
139  *      TASK2: 中優先度タスク
140  *      TASK3: 中優先度タスク
141  *      TASK4: 低優先度タスク
142  *      TASK5: 高優先度タスク
143  *      MTX1: ミューテックス(TA_CEILING属性,上限は中優先度)
144  *      MTX2: ミューテックス(TA_CEILING属性,上限は高優先度)
145  *      MTX3: ミューテックス(TA_TPRI属性)
146  *
147  * 【テストシーケンス】
148  *
149  *      == TASK1(優先度:中)==
150  *              call(set_bit_func(bit_mutex))
151  *      1:      act_tsk(TASK4)
152  *      2:      act_tsk(TASK5)
153  *      //              高:TASK5,中:TASK1,低:TASK4
154  *      == TASK5(優先度:高)==
155  *      3:      chg_pri(TASK1, LOW_PRIORITY)            ... (A-1)
156  *      //              高:TASK5,低:TASK4→TASK1
157  *      4:      slp_tsk()
158  *      == TASK4(優先度:低)==
159  *      5:      slp_tsk()
160  *      == TASK1(続き)==
161  *      6:      chg_pri(TSK_SELF, TPRI_INI)
162  *
163  *      7:      loc_mtx(MTX3)
164  *      8:      wup_tsk(TASK4)
165  *      9:      wup_tsk(TASK5)
166  *      //              高:TASK5,中:TASK1,低:TASK4,MTX3:TASK1
167  *      == TASK5(続き)==
168  *      10:     chg_pri(TASK1, LOW_PRIORITY)            ... (A-2)
169  *      //              高:TASK5,低:TASK4→TASK1,MTX3:TASK1
170  *      11:     slp_tsk()
171  *      == TASK4(続き)==
172  *      12:     slp_tsk()
173  *      == TASK1(続き)==
174  *      13:     unl_mtx(MTX3)
175  *              chg_pri(TSK_SELF, TPRI_INI)
176  *
177  *      14:     loc_mtx(MTX1)
178  *      15:     act_tsk(TASK2)
179  *      16:     dis_dsp()
180  *      17:     rot_rdq(MID_PRIORITY)
181  *      18:     act_tsk(TASK3)
182  *      //              中:TASK2→TASK1→TASK3,MTX1:TASK1
183  *      19:     wup_tsk(TASK5)
184  *      //              高:TASK5,中:TASK2→TASK1→TASK3,MTX1:TASK1
185  *      20:     ena_dsp()
186  *      == TASK5(続き)==
187  *      21:     chg_pri(TASK1, LOW_PRIORITY)            ... (A-3)(B-2)
188  *      //              高:TASK5,中:TASK2→TASK1→TASK3,MTX1:TASK1
189  *              get_pri(TASK1, &tskpri)
190  *              assert(tskpri == MID_PRIORITY)
191  *      22:     slp_tsk()
192  *      //              中:TASK2→TASK1→TASK3,MTX1:TASK1
193  *      == TASK2(続き)==
194  *      23:     slp_tsk()
195  *      //              中:TASK1→TASK3,MTX1:TASK1
196  *      == TASK1(続き)==
197  *      24:     unl_mtx(MTX1)
198  *      //              中:TASK3,低:TASK1
199  *      == TASK3(続き)==
200  *      25:     slp_tsk()
201  *      == TASK1(続き)==
202  *      26:     chg_pri(TSK_SELF, TPRI_INI)
203  *
204  *      27:     wup_tsk(TASK5)
205  *      == TASK5(続き)==
206  *      28:     loc_mtx(MTX2)
207  *      29:     tslp_tsk(10) -> E_TMOUT
208  *      == TASK1(続き)==
209  *      30:     wup_tsk(TASK4)
210  *      31:     loc_mtx(MTX2)
211  *      == TASK4(続き)==
212  *      32:     loc_mtx(MTX2)
213  *      //              MTX2:TASK5→TASK1→TASK4
214  *      //              タイムアウト待ち
215  *      //              高:TASK5,MTX2:TASK5→TASK1→TASK4
216  *      == TASK5(続き)==
217  *      33:     chg_pri(TASK1, LOW_PRIORITY)            ... (A-4)
218  *      //              高:TASK5,MTX2:TASK5→TASK4→TASK1
219  *      34:     unl_mtx(MTX2)
220  *      //              高:TASK5→TASK4,MTX2:TASK4→TASK1
221  *      35:     slp_tsk()
222  *      //              高:TASK4,MTX2:TASK4→TASK1
223  *      == TASK4(続き)==
224  *      36:     unl_mtx(MTX2)
225  *      //              高:TASK1,低:TASK4,MTX2:TASK1
226  *      == TASK1(続き)==
227  *      37:     unl_mtx(MTX2)
228  *      //              低:TASK1→TASK4
229  *      38:     chg_pri(TSK_SELF, TPRI_INI)
230  *
231  *      39:     loc_mtx(MTX3)
232  *      40:     wup_tsk(TASK5)
233  *      //              高:TASK5,中:TASK1,低:TASK4,MTX3:TASK1
234  *      == TASK5(続き)==
235  *      41:     loc_mtx(MTX2)
236  *      42:     tslp_tsk(10) -> E_TMOUT
237  *      == TASK1(続き)==
238  *      43:     loc_mtx(MTX2)
239  *      == TASK4(続き)==
240  *      44:     loc_mtx(MTX2)
241  *      //              MTX2:TASK5→TASK1→TASK4,MTX3:TASK1
242  *      //              タイムアウト待ち
243  *      //              高:TASK5,MTX2:TASK5→TASK1→TASK4,MTX3:TASK1
244  *      == TASK5(続き)==
245  *      45:     chg_pri(TASK1, LOW_PRIORITY)            ... (A-5)
246  *      //              高:TASK5,MTX2:TASK5→TASK4→TASK1,MTX3:TASK1
247  *      46:     unl_mtx(MTX2)
248  *      //              高:TASK5→TASK4,MTX2:TASK4→TASK1,MTX3:TASK1
249  *      47:     slp_tsk()
250  *      //              高:TASK4,MTX2:TASK4→TASK1,MTX3:TASK1
251  *      == TASK4(続き)==
252  *      48:     unl_mtx(MTX2)
253  *      //              高:TASK1,低:TASK4,MTX2:TASK1,MTX3:TASK1
254  *      == TASK1(続き)==
255  *      49:     unl_mtx(MTX2)
256  *      //              低:TASK1→TASK4,MTX3:TASK1
257  *      50:     unl_mtx(MTX3)
258  *      //              低:TASK1→TASK4
259  *      51:     ter_tsk(TASK4)
260  *      52:     chg_pri(TSK_SELF, TPRI_INI)
261  *
262  *      53:     loc_mtx(MTX1)
263  *      54:     wup_tsk(TASK5)
264  *      //              高:TASK5,中:TASK1,MTX1:TASK1
265  *      == TASK5(続き)==
266  *      55:     loc_mtx(MTX2)
267  *      56:     tslp_tsk(10) -> E_TMOUT
268  *      //              中:TASK1,MTX1:TASK1,MTX2:TASK5
269  *      == TASK1(続き)==
270  *      57:     wup_tsk(TASK2)
271  *      58:     rot_rdq(MID_PRIORITY)
272  *      == TASK2(続き)==
273  *      59:     loc_mtx(MTX2)
274  *      //              中:TASK1,MTX1:TASK1,MTX2:TASK5→TASK2
275  *      == TASK1(続き)==
276  *      60:     wup_tsk(TASK3)
277  *      61:     loc_mtx(MTX2)
278  *      //              中:TASK3,MTX1:TASK1,MTX2:TASK5→TASK2→TASK1
279  *      == TASK3(続き)==
280  *      62:     loc_mtx(MTX2)
281  *      //              MTX1:TASK1,MTX2:TASK5→TASK2→TASK1→TASK3
282  *      //              タイムアウト待ち
283  *      //              高:TASK5,MTX1:TASK1,MTX2:TASK5→TASK2→TASK1→TASK3
284  *      == TASK5(続き)==
285  *      63:     chg_pri(TASK1, LOW_PRIORITY)            ... (A-6)(B-4)
286  *      //              高:TASK5,MTX1:TASK1,MTX2:TASK5→TASK2→TASK1→TASK3
287  *              get_pri(TASK1, &tskpri)
288  *              assert(tskpri == MID_PRIORITY)
289  *      64:     unl_mtx(MTX2)
290  *      //              高:TASK5→TASK2,MTX1:TASK1,MTX2:TASK2→TASK1→TASK3
291  *      65:     slp_tsk()
292  *      //              高:TASK2,MTX1:TASK1,MTX2:TASK2→TASK1→TASK3
293  *      == TASK2(続き)==
294  *      66:     unl_mtx(MTX2)
295  *      //              高:TASK1,中:TASK2,MTX1:TASK1,MTX2:TASK1→TASK3
296  *      == TASK1(続き)==
297  *      67:     unl_mtx(MTX2)
298  *      //              高:TASK3,中:TASK1→TASK2,MTX1:TASK1,MTX2:TASK3
299  *      == TASK3(続き)==
300  *      68:     unl_mtx(MTX2)
301  *      //              中:TASK3→TASK1→TASK2,MTX1:TASK1
302  *      69:     ext_tsk() -> noreturn
303  *      //              中:TASK1→TASK2,MTX1:TASK1
304  *      == TASK1(続き)==
305  *      70:     chg_pri(TSK_SELF, TPRI_INI)
306  *      //              中:TASK1→TASK2,MTX1:TASK1
307  *
308  *      71:     rot_rdq(MID_PRIORITY)
309  *      //              中:TASK2→TASK1,MTX1:TASK1
310  *      == TASK2(続き)==
311  *      72:     loc_mtx(MTX1)
312  *      //              中:TASK1,MTX1:TASK1→TASK2
313  *      == TASK1(続き)==
314  *      73:     wup_tsk(TASK5)
315  *      //              高:TASK5,中:TASK1,MTX1:TASK1→TASK2
316  *      == TASK5(続き)==
317  *      74:     chg_pri(TASK1, HIGH_PRIORITY) -> E_ILUSE        ... (B-1)
318  *      75:     chg_pri(TASK2, HIGH_PRIORITY) -> E_ILUSE        ... (B-3)
319  *      76:     ext_tsk() -> noreturn
320  *      //              中:TASK1,MTX1:TASK1→TASK2
321  *      == TASK1(続き)==
322  *      77:     unl_mtx(MTX1)
323  *      //              中:TASK1→TASK2,MTX1:TASK2
324  *      78:     ext_tsk() -> noreturn
325  *      == TASK2(続き)==
326  *      79:     unl_mtx(MTX1)
327  *      80:     END
328  */
329
330 #include <kernel.h>
331 #include <t_syslog.h>
332 #include "syssvc/logtask.h"
333 #include "kernel_cfg.h"
334 #include "test_lib.h"
335 #include "test_mutex8.h"
336
337 extern ER       bit_mutex(void);
338
339 void
340 task1(intptr_t exinf)
341 {
342         ER              ercd;
343
344         set_bit_func(bit_mutex);
345
346         check_point(1);
347         ercd = act_tsk(TASK4);
348         check_ercd(ercd, E_OK);
349
350         check_point(2);
351         ercd = act_tsk(TASK5);
352         check_ercd(ercd, E_OK);
353
354         check_point(6);
355         ercd = chg_pri(TSK_SELF, TPRI_INI);
356         check_ercd(ercd, E_OK);
357
358         check_point(7);
359         ercd = loc_mtx(MTX3);
360         check_ercd(ercd, E_OK);
361
362         check_point(8);
363         ercd = wup_tsk(TASK4);
364         check_ercd(ercd, E_OK);
365
366         check_point(9);
367         ercd = wup_tsk(TASK5);
368         check_ercd(ercd, E_OK);
369
370         check_point(13);
371         ercd = unl_mtx(MTX3);
372         check_ercd(ercd, E_OK);
373
374         ercd = chg_pri(TSK_SELF, TPRI_INI);
375         check_ercd(ercd, E_OK);
376
377         check_point(14);
378         ercd = loc_mtx(MTX1);
379         check_ercd(ercd, E_OK);
380
381         check_point(15);
382         ercd = act_tsk(TASK2);
383         check_ercd(ercd, E_OK);
384
385         check_point(16);
386         ercd = dis_dsp();
387         check_ercd(ercd, E_OK);
388
389         check_point(17);
390         ercd = rot_rdq(MID_PRIORITY);
391         check_ercd(ercd, E_OK);
392
393         check_point(18);
394         ercd = act_tsk(TASK3);
395         check_ercd(ercd, E_OK);
396
397         check_point(19);
398         ercd = wup_tsk(TASK5);
399         check_ercd(ercd, E_OK);
400
401         check_point(20);
402         ercd = ena_dsp();
403         check_ercd(ercd, E_OK);
404
405         check_point(24);
406         ercd = unl_mtx(MTX1);
407         check_ercd(ercd, E_OK);
408
409         check_point(26);
410         ercd = chg_pri(TSK_SELF, TPRI_INI);
411         check_ercd(ercd, E_OK);
412
413         check_point(27);
414         ercd = wup_tsk(TASK5);
415         check_ercd(ercd, E_OK);
416
417         check_point(30);
418         ercd = wup_tsk(TASK4);
419         check_ercd(ercd, E_OK);
420
421         check_point(31);
422         ercd = loc_mtx(MTX2);
423         check_ercd(ercd, E_OK);
424
425         check_point(37);
426         ercd = unl_mtx(MTX2);
427         check_ercd(ercd, E_OK);
428
429         check_point(38);
430         ercd = chg_pri(TSK_SELF, TPRI_INI);
431         check_ercd(ercd, E_OK);
432
433         check_point(39);
434         ercd = loc_mtx(MTX3);
435         check_ercd(ercd, E_OK);
436
437         check_point(40);
438         ercd = wup_tsk(TASK5);
439         check_ercd(ercd, E_OK);
440
441         check_point(43);
442         ercd = loc_mtx(MTX2);
443         check_ercd(ercd, E_OK);
444
445         check_point(49);
446         ercd = unl_mtx(MTX2);
447         check_ercd(ercd, E_OK);
448
449         check_point(50);
450         ercd = unl_mtx(MTX3);
451         check_ercd(ercd, E_OK);
452
453         check_point(51);
454         ercd = ter_tsk(TASK4);
455         check_ercd(ercd, E_OK);
456
457         check_point(52);
458         ercd = chg_pri(TSK_SELF, TPRI_INI);
459         check_ercd(ercd, E_OK);
460
461         check_point(53);
462         ercd = loc_mtx(MTX1);
463         check_ercd(ercd, E_OK);
464
465         check_point(54);
466         ercd = wup_tsk(TASK5);
467         check_ercd(ercd, E_OK);
468
469         check_point(57);
470         ercd = wup_tsk(TASK2);
471         check_ercd(ercd, E_OK);
472
473         check_point(58);
474         ercd = rot_rdq(MID_PRIORITY);
475         check_ercd(ercd, E_OK);
476
477         check_point(60);
478         ercd = wup_tsk(TASK3);
479         check_ercd(ercd, E_OK);
480
481         check_point(61);
482         ercd = loc_mtx(MTX2);
483         check_ercd(ercd, E_OK);
484
485         check_point(67);
486         ercd = unl_mtx(MTX2);
487         check_ercd(ercd, E_OK);
488
489         check_point(70);
490         ercd = chg_pri(TSK_SELF, TPRI_INI);
491         check_ercd(ercd, E_OK);
492
493         check_point(71);
494         ercd = rot_rdq(MID_PRIORITY);
495         check_ercd(ercd, E_OK);
496
497         check_point(73);
498         ercd = wup_tsk(TASK5);
499         check_ercd(ercd, E_OK);
500
501         check_point(77);
502         ercd = unl_mtx(MTX1);
503         check_ercd(ercd, E_OK);
504
505         check_point(78);
506         ercd = ext_tsk();
507
508         check_point(0);
509 }
510
511 void
512 task2(intptr_t exinf)
513 {
514         ER              ercd;
515
516         check_point(23);
517         ercd = slp_tsk();
518         check_ercd(ercd, E_OK);
519
520         check_point(59);
521         ercd = loc_mtx(MTX2);
522         check_ercd(ercd, E_OK);
523
524         check_point(66);
525         ercd = unl_mtx(MTX2);
526         check_ercd(ercd, E_OK);
527
528         check_point(72);
529         ercd = loc_mtx(MTX1);
530         check_ercd(ercd, E_OK);
531
532         check_point(79);
533         ercd = unl_mtx(MTX1);
534         check_ercd(ercd, E_OK);
535
536         check_finish(80);
537
538         check_point(0);
539 }
540
541 void
542 task3(intptr_t exinf)
543 {
544         ER              ercd;
545
546         check_point(25);
547         ercd = slp_tsk();
548         check_ercd(ercd, E_OK);
549
550         check_point(62);
551         ercd = loc_mtx(MTX2);
552         check_ercd(ercd, E_OK);
553
554         check_point(68);
555         ercd = unl_mtx(MTX2);
556         check_ercd(ercd, E_OK);
557
558         check_point(69);
559         ercd = ext_tsk();
560
561         check_point(0);
562 }
563
564 void
565 task4(intptr_t exinf)
566 {
567         ER              ercd;
568
569         check_point(5);
570         ercd = slp_tsk();
571         check_ercd(ercd, E_OK);
572
573         check_point(12);
574         ercd = slp_tsk();
575         check_ercd(ercd, E_OK);
576
577         check_point(32);
578         ercd = loc_mtx(MTX2);
579         check_ercd(ercd, E_OK);
580
581         check_point(36);
582         ercd = unl_mtx(MTX2);
583         check_ercd(ercd, E_OK);
584
585         check_point(44);
586         ercd = loc_mtx(MTX2);
587         check_ercd(ercd, E_OK);
588
589         check_point(48);
590         ercd = unl_mtx(MTX2);
591         check_ercd(ercd, E_OK);
592
593         check_point(0);
594 }
595
596 void
597 task5(intptr_t exinf)
598 {
599         ER              ercd;
600         PRI             tskpri;
601
602         check_point(3);
603         ercd = chg_pri(TASK1, LOW_PRIORITY);
604         check_ercd(ercd, E_OK);
605
606         check_point(4);
607         ercd = slp_tsk();
608         check_ercd(ercd, E_OK);
609
610         check_point(10);
611         ercd = chg_pri(TASK1, LOW_PRIORITY);
612         check_ercd(ercd, E_OK);
613
614         check_point(11);
615         ercd = slp_tsk();
616         check_ercd(ercd, E_OK);
617
618         check_point(21);
619         ercd = chg_pri(TASK1, LOW_PRIORITY);
620         check_ercd(ercd, E_OK);
621
622         ercd = get_pri(TASK1, &tskpri);
623         check_ercd(ercd, E_OK);
624         check_assert(tskpri == MID_PRIORITY);
625
626         check_point(22);
627         ercd = slp_tsk();
628         check_ercd(ercd, E_OK);
629
630         check_point(28);
631         ercd = loc_mtx(MTX2);
632         check_ercd(ercd, E_OK);
633
634         check_point(29);
635         ercd = tslp_tsk(10);
636         check_ercd(ercd, E_TMOUT);
637
638         check_point(33);
639         ercd = chg_pri(TASK1, LOW_PRIORITY);
640         check_ercd(ercd, E_OK);
641
642         check_point(34);
643         ercd = unl_mtx(MTX2);
644         check_ercd(ercd, E_OK);
645
646         check_point(35);
647         ercd = slp_tsk();
648         check_ercd(ercd, E_OK);
649
650         check_point(41);
651         ercd = loc_mtx(MTX2);
652         check_ercd(ercd, E_OK);
653
654         check_point(42);
655         ercd = tslp_tsk(10);
656         check_ercd(ercd, E_TMOUT);
657
658         check_point(45);
659         ercd = chg_pri(TASK1, LOW_PRIORITY);
660         check_ercd(ercd, E_OK);
661
662         check_point(46);
663         ercd = unl_mtx(MTX2);
664         check_ercd(ercd, E_OK);
665
666         check_point(47);
667         ercd = slp_tsk();
668         check_ercd(ercd, E_OK);
669
670         check_point(55);
671         ercd = loc_mtx(MTX2);
672         check_ercd(ercd, E_OK);
673
674         check_point(56);
675         ercd = tslp_tsk(10);
676         check_ercd(ercd, E_TMOUT);
677
678         check_point(63);
679         ercd = chg_pri(TASK1, LOW_PRIORITY);
680         check_ercd(ercd, E_OK);
681
682         ercd = get_pri(TASK1, &tskpri);
683         check_ercd(ercd, E_OK);
684         check_assert(tskpri == MID_PRIORITY);
685
686         check_point(64);
687         ercd = unl_mtx(MTX2);
688         check_ercd(ercd, E_OK);
689
690         check_point(65);
691         ercd = slp_tsk();
692         check_ercd(ercd, E_OK);
693
694         check_point(74);
695         ercd = chg_pri(TASK1, HIGH_PRIORITY);
696         check_ercd(ercd, E_ILUSE);
697
698         check_point(75);
699         ercd = chg_pri(TASK2, HIGH_PRIORITY);
700         check_ercd(ercd, E_ILUSE);
701
702         check_point(76);
703         ercd = ext_tsk();
704
705         check_point(0);
706 }