source: atk2-sc3_fl850f1l/sample/sample2.c@ 165

Last change on this file since 165 was 117, checked in by ertl-ishikawa, 9 years ago

ATK2-SC3 1.3.2 FL850F1L(RH850F1L)依存部(GCC/GHS/CCRH)を追加

File size: 24.8 KB
Line 
1/*
2 * TOPPERS ATK2
3 * Toyohashi Open Platform for Embedded Real-Time Systems
4 * Automotive Kernel Version 2
5 *
6 * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
7 * Toyohashi Univ. of Technology, JAPAN
8 * Copyright (C) 2004-2015 by Center for Embedded Computing Systems
9 * Graduate School of Information Science, Nagoya Univ., JAPAN
10 * Copyright (C) 2011-2015 by FUJI SOFT INCORPORATED, JAPAN
11 * Copyright (C) 2011-2013 by Spansion LLC, USA
12 * Copyright (C) 2011-2015 by NEC Communication Systems, Ltd., JAPAN
13 * Copyright (C) 2011-2015 by Panasonic Advanced Technology Development Co., Ltd., JAPAN
14 * Copyright (C) 2011-2014 by Renesas Electronics Corporation, JAPAN
15 * Copyright (C) 2011-2015 by Sunny Giken Inc., JAPAN
16 * Copyright (C) 2011-2015 by TOSHIBA CORPORATION, JAPAN
17 * Copyright (C) 2004-2015 by Witz Corporation
18 * Copyright (C) 2014-2015 by AISIN COMCRUISE Co., Ltd., JAPAN
19 * Copyright (C) 2014-2015 by eSOL Co.,Ltd., JAPAN
20 * Copyright (C) 2014-2015 by SCSK Corporation, JAPAN
21 *
22 * 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
23 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
24 * 変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
25 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
26 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
27 * スコード中に含まれていること.
28 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
29 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
30 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
31 * の無保証規定を掲載すること.
32 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
33 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ
34 * と.
35 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
36 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
37 * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
38 * 報告すること.
39 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
40 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
41 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
42 * 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
43 * 免責すること.
44 *
45 * 本ソフトウェアは,AUTOSAR(AUTomotive Open System ARchitecture)仕
46 * 様に基づいている.上記の許諾は,AUTOSARの知的財産権を許諾するもので
47 * はない.AUTOSARは,AUTOSAR仕様に基づいたソフトウェアを商用目的で利
48 * 用する者に対して,AUTOSARパートナーになることを求めている.
49 *
50 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
51 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
52 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
53 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
54 * の責任を負わない.
55 *
56 * $Id: sample2.c 187 2015-06-25 03:39:04Z t_ishikawa $
57 */
58
59/*
60 * 非信頼OSアプリケーション所属サンプルプログラムの本体
61 *
62 * サンプルプログラムの動作はsample1.cのコメント参照
63 * 本ファイルは非信頼OSアプリケーションに所属している
64 * オブジェクトを記述している
65 */
66
67#include "sample.h"
68#include "sample2.h"
69#include "Ioc.h"
70
71#define GetHwCnt(x, y)
72
73/*
74 * 内部関数プロトタイプ宣言
75 */
76uint8 GetCommand(void);
77void PutActTsk(uint8 task_no);
78void PutActNonPriTsk(void);
79void PutTermTsk(uint8 task_no);
80void PutChainTsk(uint8 from_task_no, uint8 to_task_no);
81void PutSchedule(void);
82void PutTaskID(void);
83void PutTaskState(uint8 task_no);
84void PutDisAllInt(void);
85void PutSusAllInt(void);
86void PutSusOSInt(void);
87void PutHwCnt3(void);
88void PutGetCntRes(void);
89void PutGetTskRes(void);
90void PutRelTskRes(void);
91void PutSetEvt(uint8 task_no);
92void PutClrEvt(uint8 task_no);
93void PutGetEvt(uint8 task_no);
94void PutWaitEvt(uint8 task_no);
95void PutArmBase(void);
96void PutArmTick(void);
97void PutSetRel(uint8 alarm_no, uint8 tick_no, uint8 cycle_no);
98void PutCanArm(void);
99void PutAppMode(void);
100void schedule_table_sample_routine(void);
101
102TASK(IocTask1);
103TASK(IocTask2);
104static void IocProk1(void);
105static uint8 GetCommandNoWait2(void);
106
107/*
108 * APIエラーログマクロ
109 *
110 * ErrorHookが有効の場合はErrorHookから
111 * エラーログを出力し, ErrorHookが無効の場合は
112 * 以下のマクロよりエラーログ出力を行う
113 */
114#if defined(CFG_USE_ERRORHOOK)
115#define error_log(api) (api)
116#define error_log_ioc(api) (api)
117#else /* !defined( CFG_USE_ERRORHOOK ) */
118#define error_log(api) \
119 { \
120 StatusType ercd; \
121 ercd = api; /* 各API実行 */ \
122 if (ercd != E_OK) { \
123 syslog(LOG_INFO, "Error:%d", atk2_strerror(ercd)); \
124 } \
125 }
126
127#define error_log_ioc(api) \
128 { \
129 StatusType ercd; \
130 ercd = api; /* 各API実行 */ \
131 if (ercd != E_OK) { \
132 syslog(LOG_INFO, "Error:%d", atk2_ioc_strerror(ercd)); \
133 } \
134 }
135#endif /* defined( CFG_USE_ERRORHOOK ) */
136
137/*
138 * 内部データバッファ
139 */
140volatile uint8 command_tbl[14]; /* コマンド引渡しテーブル */
141
142/*
143 * 内部定数データテーブル
144 */
145/* 無効イベントマスク値 */
146#define invalid_mask (EventMaskType) (0)
147
148/* イベントマスクテーブル */
149static const EventMaskType event_mask_tbl[5] = {
150 invalid_mask,
151 T2Evt,
152 T3Evt,
153 invalid_mask,
154 invalid_mask
155};
156
157/* タスクIDテーブル */
158static const TaskType task_id_tbl[14] = {
159 Task1,
160 Task2,
161 Task3,
162 Task4,
163 Task5,
164 Task6,
165 Task7,
166 Task8,
167 Task9,
168 Task10,
169 Task11,
170 Task12,
171 Task13,
172 Task14
173};
174
175/* アラームIDテーブル */
176static const AlarmType alarm_id_tbl[2] = {
177 ActTskArm,
178 SetEvtArm
179};
180
181/* ティック値テーブル */
182static const TickType tick_tbl[2] = {
183 (TickType) 500,
184 (TickType) 900
185};
186
187/* サイクル値テーブル */
188static const TickType cycle_tbl[2] = {
189 (TickType) 0,
190 (TickType) COUNTER_MIN_CYCLE
191};
192
193/* イベントマスク名文字列テーブル */
194static const char8 *event_name_tbl[5] = {
195 "Invalid",
196 "T2Evt",
197 "T3Evt",
198 "Invalid",
199 "Invalid"
200};
201
202/* タスク名文字列テーブル */
203static const char8 *task_name_tbl[14] = {
204 "Task1",
205 "Task2",
206 "Task3",
207 "Task4",
208 "Task5",
209 "Task6",
210 "Task7",
211 "Task8",
212 "Task9",
213 "Task10",
214 "Task11",
215 "Task12"
216 "Task13"
217 "Task14"
218};
219
220/* タスク状態文字列テーブル */
221static const char8 *task_state_tbl[4] = {
222 "SUSPENDED",
223 "RUNNING",
224 "READY",
225 "WAITING"
226};
227
228/* アラーム名文字列テーブル */
229static const char8 *alarm_name_tbl[2] = {
230 "ActTskArm",
231 "SetEvtArm"
232};
233
234DEFINE_VAR_USTACK(StackType, stack_1[COUNT_STK_T(0x200)], ".stack_section");
235DEFINE_VAR_SSTACK(StackType, stack_2[COUNT_STK_T(0x200)]);
236
237/*
238 * 最高優先度タスク
239 *
240 * 各タスクのプリエンプト確認用
241 */
242TASK(HighPriorityTask)
243{
244 syslog(LOG_INFO, "HighPriorityTask ACTIVATE");
245 error_log(TerminateTask());
246} /* TASK( HighPriorityTask ) */
247
248/*
249 * 並列実行タスク1
250 */
251TASK(Task1)
252{
253 TaskProk(0U);
254} /* TASK( Task1 ) */
255
256
257/*
258 * 並列実行タスク2
259 */
260TASK(Task2)
261{
262 TaskProk(1U);
263} /* TASK( Task2 ) */
264
265
266/*
267 * 並列実行タスク3
268 */
269TASK(Task3)
270{
271 TaskProk(2U);
272} /* TASK( Task3 ) */
273
274
275/*
276 * 並列実行タスク4
277 */
278TASK(Task4)
279{
280 TaskProk(3U);
281} /* TASK( Task4 ) */
282
283
284/*
285 * 並列実行タスク5
286 */
287TASK(Task5)
288{
289 TaskProk(4U);
290} /* TASK( Task5 ) */
291
292
293/*
294 * 並列実行タスク内部処理
295 *
296 * メインタスクから通知されたコマンドごとの処理実行
297 */
298void
299TaskProk(uint8 task_no)
300{
301 uint8 command; /* コマンド退避バッファ */
302
303 /*
304 * タスク起動ログ出力
305 */
306 syslog(LOG_INFO, "%s ACTIVATE", task_name_tbl[task_no]);
307
308 /*
309 * コマンド実行ループ
310 */
311 while (1) {
312
313 /*
314 * コマンド取得
315 */
316 while (command_tbl[task_no] == '\0') {
317 }
318 command = command_tbl[task_no];
319 command_tbl[task_no] = 0U;
320
321 /*
322 * コマンド判定
323 */
324 switch (command) {
325 case 'A':
326 PutTermTsk(task_no);
327 break;
328 case '!':
329 case '"':
330 case '#':
331 case '$':
332 case '%':
333 PutChainTsk(task_no, (command - '!'));
334 break;
335 case 'z':
336 PutTaskID();
337 break;
338 case 'k':
339 PutGetTskRes();
340 break;
341 case 'K':
342 PutRelTskRes();
343 break;
344 case 'i':
345 PutGetCntRes();
346 break;
347 case 'w':
348 if (task_no < 5U) {
349 PutClrEvt(task_no);
350 }
351 break;
352 case 'W':
353 if (task_no < 5U) {
354 PutWaitEvt(task_no);
355 }
356 break;
357 default:
358 /* 上記のコマンド以外の場合,処理は行わない */
359 break;
360 }
361 }
362} /* TaskProk */
363
364/*
365 * コマンド受信処理
366 */
367uint8
368GetCommand(void)
369{
370 uint8 command; /* コマンド受信バッファ */
371
372 /*
373 * コマンドを受信するまでループ
374 */
375 command = '\0';
376 do {
377 WaitEvent(MainEvt); /* 10msウェイト */
378 ClearEvent(MainEvt);
379 RecvPolSerialChar(&command); /* 受信バッファポーリング */
380 if (command == '\n') {
381 command = '\0';
382 }
383 } while (command == '\0');
384
385
386 return(command);
387} /* GetCommand */
388
389/*
390 * ActivateTask 実行・ログ出力処理
391 */
392void
393PutActTsk(uint8 task_no)
394{
395 struct parameter_struct local;
396
397 syslog(LOG_INFO, "Call ActivateTask(%s)", task_name_tbl[task_no]);
398
399 if (task_no < 5U) {
400 error_log(ActivateTask(task_id_tbl[task_no]));
401 }
402 else {
403 local.task_no = task_id_tbl[task_no];
404 CallTrustedFunction(tfnt4, &local); /* ActivateTask(task_name_tbl[task_no]) */
405 }
406
407} /* PutActTsk */
408
409/*
410 * ActivateTask 実行(NonPriTask)・ログ出力処理
411 */
412void
413PutActNonPriTsk(void)
414{
415 struct parameter_struct local;
416
417 syslog(LOG_INFO, "Call ActivateTask(NonPriTask)");
418
419 local.task_no = NonPriTask;
420 CallTrustedFunction(tfnt4, &local); /* ActivateTask(NonPriTask) */
421
422} /* PutActNonPriTsk */
423
424/*
425 * TerminateTask 実行・ログ出力処理
426 */
427void
428PutTermTsk(uint8 task_no)
429{
430 StatusType ercd; /* エラーコード */
431
432 syslog(LOG_INFO, "%s TERMINATE", task_name_tbl[task_no]);
433
434 ercd = TerminateTask();
435 ShutdownOS(ercd);
436}
437
438/*
439 * ChainTask 実行・ログ出力処理
440 */
441void
442PutChainTsk(uint8 from_task_no, uint8 to_task_no)
443{
444 StatusType ercd; /* エラーコード */
445
446 syslog(LOG_INFO, "Call ChainTask(%s)", task_name_tbl[to_task_no]);
447 syslog(LOG_INFO, "%s TERMINATE", task_name_tbl[from_task_no]);
448
449 ercd = ChainTask(task_id_tbl[to_task_no]);
450 if (ercd == E_OS_LIMIT) {
451 syslog(LOG_INFO, "Call TerminateTask()");
452 syslog(LOG_INFO, "Because of ChainTask E_OS_LIMIT return");
453 ercd = TerminateTask();
454 }
455 ShutdownOS(ercd);
456} /* PutChainTsk */
457
458/*
459 * Schedule 実行・ログ出力処理
460 */
461void
462PutSchedule(void)
463{
464 syslog(LOG_INFO, "Call ActivateTask(HighPriorityTask)");
465
466 error_log(ActivateTask(HighPriorityTask));
467 syslog(LOG_INFO, "Call Schedule()");
468
469 error_log(Schedule());
470 syslog(LOG_INFO, "Retrun Schedule()");
471} /* PutSchedule */
472
473/*
474 * GetTaskID 実行・ログ出力処理
475 */
476void
477PutTaskID(void)
478{
479 TaskType task_id; /* タスクID取得バッファ */
480
481 error_log(GetTaskID(&task_id));
482
483 syslog(LOG_INFO, "TaskID:%d", task_id);
484} /* PutTaskID */
485
486/*
487 * GetTaskState 実行・ログ出力処理
488 * Task1〜Task5,Task7取得時エラーとならない
489 * Task6取得時エラーとなる
490 */
491void
492PutTaskState(uint8 task_no)
493{
494 TaskStateType state; /* タスクID取得バッファ */
495
496 error_log(GetTaskState(task_id_tbl[task_no], &state));
497
498 syslog(LOG_INFO, task_name_tbl[task_no]);
499 syslog(LOG_INFO, " State:%s", task_state_tbl[state]);
500} /* PutTaskState */
501
502/*
503 * DisableAllInterrupts/EnableAllInterrupts 実行・ログ出力処理
504 */
505void
506PutDisAllInt(void)
507{
508 syslog(LOG_INFO, "Call DisableAllInterrupts");
509
510 DisableAllInterrupts();
511
512 PutHwCnt3();
513 syslog(LOG_INFO, "Call EnableAllInterrupts");
514
515 EnableAllInterrupts();
516} /* PutDisAllInt */
517
518/*
519 * SuspendAllInterrupts/ResumeAllInterrupts 実行・ログ出力処理
520 */
521void
522PutSusAllInt(void)
523{
524 syslog(LOG_INFO, "Call SuspendAllInterrupts");
525
526 SuspendAllInterrupts();
527
528 PutHwCnt3();
529 syslog(LOG_INFO, "Call SuspendAllInterrupts");
530
531 SuspendAllInterrupts();
532
533 PutHwCnt3();
534 syslog(LOG_INFO, "Call ResumeAllInterrupts");
535
536 ResumeAllInterrupts();
537
538 PutHwCnt3();
539 syslog(LOG_INFO, "Call ResumeAllInterrupts");
540
541 ResumeAllInterrupts();
542} /* PutSusAllInt */
543
544/*
545 * SuspendOSInterrupts/ResumeOSInterrupts 実行・ログ出力処理
546 */
547void
548PutSusOSInt(void)
549{
550 syslog(LOG_INFO, "Call SuspendOSInterrupts");
551
552 SuspendOSInterrupts();
553
554 PutHwCnt3();
555 syslog(LOG_INFO, "Call SuspendOSInterrupts");
556
557 SuspendOSInterrupts();
558
559 PutHwCnt3();
560 syslog(LOG_INFO, "Call SuspendAllInterrupts");
561
562 SuspendAllInterrupts();
563
564 PutHwCnt3();
565 syslog(LOG_INFO, "Call ResumeAllInterrupts");
566
567 ResumeAllInterrupts();
568
569 PutHwCnt3();
570 syslog(LOG_INFO, "Call ResumeOSInterrupts");
571
572 ResumeOSInterrupts();
573
574 PutHwCnt3();
575 syslog(LOG_INFO, "Call ResumeOSInterrupts");
576
577 ResumeOSInterrupts();
578} /* PutSusOSInt */
579
580/*
581 * 割込み動作テスト用HWカウンタ値のログ出力処理
582 */
583void
584PutHwCnt3(void)
585{
586 uint32 isr1_cnt = 0U; /* C1ISR カウント値取得バッファ */
587 uint32 isr2_cnt = 0U; /* C2ISR カウント値取得バッファ */
588 uint8 cnt; /* 出力回数カウンタ */
589
590 for (cnt = 0U; cnt < 3U; cnt++) {
591 GetHwCnt(&isr1_cnt, &isr2_cnt);
592 syslog(LOG_INFO, "C1ISR Cnt:%d, C2ISR Cnt:%d",
593 isr1_cnt, isr2_cnt);
594 }
595} /* PutHwCnt3 */
596
597/*
598 * GetResource/ReleaseResource 実行(割込みレベル)・ログ出力処理
599 */
600void
601PutGetCntRes(void)
602{
603 syslog(LOG_INFO, "Call GetResource(CntRes)");
604 error_log(GetResource(CntRes));
605
606 PutHwCnt3();
607 syslog(LOG_INFO, "Call ReleaseResource(CntRes)");
608
609 error_log(ReleaseResource(CntRes));
610} /* PutGetCntRes */
611
612/*
613 * GetResource 実行(タスクレベル)・ログ出力処理
614 */
615void
616PutGetTskRes(void)
617{
618 syslog(LOG_INFO, "Call GetResource(TskLevelRes)");
619
620 error_log(GetResource(TskLevelRes));
621} /* PutGetTskRes */
622
623/*
624 * ReleaseResource 実行(タスクレベル)・ログ出力処理
625 */
626void
627PutRelTskRes(void)
628{
629 syslog(LOG_INFO, "Call ReleaseResource(TskLevelRes)");
630
631 error_log(ReleaseResource(TskLevelRes));
632}
633
634/*
635 * SetEvent 実行・ログ出力処理
636 */
637void
638PutSetEvt(uint8 task_no)
639{
640 syslog(LOG_INFO, "Call SetEvent(%s, %s)",
641 task_name_tbl[task_no], event_name_tbl[task_no]);
642
643 error_log(SetEvent(task_id_tbl[task_no], event_mask_tbl[task_no]));
644} /* PutSetEvt */
645
646/*
647 * ClearEvent 実行・ログ出力処理
648 */
649void
650PutClrEvt(uint8 task_no)
651{
652 syslog(LOG_INFO, "Call ClearEvent(%s)", event_name_tbl[task_no]);
653
654 error_log(ClearEvent(event_mask_tbl[task_no]));
655} /* PutClrEvt */
656
657/*
658 * GetEvent 実行・ログ出力処理
659 */
660void
661PutGetEvt(uint8 task_no)
662{
663 EventMaskType mask; /* イベントマスク取得バッファ */
664
665 error_log(GetEvent(task_id_tbl[task_no], &mask));
666
667 syslog(LOG_INFO, "%s Event Mask:0x%x", task_name_tbl[task_no], mask);
668} /* PutGetEvt */
669
670/*
671 * WaitEvent 実行・ログ出力処理
672 */
673void
674PutWaitEvt(uint8 task_no)
675{
676 syslog(LOG_INFO, "Call WaitEvent(%s)", event_name_tbl[task_no]);
677
678 error_log(WaitEvent(event_mask_tbl[task_no]));
679 syslog(LOG_INFO, "Return WaitEvent(%s)", event_name_tbl[task_no]);
680} /* PutWaitEvt */
681
682/*
683 * GetAlarmBase 実行・ログ出力処理
684 */
685void
686PutArmBase(void)
687{
688 AlarmBaseType info; /* アラームベース情報取得バッファ */
689
690 error_log(GetAlarmBase(MainCycArm, &info));
691
692 syslog(LOG_INFO, "MainCycArm Base:");
693 syslog(LOG_INFO, "\tMAXALLOWEDVALUE=%d", info.maxallowedvalue);
694 syslog(LOG_INFO, "\tTICKSPERBASE=%d", info.ticksperbase);
695 syslog(LOG_INFO, "\tMINCYCLE=%d", info.mincycle);
696} /* PutArmBase */
697
698/*
699 * PutArmTick 実行・ログ出力処理
700 */
701void
702PutArmTick(void)
703{
704 TickType tick; /* 残りティック取得バッファ */
705
706 error_log(GetAlarm(MainCycArm, &tick));
707
708 syslog(LOG_INFO, "MainCycArm Tick:%d", tick);
709} /* PutArmTick */
710
711/*
712 * SetRelAlarm 実行・ログ出力処理
713 */
714void
715PutSetRel(uint8 alarm_no, uint8 tick_no, uint8 cycle_no)
716{
717 syslog(LOG_INFO, "Call SetRelAlarm(%s, %d, %d)",
718 alarm_name_tbl[alarm_no], tick_tbl[tick_no], cycle_tbl[cycle_no]);
719
720 error_log(SetRelAlarm(alarm_id_tbl[alarm_no],
721 tick_tbl[tick_no], cycle_tbl[cycle_no]));
722} /* PutSetRel */
723
724/*
725 * CancelAlarm 実行・ログ出力処理
726 */
727void
728PutCanArm(void)
729{
730 syslog(LOG_INFO, "Call CancelAlarm(ActTskArm)");
731
732 error_log(CancelAlarm(ActTskArm));
733} /* PutCanArm */
734
735/*
736 * GetActiveApplicationMode 実行・ログ出力処理
737 */
738void
739PutAppMode(void)
740{
741 switch (GetActiveApplicationMode()) {
742 case AppMode1:
743 syslog(LOG_INFO, "ActiveApplicationMode:AppMode1");
744 break;
745 case AppMode2:
746 syslog(LOG_INFO, "ActiveApplicationMode:AppMode2");
747 break;
748 case AppMode3:
749 syslog(LOG_INFO, "ActiveApplicationMode:AppMode3");
750 break;
751 default:
752 syslog(LOG_INFO, "ActiveApplicationMode:Non");
753 break;
754 }
755} /* PutAppMode */
756
757/*
758 * スケジュールテーブルテスト用メインループ
759 *
760 * ユーザコマンドの受信と,コマンドごとの処理実行
761 */
762void
763schedule_table_sample_routine(void)
764{
765 uint8 command; /* コマンドバッファ */
766 ScheduleTableType scheduletable_id; /* コマンド引数バッファ */
767 ScheduleTableStatusType status; /* スケジュール状態引数 */
768 TickType val; /* カウンタの現在値 */
769 uint8 flag = FALSE; /* リターンするか判定するためのフラグ */
770
771 syslog(LOG_INFO, "\t[ schedule table sample routine IN, press 't' OUT ]");
772 syslog(LOG_INFO, "");
773
774 scheduletable_id = scheduletable1;
775 /*
776 * コマンド実行ループ
777 */
778 while (1) {
779
780 WaitEvent(MainEvt); /* 10msの作業時間待ち */
781 ClearEvent(MainEvt);
782
783 /*
784 * 入力コマンド取得
785 */
786 syslog(LOG_INFO, "Input Command:");
787 command = GetCommand();
788 syslog(LOG_INFO, "%c", command);
789
790 /*
791 * コマンド判定
792 */
793 switch (command) {
794 case '1':
795 scheduletable_id = scheduletable1;
796 break;
797 case '2':
798 scheduletable_id = scheduletable2;
799 break;
800 case 'i':
801 IncrementCounter(SchtblSampleCnt);
802 val = 0U;
803 GetCounterValue(SchtblSampleCnt, &val);
804 if ((val % 5U) == 0U) {
805 syslog(LOG_INFO, "\tGetCounterValue(SchtblSampleCnt ) = %d", val);
806 }
807 break;
808 case 's':
809 syslog(LOG_INFO, "\tStartScheduleTableRel(scheduletable%d, 5)", scheduletable_id + 1U);
810 error_log(StartScheduleTableRel(scheduletable_id, 5U));
811 break;
812 case 'S':
813 syslog(LOG_INFO, "\tStartScheduleTableAbs(scheduletable%d, 5)", scheduletable_id + 1U);
814 error_log(StartScheduleTableAbs(scheduletable_id, 5U));
815 break;
816 case 'f':
817 syslog(LOG_INFO, "\tStopScheduleTable(scheduletable%d)", scheduletable_id + 1U);
818 error_log(StopScheduleTable(scheduletable_id));
819 break;
820 case 'n':
821 syslog(LOG_INFO, "\tNextScheduleTable(scheduletable%d, scheduletable%d)", scheduletable_id + 1U, scheduletable2 + 1U);
822 error_log(NextScheduleTable(scheduletable_id, scheduletable2));
823 break;
824 case 'N':
825 syslog(LOG_INFO, "\tNextScheduleTable(scheduletable%d, scheduletable%d)", scheduletable_id + 1U, scheduletable1 + 1U);
826 error_log(NextScheduleTable(scheduletable_id, scheduletable1));
827 break;
828 case 'g':
829 status = 0U;
830 syslog(LOG_INFO, "\tGetScheduleTableStatus(scheduletable%d, status)", scheduletable_id + 1U);
831 error_log(GetScheduleTableStatus(scheduletable_id, &status));
832 syslog(LOG_INFO, "\tstatus = %d", status);
833 break;
834 case 't':
835 syslog(LOG_INFO, "\t[ schedule table sample routine OUT, press 't' IN ]");
836 flag = TRUE;
837 break;
838 default:
839 /* コマンドが上記のケース以外なら処理は行わない */
840 break;
841 }
842 /* フラグが立っていた場合,リターンする */
843 if (flag == TRUE) {
844 return;
845 }
846 }
847} /* schedule_table_sample_routine */
848
849/*
850 * スケジュールテーブル確認用タスク6
851 */
852TASK(Task10)
853{
854 /*
855 * タスク起動ログ出力
856 */
857 syslog(LOG_INFO, "Task10 ACTIVATE");
858 WaitEvent(T10Evt);
859 syslog(LOG_INFO, "Task10 FINISH");
860 TerminateTask();
861} /* TASK( Task10 ) */
862
863
864/*
865 * スケジュールテーブル確認用タスク7
866 */
867TASK(Task11)
868{
869 /*
870 * タスク起動ログ出力
871 */
872 syslog(LOG_INFO, "Task11 ACTIVATE");
873 WaitEvent(T11Evt);
874 syslog(LOG_INFO, "Task11 FINISH");
875 TerminateTask();
876} /* TASK( Task11 ) */
877
878
879/*
880 * スケジュールテーブル確認用タスク8
881 */
882TASK(Task12)
883{
884 /*
885 * タスク起動ログ出力
886 */
887 syslog(LOG_INFO, "Task12 ACTIVATE");
888 WaitEvent(T12Evt);
889 syslog(LOG_INFO, "Task12 FINISH");
890 TerminateTask();
891} /* TASK( Task12 ) */
892
893/*
894 * 信頼関数動作確認用タスク11
895 */
896TASK(Task13)
897{
898 struct parameter_struct local;
899 sint32 pp = 10;
900
901 local.name1 = (sint32 *) &pp;
902 local.name2 = 2;
903
904 CallTrustedFunction(tfnt1, &local); /* 10*2 + 2 = 22 */
905 syslog(LOG_NOTICE, "Task13 tfnt1 ret = %d", local.return_value);
906
907 TerminateTask();
908} /* TASK( Task13 ) */
909
910/*
911 * 信頼関数動作確認用タスク12
912 */
913TASK(Task14)
914{
915 struct parameter_struct local;
916 sint32 pp = 20;
917
918 local.name1 = (sint32 *) &pp;
919 local.name2 = 4;
920
921 CallTrustedFunction(tfnt2, &local); /* 20*4 + 4 = 84 */
922 syslog(LOG_NOTICE, "Task14 tfnt2 ret = %d", local.return_value);
923
924} /* TASK( Task14 ) */
925
926/*
927 * 非信頼OSアプリケーション間アクセス権確認用タスク
928 */
929TASK(Task8)
930{
931 TaskStateType state;
932 /*
933 * タスク起動ログ出力
934 */
935 syslog(LOG_INFO, "Task8 ACTIVATE");
936 if (E_OK == GetTaskState(Task1, &state)) {
937 syslog(LOG_INFO, "GetTaskState(Task1, &state), state = %s", task_state_tbl[state]);
938 }
939 syslog(LOG_INFO, "Task8 FINISH");
940 TerminateTask();
941} /* TASK( Task8 ) */
942
943/*
944 * 非信頼OSアプリケーション間アクセス権確認用タスク
945 */
946TASK(Task9)
947{
948 TaskStateType state;
949 /*
950 * タスク起動ログ出力
951 */
952 syslog(LOG_INFO, "Task9 ACTIVATE");
953 if (E_OK == GetTaskState(Task2, &state)) {
954 syslog(LOG_INFO, "GetTaskState(Task2, &state), state = %s", task_state_tbl[state]);
955 }
956 syslog(LOG_INFO, "Task9 FINISH");
957 TerminateTask();
958} /* TASK( Task8 ) */
959
960/*
961 * IOC確認用タスク1
962 */
963TASK(IocTask1)
964{
965 syslog(LOG_INFO, "IocTask1 ACTIVATE");
966
967 IocProk1();
968
969 syslog(LOG_INFO, "IocTask1 TERMINATE");
970
971 TerminateTask();
972} /* TASK( IocTask1 ) */
973
974/*
975 * IOC確認用タスク2
976 */
977TASK(IocTask2)
978{
979 syslog(LOG_INFO, "IocTask2 ACTIVATE");
980
981 IocProk1();
982
983 syslog(LOG_INFO, "IocTask2 TERMINATE");
984
985 TerminateTask();
986} /* TASK( IocTask2 ) */
987
988/*
989 * IOC確認用タスク内部処理
990 *
991 */
992static void
993IocProk1(void)
994{
995 uint8 api; /* コマンド受信バッファ(API) */
996 uint8 data[3]; /* 通信バッファ */
997
998 volatile sint32 i;
999 Std_ReturnType ercd;
1000
1001 syslog(LOG_INFO, "Select IOC API:");
1002 api = GetCommandNoWait2();
1003#ifndef OMIT_ECHO
1004 syslog(LOG_INFO, "%c", api);
1005#endif /* OMIT_ECHO */
1006
1007 switch (api) {
1008 case '1':
1009 syslog(LOG_INFO, "Input send data:");
1010 data[0] = GetCommandNoWait2();
1011#ifndef OMIT_ECHO
1012 syslog(LOG_INFO, "%c", data[0]);
1013#endif /* OMIT_ECHO */
1014 syslog(LOG_INFO, "Call IocSend_IOC_QUE_0");
1015 error_log_ioc(IocSend_IOC_QUE_0(data[0]));
1016 break;
1017 case '2':
1018 syslog(LOG_INFO, "Input send data:");
1019 data[0] = GetCommandNoWait2();
1020#ifndef OMIT_ECHO
1021 syslog(LOG_INFO, "%c", data[0]);
1022#endif /* OMIT_ECHO */
1023
1024 syslog(LOG_INFO, "Call IocSend_IOC_QUE_1");
1025 error_log_ioc(IocSend_IOC_QUE_1(data[0]));
1026 break;
1027 case '3':
1028 for (i = 0; i < 3U; i++) {
1029 syslog(LOG_INFO, "Input send data%d:", i);
1030 data[i] = GetCommandNoWait2();
1031#ifndef OMIT_ECHO
1032 syslog(LOG_INFO, "%c", data[i]);
1033#endif /* OMIT_ECHO */
1034 }
1035 syslog(LOG_INFO, "Call IocWriteGroup_IOC_DEQUE");
1036 error_log_ioc(IocWriteGroup_IOC_DEQUE(data[0], data[1], data[2]));
1037 break;
1038 case '4':
1039 syslog(LOG_INFO, "Call IocReceive_IOC_QUE");
1040 ercd = IocReceive_IOC_QUE(&data[0]);
1041#if !defined(CFG_USE_ERRORHOOK)
1042 if (ercd != E_OK) {
1043 syslog(LOG_INFO, "Error:%d", atk2_ioc_strerror(ercd));
1044 }
1045#endif /* !defined( CFG_USE_ERRORHOOK ) */
1046 if ((ercd == IOC_E_OK) || (ercd == IOC_E_LOST_DATA)) {
1047 syslog(LOG_INFO, "recv data:%c", data[0]);
1048 }
1049 break;
1050 case '5':
1051 syslog(LOG_INFO, "Call IocReadGroup_IOC_DEQUE");
1052 error_log_ioc(IocReadGroup_IOC_DEQUE(&data[0], &data[1], &data[2]));
1053 for (i = 0; i < 3U; i++) {
1054 syslog(LOG_INFO, "recv data%d:%c", i, data[i]);
1055 }
1056 break;
1057 case '6':
1058 syslog(LOG_INFO, "Call IocEmptyQueue_IOC_QUE");
1059 error_log_ioc(IocEmptyQueue_IOC_QUE());
1060 break;
1061 default:
1062 syslog(LOG_INFO, "undefined command");
1063 break;
1064 }
1065} /* IocProk1 */
1066
1067/*
1068 * コマンド受信処理(ウェイト無し)
1069 */
1070uint8
1071GetCommandNoWait2(void)
1072{
1073 uint8 command; /* コマンド受信バッファ */
1074
1075 /*
1076 * コマンドを受信するまでループ
1077 */
1078 command = '\0';
1079 do {
1080 RecvPolSerialChar(&command); /* 受信バッファポーリング */
1081 if (command == '\n') {
1082 command = '\0';
1083 }
1084 } while (command == '\0');
1085
1086
1087 return(command);
1088} /* GetCommandNoWait2 */
1089
1090
1091/*
1092 * ActivateTask(IOC用) 実行・ログ出力処理
1093 */
1094void
1095PutActIocTsk(void)
1096{
1097 uint8 command; /* コマンド受信バッファ */
1098
1099 syslog(LOG_INFO, "Select IocTask:");
1100 command = GetCommand();
1101#ifndef OMIT_ECHO
1102 syslog(LOG_INFO, "%c", command);
1103#endif /* OMIT_ECHO */
1104
1105 switch (command) {
1106 case '1':
1107 error_log(ActivateTask(IocTask1));
1108 break;
1109 case '2':
1110 error_log(ActivateTask(IocTask2));
1111 break;
1112 case '3':
1113 error_log(CallTrustedFunction(actioctask3, NULL));
1114 break;
1115 case '4':
1116 error_log(CallTrustedFunction(actioctask4, NULL));
1117 break;
1118 default:
1119 syslog(LOG_INFO, "undefined command");
1120 break;
1121 }
1122} /* PutActIocTsk */
1123
1124TRUSTEDFUNCTION(TRUSTED_actioctask3, FunctionIndex, FunctionParams)
1125{
1126 error_log(ActivateTask(IocTask3));
1127
1128 return(E_OK);
1129}
1130
1131TRUSTEDFUNCTION(TRUSTED_actioctask4, FunctionIndex, FunctionParams)
1132{
1133 error_log(ActivateTask(IocTask4));
1134
1135 return(E_OK);
1136}
1137
1138
1139/*
1140 * OSAP定義エラーフックルーチン
1141 */
1142#ifdef CFG_USE_OSAP_ERRORHOOK
1143void
1144ErrorHook_NT_osap2(StatusType Error)
1145{
1146 syslog(LOG_INFO, "ErrorHook_NT_osap2 Error:%s", atk2_strerror(Error));
1147}
1148#endif /* CFG_USE_OSAP_ERRORHOOK */
1149
1150/*
1151 * OSAP定義スタートアップフックルーチン
1152 */
1153#ifdef CFG_USE_OSAP_STARTUPHOOK
1154void
1155StartupHook_NT_osap2(void)
1156{
1157 syslog(LOG_INFO, "Sample StartupHook_NT_osap2!\n");
1158}
1159#endif /* CFG_USE_OSAP_STARTUPHOOK */
1160
1161/*
1162 * OSAP定義シャットダウンフックルーチン
1163 */
1164#ifdef CFG_USE_OSAP_SHUTDOWNHOOK
1165void
1166ShutdownHook_NT_osap2(StatusType Error)
1167{
1168 syslog(LOG_INFO, "Sample ShutdownHook_NT_osap2!\n");
1169}
1170#endif /* CFG_USE_OSAP_SHUTDOWNHOOK */
Note: See TracBrowser for help on using the repository browser.