source: azure_iot_hub_f767zi/trunk/asp_baseplatform/test/test_sem2.c@ 457

Last change on this file since 457 was 457, checked in by coas-nagasima, 4 years ago

ファイルを追加

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/x-csrc;charset=UTF-8
File size: 11.2 KB
Line 
1/*
2 * TOPPERS Software
3 * Toyohashi Open Platform for Embedded Real-Time Systems
4 *
5 * Copyright (C) 2008-2013 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$
38 */
39
40/*
41 * セマフォ機能のテスト(2)
42 *
43 * 【テストの目的】
44 *
45 * isig_semを,sig_semとの違いを中心にテストする.
46 * pol_sem,twai_semを,wai_semとの違いを中心にテストする.
47 *
48 * 【テスト項目】
49 *
50 * (A) isig_semの静的エラーのテスト
51 * (A-1) タスクコンテキストからの呼出し
52 * (A-2) CPUロック状態からの呼出し
53 * (B) isig_semによりセマフォ待ち状態のタスクが待ち解除される
54 * (B-1) アイドル状態から,待ち解除されたタスクに切り換わる
55 * (B-2) 実行状態のタスクから,待ち解除されたタスクに切り換わる
56 * (B-3) ディスパッチ保留状態で,切り換わらない
57 * (B-4) 待ち解除されたタスクが強制待ち状態で,切り換わらない
58 * (B-5) 待ち解除されたタスクが優先度が低く,切り換わらない
59 * (C) pol_semの静的エラーのテスト
60 * (C-1) 非タスクコンテキストからの呼出し
61 * (C-2) CPUロック状態からの呼出し
62 * (C-3) ディスパッチ禁止状態からの呼出し(E_CTXエラーにならない)
63 * (C-4) 割込み優先度マスク全解除でない状態からの呼出し(E_CTXエラー
64 * にならない)
65 * (D) pol_semでポーリング失敗する
66 * (E) twai_semの静的エラーのテスト
67 * (E-1) 非タスクコンテキストからの呼出し
68 * (E-2) CPUロック状態からの呼出し
69 * (E-3) ディスパッチ禁止状態からの呼出し
70 * (E-4) 割込み優先度マスク全解除でない状態からの呼出し
71 * (E-5) tmoutが不正
72 * (F) twai_semでtmout=TMO_POLの時にポーリング失敗する
73 * (G) twai_semでtmout=TMO_FEVRの時にセマフォ待ち状態になる
74 * (H) twai_semでtmoutにタイムアウトを設定した時に,タイムアウト付きの
75 * セマフォ待ち状態になる
76 *
77 * 【使用リソース】
78 *
79 * TASK1: 中優先度タスク,TA_ACT属性
80 * TASK2: 高優先度タスク
81 * TASK3: 低優先度タスク
82 * TASK4: 中優先度タスク
83 * TASK5: 中優先度タスク
84 * ALM1: アラームハンドラ
85 * SEM1: TA_NULL属性,初期資源数1,最大資源数1
86 *
87 * 【テストシーケンス】
88 *
89 * == TASK1(優先度:中)==
90 * 1: isig_sem(SEM1) -> E_CTX ... (A-1)
91 * 2: loc_cpu()
92 * pol_sem(SEM1) -> E_CTX ... (C-2)
93 * twai_sem(SEM1, TMO_POL) -> E_CTX ... (E-2)
94 * unl_cpu()
95 * 3: dis_dsp()
96 * pol_sem(SEM1) ... (C-3)
97 * twai_sem(SEM1, TMO_POL) -> E_CTX ... (E-3)
98 * ena_dsp()
99 * 4: chg_ipm(TMAX_INTPRI)
100 * pol_sem(SEM1) -> E_TMOUT ... (C-4)(D)
101 * twai_sem(SEM1, TMO_POL) -> E_CTX ... (E-4)
102 * chg_ipm(TIPM_ENAALL)
103 * 5: twai_sem(SEM1, -2) -> E_PAR ... (E-5)
104 * twai_sem(SEM1, TMO_POL) -> E_TMOUT ... (F)
105 * 6: sta_alm(ALM1, 10)
106 * 7: twai_sem(SEM1, TMO_FEVR) ... (G)
107 * == ALM1-1 ==
108 * 8: pol_sem(SEM1) -> E_CTX ... (C-1)
109 * twai_sem(SEM1, TMO_POL) -> E_CTX ... (E-1)
110 * 9: iloc_cpu()
111 * isig_sem(SEM1) -> E_CTX ... (A-2)
112 * iunl_cpu()
113 * 10: isig_sem(SEM1) ... (B-1)
114 * RETURN
115 * == TASK1(続き)==
116 * 11: act_tsk(TASK3)
117 * 12: wai_sem(SEM1)
118 * == TASK3(優先度:低)==
119 * 13: sta_alm(ALM1, 10)
120 * call(wait_var())
121 * == ALM1-2 ==
122 * 14: isig_sem(SEM1) ... (B-2)
123 * call(signal_var())
124 * RETURN
125 * == TASK1(続き)==
126 * 15: wai_sem(SEM1)
127 * == TASK3(続き)==
128 * 16: sta_alm(ALM1, 10)
129 * dis_dsp()
130 * call(wait_var())
131 * == ALM1-3 ==
132 * 17: isig_sem(SEM1) ... (B-3)
133 * call(signal_var())
134 * RETURN
135 * == TASK3(続き)==
136 * 18: ena_dsp()
137 * == TASK1(続き)==
138 * 19: wai_sem(SEM1)
139 * == TASK3(続き)==
140 * 20: sta_alm(ALM1, 10)
141 * sus_tsk(TASK1)
142 * call(wait_var())
143 * == ALM1-4 ==
144 * 21: isig_sem(SEM1) ... (B-4)
145 * call(signal_var())
146 * RETURN
147 * == TASK3(続き)==
148 * 22: rsm_tsk(TASK1)
149 * == TASK1(続き)==
150 * 23: act_tsk(TASK2)
151 * == TASK2(優先度:高)==
152 * 24: tslp_tsk(10) -> E_TMOUT
153 * == TASK1(続き)==
154 * 25: wai_sem(SEM1)
155 * == TASK3(続き)==
156 * 26: ext_tsk() -> noreturn
157 * == TASK2(続き)==
158 * 27: sta_alm(ALM1, 10)
159 * call(wait_var())
160 * == ALM1-5 ==
161 * 28: isig_sem(SEM1) ... (B-5)
162 * call(signal_var())
163 * RETURN
164 * == TASK2(続き)==
165 * 29: ext_tsk() -> noreturn
166 * == TASK1(続き)==
167 * 30: sta_alm(ALM1, 10)
168 * 31: twai_sem(SEM1, 100) -> E_RLWAI
169 * == ALM1-6 ==
170 * 32: irel_wai(TASK1)
171 * RETURN
172 * == TASK1(続き)==
173 * 33: sta_alm(ALM1, 100)
174 * 34: twai_sem(SEM1, 10) -> E_TMOUT ... (H)
175 * 35: stp_alm(ALM1)
176 * 36: END
177 */
178
179#include <kernel.h>
180#include <test_lib.h>
181#include <t_syslog.h>
182#include "kernel_cfg.h"
183#include "test_sem2.h"
184
185static volatile bool_t flagvar;
186
187static void
188wait_var(void)
189{
190 flagvar = false;
191 while (!flagvar);
192}
193
194static void
195signal_var(void)
196{
197 flagvar = true;
198}
199
200/* DO NOT DELETE THIS LINE -- gentest depends on it. */
201
202static uint_t alarm1_count = 0;
203
204void
205alarm1_handler(intptr_t exinf)
206{
207 ER_UINT ercd;
208
209 switch (++alarm1_count) {
210 case 1:
211 check_point(8);
212 ercd = pol_sem(SEM1);
213 check_ercd(ercd, E_CTX);
214
215 ercd = twai_sem(SEM1, TMO_POL);
216 check_ercd(ercd, E_CTX);
217
218 check_point(9);
219 ercd = iloc_cpu();
220 check_ercd(ercd, E_OK);
221
222 ercd = isig_sem(SEM1);
223 check_ercd(ercd, E_CTX);
224
225 ercd = iunl_cpu();
226 check_ercd(ercd, E_OK);
227
228 check_point(10);
229 ercd = isig_sem(SEM1);
230 check_ercd(ercd, E_OK);
231
232 return;
233
234 check_point(0);
235
236 case 2:
237 check_point(14);
238 ercd = isig_sem(SEM1);
239 check_ercd(ercd, E_OK);
240
241 signal_var();
242
243 return;
244
245 check_point(0);
246
247 case 3:
248 check_point(17);
249 ercd = isig_sem(SEM1);
250 check_ercd(ercd, E_OK);
251
252 signal_var();
253
254 return;
255
256 check_point(0);
257
258 case 4:
259 check_point(21);
260 ercd = isig_sem(SEM1);
261 check_ercd(ercd, E_OK);
262
263 signal_var();
264
265 return;
266
267 check_point(0);
268
269 case 5:
270 check_point(28);
271 ercd = isig_sem(SEM1);
272 check_ercd(ercd, E_OK);
273
274 signal_var();
275
276 return;
277
278 check_point(0);
279
280 case 6:
281 check_point(32);
282 ercd = irel_wai(TASK1);
283 check_ercd(ercd, E_OK);
284
285 return;
286
287 check_point(0);
288
289 default:
290 check_point(0);
291 }
292 check_point(0);
293}
294
295void
296task1(intptr_t exinf)
297{
298 ER_UINT ercd;
299
300 test_start(__FILE__);
301
302 check_point(1);
303 ercd = isig_sem(SEM1);
304 check_ercd(ercd, E_CTX);
305
306 check_point(2);
307 ercd = loc_cpu();
308 check_ercd(ercd, E_OK);
309
310 ercd = pol_sem(SEM1);
311 check_ercd(ercd, E_CTX);
312
313 ercd = twai_sem(SEM1, TMO_POL);
314 check_ercd(ercd, E_CTX);
315
316 ercd = unl_cpu();
317 check_ercd(ercd, E_OK);
318
319 check_point(3);
320 ercd = dis_dsp();
321 check_ercd(ercd, E_OK);
322
323 ercd = pol_sem(SEM1);
324 check_ercd(ercd, E_OK);
325
326 ercd = twai_sem(SEM1, TMO_POL);
327 check_ercd(ercd, E_CTX);
328
329 ercd = ena_dsp();
330 check_ercd(ercd, E_OK);
331
332 check_point(4);
333 ercd = chg_ipm(TMAX_INTPRI);
334 check_ercd(ercd, E_OK);
335
336 ercd = pol_sem(SEM1);
337 check_ercd(ercd, E_TMOUT);
338
339 ercd = twai_sem(SEM1, TMO_POL);
340 check_ercd(ercd, E_CTX);
341
342 ercd = chg_ipm(TIPM_ENAALL);
343 check_ercd(ercd, E_OK);
344
345 check_point(5);
346 ercd = twai_sem(SEM1, -2);
347 check_ercd(ercd, E_PAR);
348
349 ercd = twai_sem(SEM1, TMO_POL);
350 check_ercd(ercd, E_TMOUT);
351
352 check_point(6);
353 ercd = sta_alm(ALM1, 10);
354 check_ercd(ercd, E_OK);
355
356 check_point(7);
357 ercd = twai_sem(SEM1, TMO_FEVR);
358 check_ercd(ercd, E_OK);
359
360 check_point(11);
361 ercd = act_tsk(TASK3);
362 check_ercd(ercd, E_OK);
363
364 check_point(12);
365 ercd = wai_sem(SEM1);
366 check_ercd(ercd, E_OK);
367
368 check_point(15);
369 ercd = wai_sem(SEM1);
370 check_ercd(ercd, E_OK);
371
372 check_point(19);
373 ercd = wai_sem(SEM1);
374 check_ercd(ercd, E_OK);
375
376 check_point(23);
377 ercd = act_tsk(TASK2);
378 check_ercd(ercd, E_OK);
379
380 check_point(25);
381 ercd = wai_sem(SEM1);
382 check_ercd(ercd, E_OK);
383
384 check_point(30);
385 ercd = sta_alm(ALM1, 10);
386 check_ercd(ercd, E_OK);
387
388 check_point(31);
389 ercd = twai_sem(SEM1, 100);
390 check_ercd(ercd, E_RLWAI);
391
392 check_point(33);
393 ercd = sta_alm(ALM1, 100);
394 check_ercd(ercd, E_OK);
395
396 check_point(34);
397 ercd = twai_sem(SEM1, 10);
398 check_ercd(ercd, E_TMOUT);
399
400 check_point(35);
401 ercd = stp_alm(ALM1);
402 check_ercd(ercd, E_OK);
403
404 check_finish(36);
405 check_point(0);
406}
407
408void
409task2(intptr_t exinf)
410{
411 ER_UINT ercd;
412
413 check_point(24);
414 ercd = tslp_tsk(10);
415 check_ercd(ercd, E_TMOUT);
416
417 check_point(27);
418 ercd = sta_alm(ALM1, 10);
419 check_ercd(ercd, E_OK);
420
421 wait_var();
422
423 check_point(29);
424 ercd = ext_tsk();
425
426 check_point(0);
427}
428
429void
430task3(intptr_t exinf)
431{
432 ER_UINT ercd;
433
434 check_point(13);
435 ercd = sta_alm(ALM1, 10);
436 check_ercd(ercd, E_OK);
437
438 wait_var();
439
440 check_point(16);
441 ercd = sta_alm(ALM1, 10);
442 check_ercd(ercd, E_OK);
443
444 ercd = dis_dsp();
445 check_ercd(ercd, E_OK);
446
447 wait_var();
448
449 check_point(18);
450 ercd = ena_dsp();
451 check_ercd(ercd, E_OK);
452
453 check_point(20);
454 ercd = sta_alm(ALM1, 10);
455 check_ercd(ercd, E_OK);
456
457 ercd = sus_tsk(TASK1);
458 check_ercd(ercd, E_OK);
459
460 wait_var();
461
462 check_point(22);
463 ercd = rsm_tsk(TASK1);
464 check_ercd(ercd, E_OK);
465
466 check_point(26);
467 ercd = ext_tsk();
468
469 check_point(0);
470}
Note: See TracBrowser for help on using the repository browser.