source: atk2-sc3-1.4.0-ntisr/sample/sample1.c@ 172

Last change on this file since 172 was 172, checked in by ertl-ishikawa, 8 years ago

ATK2-SC3 1.4.0 RH850依存部 非信頼C2ISR対応を追加

  • Property svn:executable set to *
File size: 47.4 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 * Copyright (C) 2015 by SUZUKI MOTOR CORPORATION
22 *
23 * 上記著作権者
24は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
25 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
26 * 変・再é…
27å¸ƒï¼ˆä»¥ä¸‹ï¼Œåˆ©ç”¨ã¨å‘¼ã¶ï¼‰ã™ã‚‹ã“とを無償で許諾する.
28 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
29 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
30 * スコード中に含まれていること.
31 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
32 * 用できる形で再é…
33å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é…
34å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨
35 * 者
36マニュアルなど)に,上記の著作権表示,この利用条件および下記
37 * の無保証規定を掲載すること.
38 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
39 * 用できない形で再é…
40å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã„ずれかの条件を満たすこ
41 * と.
42 * (a) 再é…
43å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€…
44マニュアルなど)に,上記の著
45 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
46 * (b) 再é…
47å¸ƒã®å½¢æ…
48‹ã‚’,別に定める方法によって,TOPPERSプロジェクトに
49 * 報告すること.
50 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
51 * 害からも,上記著作権者
52およびTOPPERSプロジェクトをå…
53è²¬ã™ã‚‹ã“と.
54 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
55 * 由に基づく請求からも,上記著作権者
56およびTOPPERSプロジェクトを
57 * å…
58è²¬ã™ã‚‹ã“と.
59 *
60 * 本ソフトウェアは,AUTOSAR(AUTomotive Open System ARchitecture)仕
61 * 様に基づいている.上記の許諾は,AUTOSARの知的財産権を許諾するもので
62 * はない.AUTOSARは,AUTOSAR仕様に基づいたソフトウェアを商用目的で利
63 * 用する者
64に対して,AUTOSARパートナーになることを求めている.
65 *
66 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者
67お
68 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
69 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
70 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
71 * の責任を負わない.
72 *
73 * $Id: sample1.c 485 2015-12-17 08:21:50Z witz-itoyo $
74 */
75
76/*
77 * 信頼OSアプリケーション所属サンプルプログラムの本体
78 *
79 * ATK2-SC3の基本的な動作を確認するためのサンプルプログラム.
80 *
81 * プログラムの概要:PCとボード間でシリアル通信を行い,ユーザå…
82¥åŠ›
83 * コマンドに応じた動作とログ出力を行なう.
84 *
85 * <コマンド一覧>
86 * ・タスク指定
87 * '1' : 以降のコマンドを Task1 に対して行う
88 * '2' : 以降のコマンドを Task2 に対して行う
89 * '3' : 以降のコマンドを Task3 に対して行う
90 * '4' : 以降のコマンドを Task4 に対して行う
91 * '5' : 以降のコマンドを Task5 に対して行う
92 * '6' : 以降のコマンドを Task6 に対して行う
93 * '7' : 以降のコマンドを Task7 に対して行う
94 * '8' : 以降のコマンドを Task8 に対して行う(一部タスク管理コマンド使用できない)
95 * '9' : 以降のコマンドを Task9 に対して行う(一部タスク管理コマンド使用できない)
96 * ・タスク管理機能
97 * 'a' : ActivateTask にてタスクを起動する.
98 * 'A' : TerminateTask にてタスクを終了する.
99 * '!'(Shift+1) : ChainTask にてタスクを終了し,Task1 を起動する
100 * '"'(Shift+2) : ChainTask にてタスクを終了し,Task2 を起動する
101 * '#'(Shift+3) : ChainTask にてタスクを終了し,Task3 を起動する
102 * '$'(Shift+4) : ChainTask にてタスクを終了し,Task4 を起動する
103 * '%'(Shift+5) : ChainTask にてタスクを終了し,Task5 を起動する
104 * 's' : ノンプリエンプティブ属性であるタスク MainTask にて最高
105 * 優å…
106ˆåº¦ã‚¿ã‚¹ã‚¯ HighPriorityTask を起動し,Schedule にて
107 * 再スケジューリングを行う.
108 * 'S' : ノンプリエンプティブタスク NonPriTask を起動する
109 * ノンプリエンプティブタスク NonPriTask にて最高優å…
110ˆåº¦
111 * タスク HighPriorityTask を起動し,タスク終了する
112 * 'y' : タスク11(スタックå…
113±æœ‰)を呼び出し,信頼関数で処理を行う
114 * 'Y' : タスク12(スタックå…
115±æœ‰)を呼び出し,信頼関数で処理を行う
116 * タスク不正終了により,エラーコードはE_OS_MISSINGENDで
117 * エラーフックが呼ばれる
118 * 'z' : 実行中のタスクから GetTaskID を実行して,実行状æ…
119‹ã® TaskID を取得する
120 * 'Z' : メインタスクから GetTaskState を実行して,対象タスクの状æ…
121‹ã‚’取得する
122 * 'x' : div命令を実行して,未定義命令例外を発生させる
123 * ・割込み管理機能
124 * 'd' : DisableAllInterrupts を実行後,割込みタイマ値を3回表
125 * 示し, EnableAllInterrupts を実行する
126 * 'D' : SuspendAllInterrupts を実行後,割込みタイマ値を3回表
127 * 示し,さらに SuspendAllInterrupts を実行後,割込みタイ
128 * マー値を3回表示し,ResumeAllInterrupts を実行後,割込み
129 * タイマ値を3回表示し,ResumeAllInterrupts を実行する
130 * 'f' : SuspendOSInterrupts を実行後,割込みタイマ値を3回表
131 * 示し,さらに SuspendOSInterrupts を実行後,割込みタイ
132 * マー値を3回表示し,さらに SuspendAllInterruptsを実行
133 * 後,割込みタイマ値を3回表示し, ResumeAllInterrupts
134 * を実行後,割込みタイマ値を3回表示し,
135 * ResumeOSInterrupts を実行後割込みタイマ値を3回表示し,
136 * ResumeOSInterrupts を実行する
137 * 'T' : 割込みタイマ値を3回表示する
138 * ・リソース管理機能
139 * 'k' : GetResource にてリソース TskLevelRes を取得する.なお,
140 * Task3 は,このリソースより優å…
141ˆåº¦ãŒé«˜ã„ためエラーとなる
142 * 'K' : ReleaseResource にてリソース TskLevelRes を解放する
143 * 'i' : GetResource にてリソース CntRes を取得後,割込み
144 * タイマ値を3回表示し,ReleaseResource にてリソース
145 * CntRes を解放する
146 * ・イベント制御機能
147 * 'e' : SetEvent にてイベントを設定する.Task2 と Task3 以外は
148 * 割り当てがないためエラーとなる
149 * 'w' : ClearEvent にて自タスクのイベントをクリアする.Task2 と
150 * Task3 以外は割り当てがないためエラーとなる
151 * 'E' : GetEvent にてイベント状æ…
152‹ã‚’取得する.Task2 と Task3
153 * 以外は割り当てがないためエラーとなる
154 * 'W' : WaitEvent にて自タスクのイベントを待
155つ.Task3 と Task4
156 * 以外はエラーとなる
157 * ・アラーム機能
158 * 'b' : GetAlarmBase にてアラーム MainCycArm のアラームベース
159 * 情
160報を取得する
161 * 'B' : GetAlarm にてアラーム MainCycArm の残りカウント値を2回
162 * 連続で取得する
163 * 'v' : SetRelAlarm にてアラーム ActTskArm を起動し,500ms 後に
164 * タスク Task1 を起動する
165 * 'V' : SetRelAlarm にてアラーム SetEvtArm を起動し,500ms 後に
166 * イベント T3Evt を設定する
167 * 'h' : CancelAlarm にてアラーム ActTskArm をキャンセルする
168 * ・カウンタ操作機能
169 * 'c' : タスクにて IncrementCounter を実行し,カウンタ SampleCnt
170 * にシグナル通知する
171 * 1 シグナルでアラーム SampleArm が満了し,コールバックを
172 * 実行する
173 * 'C' : タスクにて IncrementCounter を実行し,カウンタ SampleCnt2
174 * にシグナル通知する
175 * 1 シグナルでアラーム SampleArm1 が満了し,SampleCnt3 を
176 * インクリメントする. SampleCnt3 は 1 シグナルで SampleAlm2
177 * が満了しコールバックを実行する
178 * 'j' : タスクにて GetCounterValue を実行する
179 * 取得した値は保存する
180 * 'J' : タスクにて GetEalsedCounterValue を実行する
181 * å…
182ƒã®å€¤ã¯å‰å›žã®GetCounterValue または GetEalsedCounterValue にて取得
183 * した値とする.初回,または,GetCounterValueを実行していない場合は0
184 * とする
185 *
186 * 'r' : タスクにて GetISRIDを実行する
187 * タスクコンテキストからはGetISRIDを呼出した場合はエラーとして
188 * INVALID_ISRが返却される
189 *
190 * 割込みコンテキストからのGetISRID発行は,SystemTimerCntのコールバック
191 * ルーチン('n' コマンドで実行)にて行う
192 *
193 * タスクコンテキストからのGetISRID発行は,SampleCnt2のコールバック
194 * ルーチン('C' または 'c' コマンドで実行)にて行う
195 *
196 * ・スケジュールテーブル制御機能
197 * 't' : スケジュールテーブル動作制御ON/OFF
198 *
199 * 'i' : SchtblSampleCntカウンタをインクリメントする
200 * SchtblSampleCntカウンタはスケジュールテーブルの駆動カウンタ
201 * '1' : 以降のコマンドを scheduletable1 に対して行う(デフォルト値)
202 * '2' : 以降のコマンドを scheduletable2 に対して行う
203 * '3' : 以降のコマンドを scheduletable3(存在しないID) に対して行う
204 * コマンドのエラー確認にも使用する
205 * 's' : StartScheduleTableRelを実行し,相対値(5)でスケジュールテーブルを開始する
206 * 'S' : StartScheduleTableAbsを実行し,絶対値(5)でスケジュールテーブルを開始する
207 * 'f' : StopScheduleTableを実行し,スケジュールテーブルを停止する
208 * 'n' : NextScheduleTableを実行し,scheduletable2に切替える
209 * 'N' : NextScheduleTableを実行し,scheduletable1に切替える
210 * 'g' : GetScheduleTableStatusを実行し,スケジュールテーブル状æ…
211‹ã‚’取得する
212 * 'q' : ShutdownOS( E_OK ) OS実行制御機能の'q'と同等機能
213 * 'Q' : ShutdownOS( E_OS_STATE ) OS実行制御機能の'Q'と同等機能
214 *
215 * ・OS実行制御機能
216 * 'p' : GetActiveApplicationMode にてアプリケーションモードを
217 * 取得する
218 * 'q' : ShutdownOS をコード E_OK で実行し,サンプルプログラムを
219 * 終了する
220 * 'Q' : ShutdownOS をコード E_OS_STATE で実行し,サンプルプログラム
221 * を終了する
222 *
223 * ・IOC送受信機能
224 * 'I' : IOC送受信モード
225 *
226 * IOC APIを使用するタスク(IocTaskX)を選択
227 * '1' : IocTask1(NT_osap1に所属)
228 * '2' : IocTask2(NT_osap2に所属)
229 * '3' : IocTask3(KT_osap1に所属)
230 * '4' : IocTask4(KT_osap2に所属)
231 *
232 * IOC APIを選択
233 * '1' : IocSend_IOC_QUE_0(uint8 in1)
234 * '2' : IocSend_IOC_QUE_1(uint8 in1)
235 * '3' : IocWriteGroup_IOC_DEQUE(uint8 in1, uint8 in2, uint8 in3)
236 * '4' : IocReceive_IOC_QUE(uint8 *out1)
237 * '5' : IocReadGroup_IOC_DEQUE(uint8 *out1, uint8 *out2, uint8 *out3)
238 * '6' : IocEmptyQueue_IOC_QUE(void)
239 *
240 * 送信API選択時,送信データをå…
241¥åŠ›ã™ã‚‹
242 *
243 * <オブジェクト一覧>
244 * ・OS
245 * スタートアップフック:使用
246 * シャットダウンフック:使用
247 * エラーフック:使用
248 * プレタスクフック:未使用
249 * ポストタスクフック:未使用
250 * ・タスク
251 * メインタスク
252 * タスクID:MainTask
253 * 優å…
254ˆåº¦ï¼š14
255 * 多重起動数:1
256 * スケジュール:ノンプリエンプティブ
257 * 自動起動:AppMode1, AppMode2, AppMode3
258 * 概要:ユーザインタフェース(シリアルIOよりコマンドを受信し,
259 * それに対応した動作を行なう)
260 * 周期アラーム MainCycArm により,10msごとに待
261ち解除し
262 * コマンドの受信有無をポーリングする
263 * イベント(ID:MainEvt)を関連付けている
264 * 最高優å…
265ˆåº¦ã‚¿ã‚¹ã‚¯
266 * タスクID:HighPriorityTask
267 * 優å…
268ˆåº¦ï¼š15
269 * 多重起動数:1
270 * スケジュール:フルプリエンプティブ
271 * 自動起動:なし
272 * 概要:起動ログを出力して終了する.ノンプリエンプティブタスク
273 * から起動され,プリエンプトしているかどうかの確認用
274 * ノンプリエンプティブタスク
275 * タスクID:NonPriTask
276 * 優å…
277ˆåº¦ï¼š1
278 * 多重起動数:8
279 * スケジュール:ノンプリエンプティブ
280 * 自動起動:なし
281 * 信頼OSアプリケーションに所属
282 * 概要:起動ログを出力し,最高優å…
283ˆåº¦ã‚¿ã‚¹ã‚¯ HighPriorityTask を
284 * 起動後,終了ログを出力してタスクを終了する
285 * タスク1
286 * タスクID:Task1
287 * 優å…
288ˆåº¦ï¼š4
289 * スケジュール:フルプリエンプティブ
290 * 自動起動:AppMode2
291 * 多重起動数:8
292 * 概要:並列処理タスク(メインタスクからの指令により動作)
293 * 起動されすると無限ループにå…
294¥ã‚Šï¼Œã‚³ãƒžãƒ³ãƒ‰å‡¦ç†ã‚’実行する
295 * リソース TskLevelRes を関連付けている
296 * リソース CntRes を関連付けている
297 * タスク2
298 * タスクID:Task2
299 * 優å…
300ˆåº¦ï¼š7
301 * 多重起動数:1
302 * スケジュール:フルプリエンプティブ
303 * 自動起動:なし
304 * 概要:並列処理タスク(メインタスクからの指令により動作)
305 * 起動されすると無限ループにå…
306¥ã‚Šï¼Œã‚³ãƒžãƒ³ãƒ‰å‡¦ç†ã‚’実行する
307 * リソース TskLevelRes を関連付けている
308 * リソース CntRes を関連付けている
309 * イベント T2Evt を関連付けている
310 * タスク3
311 * タスクID:Task3
312 * 優å…
313ˆåº¦ï¼š12
314 * 多重起動数:1
315 * スケジュール:フルプリエンプティブ
316 * 自動起動:AppMode3
317 * 概要:並列処理タスク(メインタスクからの指令により動作)
318 * 起動されすると無限ループにå…
319¥ã‚Šï¼Œã‚³ãƒžãƒ³ãƒ‰å‡¦ç†ã‚’実行する
320 * イベント待
321ちすることが可能である
322 * リソース CntRes を関連付けている
323 * イベント T3Evt を関連付けている
324 * タスク4
325 * タスクID:Task4
326 * 優å…
327ˆåº¦ï¼š6
328 * 多重起動数:5
329 * スケジュール:フルプリエンプティブ
330 * 自動起動:なし
331 * 概要:並列処理タスク(メインタスクからの指令により動作)
332 * 起動されすると無限ループにå…
333¥ã‚Šï¼Œã‚³ãƒžãƒ³ãƒ‰å‡¦ç†ã‚’実行する
334 * リソース TskLevelRes を関連付けている
335 * リソース CntRes を関連付けている
336 * 内
337部リソース GroupRes を関連付けている
338 * タスク5
339 * タスクID:Task5
340 * 優å…
341ˆåº¦ï¼š9
342 * 多重起動数:5
343 * スケジュール:フルプリエンプティブ
344 * 自動起動:なし
345 * 概要:並列処理タスク(メインタスクからの指令により動作)
346 * 起動されすると無限ループにå…
347¥ã‚Šï¼Œã‚³ãƒžãƒ³ãƒ‰å‡¦ç†ã‚’実行する
348 * リソース TskLevelRes を関連付けている
349 * リソース CntRes を関連付けている
350 * 内
351部リソース GroupRes を関連付けている
352 * タスク6
353 * タスクID:Task6
354 * 優å…
355ˆåº¦ï¼š9
356 * 多重起動数:-
357 * スケジュール:フルプリエンプティブ
358 * 自動起動:なし
359 * 信頼OSアプリケーションに所属
360 * 概要:並列処理タスク(メインタスクからの指令により動作)
361 * SC3ではシステムタスクとして起動
362 * 起動されすると即時関数を終了する
363 * この場合でも正しくTerminateTaskが実行されるかを確認
364 * 何度起動してもOKとなる
365 * Task7とスタックをå…
366±æœ‰
367 * タスク7
368 * タスクID:Task7
369 * 優å…
370ˆåº¦ï¼š8
371 * 多重起動数:-
372 * スケジュール:フルプリエンプティブ
373 * 自動起動:なし
374 * 信頼OSアプリケーションに所属
375 * 概要:並列処理タスク(メインタスクからの指令により動作)
376 * SC3ではユーザタスクとして起動
377 * 起動されすると即時関数を終了する
378 * この場合でも正しくTerminateTaskが実行されるかを確認
379 * 何度起動してもOKとなる
380 * Task6とスタックをå…
381±æœ‰
382 * タスク8
383 * タスクID:Task8
384 * 優å…
385ˆåº¦ï¼š8
386 * 多重起動数:1
387 * スケジュール:フルプリエンプティブ
388 * 自動起動:なし
389 * 概要:起動メッセージ出力し ,アクセス権限のないTask1に対して
390 * GetTaskState()を発行して,エラーフックが上がる
391 * タスク9
392 * タスクID:Task9
393 * 優å…
394ˆåº¦ï¼š8
395 * 多重起動数:1
396 * スケジュール:フルプリエンプティブ
397 * 自動起動:なし
398 * 概要:起動メッセージ出力し,アクセス権限のあるTask2に対して
399 * GetTaskState()を発行して,Task2のステータスを出力する
400 * タスク10
401 * タスクID:Task10
402 * 優å…
403ˆåº¦ï¼š14
404 * 多重起動数:1
405 * スケジュール:フルプリエンプティブ
406 * 自動起動:なし
407 * 概要:起動メッセージ出力し,イベント(T10Evt)を待
408ち
409 * タスク11
410 * タスクID:Task11
411 * 優å…
412ˆåº¦ï¼š14
413 * 多重起動数:1
414 * スケジュール:フルプリエンプティブ
415 * 自動起動:なし
416 * 概要:起動メッセージ出力し,イベント(T11Evt)を待
417ち
418 * タスク12
419 * タスクID:Task12
420 * 優å…
421ˆåº¦ï¼š14
422 * 多重起動数:1
423 * スケジュール:フルプリエンプティブ
424 * 自動起動:なし
425 * 概要:起動メッセージ出力し,イベント(T12Evt)を待
426ち
427 * タスク13
428 * タスクID:Task13
429 * 優å…
430ˆåº¦ï¼š9
431 * 多重起動数:1
432 * スケジュール:フルプリエンプティブ
433 * 自動起動:なし
434 * 概要:信頼関数動作確認用(メインタスクからの指令により動作)
435 * 非信頼OSアプリケーションに所属
436 * 起動されする信頼関数実行後TerminateTaskで終了する
437 * Task12とスタックをå…
438±æœ‰
439 * タスク14
440 * タスクID:Task14
441 * 優å…
442ˆåº¦ï¼š8
443 * 多重起動数:1
444 * スケジュール:フルプリエンプティブ
445 * 自動起動:なし
446 * 概要:信頼関数動作確認用(メインタスクからの指令により動作)
447 * 非信頼OSアプリケーションに所属
448 * 起動されする信頼関数実行後関数を終了する
449 * この場合でも正しくTerminateTaskが実行されるかを確認
450 * Task11とスタックをå…
451±æœ‰
452 * IocTask1
453 * タスクID:IocTask1
454 * 優å…
455ˆåº¦ï¼š9
456 * 多重起動数:1
457 * スケジュール:フルプリエンプティブ
458 * 自動起動:なし
459 * 概要:IOC通信処理(IOC APIの選択,送信データ設定,実行)を行う
460 * 非信頼OSアプリケーションに所属
461 * IocTask2
462 * タスクID:IocTask2
463 * 優å…
464ˆåº¦ï¼š9
465 * 多重起動数:1
466 * スケジュール:フルプリエンプティブ
467 * 自動起動:なし
468 * 概要:IOC通信処理(IOC APIの選択,送信データ設定,実行)を行う
469 * 非信頼OSアプリケーションに所属
470 * IocTask3
471 * タスクID:IocTask3
472 * 優å…
473ˆåº¦ï¼š9
474 * 多重起動数:1
475 * スケジュール:フルプリエンプティブ
476 * 自動起動:なし
477 * 概要:IOC通信処理(IOC APIの選択,送信データ設定,実行)を行う
478 * 信頼OSアプリケーションに所属
479 * IocTask4
480 * タスクID:IocTask4
481 * 優å…
482ˆåº¦ï¼š9
483 * 多重起動数:1
484 * スケジュール:フルプリエンプティブ
485 * 自動起動:なし
486 * 概要:IOC通信処理(IOC APIの選択,送信データ設定,実行)を行う
487 * 非信頼OSアプリケーションに所属
488 *
489 * ・割込みサービスルーチン
490 * シリアルIO受信割込み
491 * ISRID:RxHwSerialInt
492 * 優å…
493ˆåº¦ï¼š2
494 * カテゴリ:2
495 * 概要:コマンドを受信する
496 * ・リソース
497 * タスクレベルリソース
498 * リソースID:TskLevelRes
499 * プロパティ:標準
500 * タスク用カウンタリソース
501 * リソースID:CntRes
502 * プロパティ:標準
503 * タスクグループリソース
504 * リソースID:GroupRes
505 * プロパティ:内
506部
507 * ・イベント
508 * メインタスクイベント
509 * イベントID:MainEvt
510 * タスク2イベント
511 * イベントID:T2Evt
512 * タスク3イベント
513 * イベントID:T3Evt
514 * ・カウンタ
515 * システムタイマカウンタ
516 * カウンタID:MAIN_HW_COUNTER
517 * カウント値:0〜999
518 * 加算値:1
519 * サンプルカウンタ
520 * カウンタID:SampleCnt
521 * カウント値:0〜99
522 * 加算値:10
523 * ・アラーム
524 * メイン周期アラーム
525 * アラームID:MainCycArm
526 * ベースカウンタID:MAIN_HW_COUNTER
527 * アクション:イベント設定 MainEvt
528 * 自動起動:なし
529 * タスク起動アラーム
530 * アラームID:ActTskArm
531 * ベースカウンタID:MAIN_HW_COUNTER
532 * アクション:タスク起動 Task1
533 * 自動起動:なし
534 * イベント設定アラーム
535 * アラームID:SetEvtArm
536 * ベースカウンタID:MAIN_HW_COUNTER
537 * アクション:イベント設定 T3Evt
538 * 自動起動:なし
539 * IncrementCounter確認用アラーム
540 * アラームID:SampleArm
541 * ベースカウンタID:SampleCnt
542 * アクション:コールバック関数実行
543 * 自動起動:なし
544 * 他OSAP所属タスク起動アラーム
545 * アラームID:ActOtherOSAPTskArm
546 * ベースカウンタID:SchtblSampleCnt
547 * アクション:タスク起動 Task4
548 * 自動起動:AppMode1, AppMode2, AppMode3
549 * 設定:カウンタ5,周期0(単発)
550 * ・アプリケーションモード
551 * 自動起動なしモード(MainTaskのみ自動起動)
552 * アプリケーションモードID:AppMode1
553 * Task1自動起動モード
554 * アプリケーションモードID:AppMode2
555 * Task3自動起動モード
556 * アプリケーションモードID:AppMode3
557 * ・信頼関数
558 * 信頼関数tfnt1
559 * 非信頼OSアプリケーションから渡された
560 * ポインタ引数の読書き操作して,計算結果を
561 * 非信頼OSアプリケーションに返す
562 * 信頼関数tfnt2
563 * 非信頼OSアプリケーションから渡された
564 * ポインタ引数の読書き操作して,計算結果を
565 * 非信頼OSアプリケーションに返す
566 * 信頼関数tfnt3
567 * 非信頼OSアプリケーションからのShutdownOSを
568 * 受け付ける
569 * 信頼関数tfnt4
570 * 非信頼OSアプリケーションから信頼OSアプリ
571 * ケーションに所属するタスクを起動する
572 *
573 * 本ファイルは信頼OSアプリケーションに
574 * 所属しているオブジェクト,sample2.cでは
575 * 非信頼OSアプリケーションに所属している
576 * オブジェクトを記述している
577 */
578
579#define TOPPERS_SVC_FUNCCALL
580
581#include "sample.h"
582#include "sample1.h"
583#include "Ioc.h"
584#include "target_hw_counter.h"
585
586#define GetAppModeInfo() (0)
587
588/*
589 * プロテクション発生時の処理レベル
590 */
591#ifdef CFG_USE_PROTECTIONHOOK
592static const char8 *faulty_context_tbl[5] = {
593 "FC_INVALID",
594 "FC_TASK",
595 "FC_C2ISR",
596 "FC_SYSTEM_HOOK",
597 "FC_TRUSTED_FUNC"
598};
599#endif /* CFG_USE_PROTECTIONHOOK */
600
601/*
602 * ファイル名,行番号の参ç…
603§ç”¨ã®å¤‰æ•°
604 */
605extern const char8 *fatal_file_name; /* ファイル名 */
606extern sint32 fatal_line_num; /* 行番号 */
607
608/*
609 * 内
610部関数プロトタイプ宣言
611 */
612sint32 main(void);
613
614DEFINE_VAR_SSTACK(StackType, stack_00[COUNT_STK_T(0x200)]);
615
616extern uint8 GetCommand(void);
617extern void PutActTsk(uint8 task_no);
618extern void PutActNonPriTsk(void);
619extern void PutTermTsk(uint8 task_no);
620extern void PutChainTsk(uint8 from_task_no, uint8 to_task_no);
621extern void PutSchedule(void);
622extern void PutTaskID(void);
623extern void PutTaskState(uint8 task_no);
624extern void PutDisAllInt(void);
625extern void PutSusAllInt(void);
626extern void PutSusOSInt(void);
627extern void PutHwCnt3(void);
628extern void PutGetCntRes(void);
629extern void PutGetTskRes(void);
630extern void PutRelTskRes(void);
631extern void PutSetEvt(uint8 task_no);
632extern void PutClrEvt(uint8 task_no);
633extern void PutGetEvt(uint8 task_no);
634extern void PutWaitEvt(uint8 task_no);
635extern void PutArmBase(void);
636extern void PutArmTick(void);
637extern void PutSetRel(uint8 alarm_no, uint8 tick_no, uint8 cycle_no);
638extern void PutCanArm(void);
639extern void PutAppMode(void);
640extern void PutActIocTsk(void);
641extern void schedule_table_sample_routine(void);
642
643TASK(IocTask3);
644TASK(IocTask4);
645static void IocProk2(void);
646static uint8 GetCommandNoWait1(void);
647
648/*
649 * 内
650部データバッファ
651 */
652extern volatile uint8 command_tbl[14]; /* コマンド引渡しテーブル */
653
654/*
655 * APIエラーログマクロ
656 *
657 * ErrorHookが有効の場合はErrorHookから
658 * エラーログを出力し, ErrorHookが無効の場合は
659 * 以下のマクロよりエラーログ出力を行う
660 */
661#if defined(CFG_USE_ERRORHOOK)
662#define error_log(api) (api)
663#define error_log_ioc(api) (api)
664#else /* !defined( CFG_USE_ERRORHOOK ) */
665#define error_log(api) \
666 { \
667 StatusType ercd; \
668 ercd = api; /* 各API実行 */ \
669 if (ercd != E_OK) { \
670 syslog(LOG_INFO, "Error:%d", atk2_strerror(ercd)); \
671 } \
672 }
673
674#define error_log_ioc(api) \
675 { \
676 StatusType ercd; \
677 ercd = api; /* 各API実行 */ \
678 if (ercd != E_OK) { \
679 syslog(LOG_INFO, "Error:%d", atk2_ioc_strerror(ercd)); \
680 } \
681 }
682#endif /* defined( CFG_USE_ERRORHOOK ) */
683
684/*
685 * 信頼関数tfnt1
686 * 非信頼OSアプリケーションから渡された
687 * ポインタ引数の読書き操作して,計算結果を
688 * 非信頼OSアプリケーションに返す
689 */
690TRUSTEDFUNCTION(TRUSTED_tfnt1, FunctionIndex, FunctionParams)
691{
692 struct parameter_struct *local = FunctionParams;
693
694 sint32 *p1;
695 sint32 p2;
696
697 p1 = local->name1;
698 p2 = local->name2;
699
700 local->return_value = (StatusType) ((*p1 * 2) + p2);
701 return(E_OK);
702}
703
704/*
705 * 信頼関数tfnt2
706 * 非信頼OSアプリケーションから渡された
707 * ポインタ引数の読書き操作して,計算結果を
708 * 非信頼OSアプリケーションに返す
709 */
710TRUSTEDFUNCTION(TRUSTED_tfnt2, FunctionIndex, FunctionParams)
711{
712 struct parameter_struct *local = FunctionParams;
713
714 sint32 *p1;
715 sint32 p2;
716
717 p1 = local->name1;
718 p2 = local->name2;
719
720 local->return_value = (StatusType) ((*p1 * 4) + p2);
721 return(E_OK);
722}
723
724/*
725 * 信頼関数tfnt3
726 * 非信頼OSアプリケーションからのShutdownOSを
727 * 受け付ける
728 */
729TRUSTEDFUNCTION(TRUSTED_tfnt3, FunctionIndex, FunctionParams)
730{
731 struct parameter_struct *local = FunctionParams;
732
733 StatusType ercd;
734
735 ercd = local->ercd;
736 ShutdownOS(ercd);
737
738 return(E_OK);
739}
740
741/*
742 * 信頼関数tfnt4
743 * 非信頼OSアプリケーションから信頼OSアプリ
744 * ケーションに所属するタスクを起動する
745 */
746TRUSTEDFUNCTION(TRUSTED_tfnt4, FunctionIndex, FunctionParams)
747{
748 struct parameter_struct *local = FunctionParams;
749
750 TaskType task_no;
751
752 task_no = local->task_no;
753
754 error_log(ActivateTask(task_no));
755
756 return(E_OK);
757}
758
759/*
760 * メインタスク
761 *
762 * ユーザコマンドの受信と,コマンドごとの処理実行
763 */
764TASK(MainTask)
765{
766 uint8 command;
767 uint8 task_no;
768 uint32 i;
769 struct parameter_struct local;
770
771 TickType val = 0U;
772 TickType eval = 0U;
773
774 /*
775 * タスク番号・コマンドバッファ初期化
776 */
777 task_no = (uint8) (0);
778 for (i = 0U; i < (sizeof(command_tbl) / sizeof(command_tbl[0])); i++) {
779 command_tbl[i] = 0U;
780 }
781
782 /*
783 * MainCycArmを周期アラームとして設定
784 */
785 SetRelAlarm(MainCycArm, TICK_FOR_10MS, TICK_FOR_10MS);
786
787 /*
788 * コマンド実行ループ
789 */
790 while (1) {
791 WaitEvent(MainEvt); /* 10msの作業時間待
792ち */
793 ClearEvent(MainEvt);
794
795 /*
796 * å…
797¥åŠ›ã‚³ãƒžãƒ³ãƒ‰å–å¾—
798 */
799 syslog(LOG_INFO, "Input Command:");
800 command = GetCommand();
801
802 /*
803 * å…
804¥åŠ›ã‚³ãƒžãƒ³ãƒ‰ãƒã‚§ãƒƒã‚¯
805 */
806 if ((command <= (uint8) (0x1fU)) || (command >= (uint8) (0x80U))) {
807 syslog(LOG_INFO, "Not ASCII character");
808 }
809 else {
810#ifndef OMIT_ECHO
811 syslog(LOG_INFO, "%c", command);
812#endif /* OMIT_ECHO */
813
814 /*
815 * コマンド判別
816 */
817 switch (command) {
818 case '1':
819 case '2':
820 case '3':
821 case '4':
822 case '5':
823 case '6':
824 case '7':
825 case '8':
826 case '9':
827 /*
828 * 処理対象タスクの変更
829 */
830 task_no = (uint8) (command - '1');
831 break;
832 case 'A':
833 case '!':
834 case '"':
835 case '#':
836 case '$':
837 case '%':
838 case 'z':
839 case 'k':
840 case 'K':
841 case 'l':
842 case 'i':
843 case 'w':
844 case 'W':
845 /*
846 * タスクへのコマンド通知
847 */
848 command_tbl[task_no] = command;
849 break;
850 /*
851 * 以降はメインタスクでコマンド処理
852 */
853 case 'a':
854 PutActTsk(task_no);
855 break;
856 case 's':
857 PutSchedule();
858 break;
859 case 'S':
860 PutActNonPriTsk();
861 break;
862 case 'Z':
863 PutTaskState(task_no);
864 break;
865 case 'x':
866 syslog(LOG_INFO, "call RAISE_CPU_EXCEPTION");
867 RAISE_CPU_EXCEPTION;
868 break;
869 case 'd':
870 PutDisAllInt();
871 break;
872 case 'D':
873 PutSusAllInt();
874 break;
875 case 'f':
876 PutSusOSInt();
877 break;
878 case 'T':
879 PutHwCnt3();
880 break;
881 case 'e':
882 PutSetEvt(task_no);
883 break;
884 case 'E':
885 PutGetEvt(task_no);
886 break;
887 case 'b':
888 PutArmBase();
889 break;
890 case 'B':
891 PutArmTick();
892 PutArmTick();
893 break;
894 case 'v':
895 /* SetRelAlarm(ActTskArm, 500, 0)を実行 */
896 PutSetRel(0U, 0U, 0U);
897 break;
898 case 'V':
899 /* SetRelAlarm(SetEvtArm, 500, 0)を実行 */
900 PutSetRel(1U, 0U, 0U);
901 break;
902 case 'h':
903 /* CancelAlarm(CallBackArm)を実行 */
904 PutCanArm();
905 break;
906 case 'c':
907 syslog(LOG_INFO, "Call IncrementCounter(SampleCnt)");
908 IncrementCounter(SampleCnt);
909 break;
910 case 'C':
911 syslog(LOG_INFO, "Call IncrementCounter(SampleCnt2)");
912 IncrementCounter(SampleCnt2);
913 break;
914 case 'j':
915 syslog(LOG_INFO, "GetCounterValue(MAIN_HW_COUNTER, val)");
916 GetCounterValue(MAIN_HW_COUNTER, &val);
917 syslog(LOG_INFO, " val = %d", val);
918 break;
919 case 'J':
920 syslog(LOG_INFO, "Pre val = %d", val);
921 syslog(LOG_INFO, "GetElapsedValue(MAIN_HW_COUNTER, val ,eval)");
922 GetElapsedValue(MAIN_HW_COUNTER, &val, &eval);
923 syslog(LOG_INFO, " val = %d", val);
924 syslog(LOG_INFO, " eval = %d", eval);
925 break;
926 case 'r':
927 syslog(LOG_INFO, "GetISRID() Call from Task Context");
928 syslog(LOG_INFO, "GetISRID() = %d", GetISRID());
929 break;
930 case 'p':
931 PutAppMode();
932 break;
933 case 't':
934 schedule_table_sample_routine();
935 break;
936 case 'q':
937 local.ercd = E_OK;
938 CallTrustedFunction(tfnt3, &local); /* ShutdownOS( E_OK ) */
939 break;
940 case 'Q':
941 local.ercd = E_OS_STATE;
942 CallTrustedFunction(tfnt3, &local); /* ShutdownOS( E_OS_STATE ) */
943 break;
944 case 'y':
945 PutActTsk(10U);
946 break;
947 case 'Y':
948 PutActTsk(11U);
949 break;
950 case 'I':
951 PutActIocTsk();
952 break;
953 default:
954 /* 上記のコマンド以外の場合,処理を行わない */
955 break;
956 }
957 }
958 }
959
960 /*
961 * ここにはこない
962 */
963 syslog(LOG_INFO, "MainTask TERMINATE");
964 error_log(TerminateTask());
965} /* TASK( MainTask ) */
966
967/*
968 * ノンプリエンプティブタスク
969 *
970 * 実行中はプリエンプトしないことの確認用
971 */
972TASK(NonPriTask)
973{
974 syslog(LOG_INFO, "NonPriTask ACTIVATE");
975 syslog(LOG_INFO, "Call ActivateTask(HighPriorityTask)");
976 error_log(ActivateTask(HighPriorityTask));
977 syslog(LOG_INFO, "NonPriTask TERMINATE");
978
979 error_log(TerminateTask());
980} /* TASK( NonPriTask ) */
981
982/*
983 * 並列実行タスク6
984 */
985TASK(Task6)
986{
987 TaskProk(5U);
988} /* TASK( Task6 ) */
989
990/*
991 * 並列実行タスク7
992 */
993TASK(Task7)
994{
995 TaskProk(6U);
996} /* TASK( Task7 ) */
997
998/*
999 * IOC確認用タスク3
1000 */
1001TASK(IocTask3)
1002{
1003 syslog(LOG_INFO, "IocTask3 ACTIVATE");
1004
1005 IocProk2();
1006
1007 syslog(LOG_INFO, "IocTask3 TERMINATE");
1008 TerminateTask();
1009} /* TASK( IocTask3 ) */
1010
1011/*
1012 * IOC確認用タスク4
1013 */
1014TASK(IocTask4)
1015{
1016 syslog(LOG_INFO, "IocTask4 ACTIVATE");
1017
1018 IocProk2();
1019
1020 syslog(LOG_INFO, "IocTask4 TERMINATE");
1021 TerminateTask();
1022} /* TASK( IocTask4 ) */
1023
1024/*
1025 * IOC確認用タスク内
1026部処理
1027 *
1028 */
1029static void
1030IocProk2(void)
1031{
1032 uint8 api; /* コマンド受信バッファ(API) */
1033 uint8 data[3]; /* 通信バッファ */
1034
1035 volatile sint32 i;
1036 Std_ReturnType ercd;
1037
1038 syslog(LOG_INFO, "Select IOC API:");
1039 api = GetCommandNoWait1();
1040#ifndef OMIT_ECHO
1041 syslog(LOG_INFO, "%c", api);
1042#endif /* OMIT_ECHO */
1043
1044 switch (api) {
1045 case '1':
1046 syslog(LOG_INFO, "Input send data:");
1047 data[0] = GetCommandNoWait1();
1048#ifndef OMIT_ECHO
1049 syslog(LOG_INFO, "%c", data[0]);
1050#endif /* OMIT_ECHO */
1051 syslog(LOG_INFO, "Call IocSend_IOC_QUE_0");
1052 error_log_ioc(IocSend_IOC_QUE_0(data[0]));
1053 break;
1054 case '2':
1055 syslog(LOG_INFO, "Input send data:");
1056 data[0] = GetCommandNoWait1();
1057#ifndef OMIT_ECHO
1058 syslog(LOG_INFO, "%c", data[0]);
1059#endif /* OMIT_ECHO */
1060
1061 syslog(LOG_INFO, "Call IocSend_IOC_QUE_1");
1062 error_log_ioc(IocSend_IOC_QUE_1(data[0]));
1063 break;
1064 case '3':
1065 for (i = 0; i < 3U; i++) {
1066 syslog(LOG_INFO, "Input send data%d:", i);
1067 data[i] = GetCommandNoWait1();
1068#ifndef OMIT_ECHO
1069 syslog(LOG_INFO, "%c", data[i]);
1070#endif /* OMIT_ECHO */
1071 }
1072 syslog(LOG_INFO, "Call IocWriteGroup_IOC_DEQUE");
1073 error_log_ioc(IocWriteGroup_IOC_DEQUE(data[0], data[1], data[2]));
1074 break;
1075 case '4':
1076 syslog(LOG_INFO, "Call IocReceive_IOC_QUE");
1077 ercd = IocReceive_IOC_QUE(&data[0]);
1078#if !defined(CFG_USE_ERRORHOOK)
1079 if (ercd != E_OK) {
1080 syslog(LOG_INFO, "Error:%d", atk2_ioc_strerror(ercd));
1081 }
1082#endif /* !defined( CFG_USE_ERRORHOOK ) */
1083 if ((ercd == IOC_E_OK) || (ercd == IOC_E_LOST_DATA)) {
1084 syslog(LOG_INFO, "recv data:%c", data[0]);
1085 }
1086 break;
1087 case '5':
1088 syslog(LOG_INFO, "Call IocReadGroup_IOC_DEQUE");
1089 error_log_ioc(IocReadGroup_IOC_DEQUE(&data[0], &data[1], &data[2]));
1090 for (i = 0; i < 3U; i++) {
1091 syslog(LOG_INFO, "recv data%d:%c", i, data[i]);
1092 }
1093 break;
1094 case '6':
1095 syslog(LOG_INFO, "Call IocEmptyQueue_IOC_QUE");
1096 error_log_ioc(IocEmptyQueue_IOC_QUE());
1097 break;
1098 default:
1099 syslog(LOG_INFO, "undefined command");
1100 break;
1101 }
1102} /* IocProk2 */
1103
1104/*
1105 * コマンド受信処理(ウェイト無し)
1106 */
1107uint8
1108GetCommandNoWait1(void)
1109{
1110 uint8 command; /* コマンド受信バッファ */
1111
1112 /*
1113 * コマンドを受信するまでループ
1114 */
1115 command = '\0';
1116 do {
1117 RecvPolSerialChar(&command); /* 受信バッファポーリング */
1118 if (command == '\n') {
1119 command = '\0';
1120 }
1121 } while (command == '\0');
1122
1123
1124 return(command);
1125} /* GetCommandNoWait1 */
1126
1127/*
1128 * ユーザメイン関数
1129 *
1130 * アプリケーションモードの判断と,カーネル起動
1131 */
1132sint32
1133main(void)
1134{
1135 AppModeType crt_app_mode;
1136
1137 /*
1138 * アプリケーションモードの判断
1139 */
1140 switch (GetAppModeInfo()) {
1141 case 0:
1142 crt_app_mode = AppMode1;
1143 break;
1144 case 1:
1145 crt_app_mode = AppMode2;
1146 break;
1147 default:
1148 crt_app_mode = AppMode3;
1149 break;
1150 }
1151
1152 /*
1153 * カーネル起動
1154 */
1155 StartOS(crt_app_mode);
1156
1157 while (1) {
1158 }
1159} /* main */
1160
1161/*
1162 * エラーフックルーチン
1163 */
1164#ifdef CFG_USE_ERRORHOOK
1165void
1166ErrorHook(StatusType Error)
1167{
1168
1169 /*
1170 * エラー要因ごとのパラメータログ出力
1171 */
1172 switch (OSErrorGetServiceId()) {
1173 case OSServiceId_ActivateTask:
1174 syslog(LOG_INFO, "Error:%s=ActivateTask(%d)", atk2_strerror(Error), OSError_ActivateTask_TaskID());
1175 break;
1176 case OSServiceId_TerminateTask:
1177 syslog(LOG_INFO, "Error:%s=TerminateTask()", atk2_strerror(Error));
1178 break;
1179 case OSServiceId_ChainTask:
1180 syslog(LOG_INFO, "Error:%s=ChainTask(%d)", atk2_strerror(Error), OSError_ChainTask_TaskID());
1181 break;
1182 case OSServiceId_Schedule:
1183 syslog(LOG_INFO, "Error:%s=Schedule()", atk2_strerror(Error));
1184 break;
1185 case OSServiceId_GetTaskID:
1186 syslog(LOG_INFO, "Error:%s=GetTaskID(0x%p)", atk2_strerror(Error), OSError_GetTaskID_TaskID());
1187 break;
1188 case OSServiceId_GetTaskState:
1189 syslog(LOG_INFO, "Error:%s=GetTaskState(%d, 0x%p)", atk2_strerror(Error),
1190 OSError_GetTaskState_TaskID(), OSError_GetTaskState_State());
1191 break;
1192 case OSServiceId_EnableAllInterrupts:
1193 syslog(LOG_INFO, "Error:%s=EnableAllInterrupts()", atk2_strerror(Error));
1194 break;
1195 case OSServiceId_DisableAllInterrupts:
1196 syslog(LOG_INFO, "Error:%s=DisableAllInterrupts()", atk2_strerror(Error));
1197 break;
1198 case OSServiceId_ResumeAllInterrupts:
1199 syslog(LOG_INFO, "Error:%s=ResumeAllInterrupts()", atk2_strerror(Error));
1200 break;
1201 case OSServiceId_SuspendAllInterrupts:
1202 syslog(LOG_INFO, "Error:%s=SuspendAllInterrupts()", atk2_strerror(Error));
1203 break;
1204 case OSServiceId_ResumeOSInterrupts:
1205 syslog(LOG_INFO, "Error:%s=ResumeOSInterrupts()", atk2_strerror(Error));
1206 break;
1207 case OSServiceId_SuspendOSInterrupts:
1208 syslog(LOG_INFO, "Error:%s=SuspendOSInterrupts()", atk2_strerror(Error));
1209 break;
1210 case OSServiceId_GetISRID:
1211 syslog(LOG_INFO, "Error:%s=GetISRID()", atk2_strerror(Error));
1212 break;
1213 case OSServiceId_GetResource:
1214 syslog(LOG_INFO, "Error:%s=GetResource(%d)", atk2_strerror(Error), OSError_GetResource_ResID());
1215 break;
1216 case OSServiceId_ReleaseResource:
1217 syslog(LOG_INFO, "Error:%s=ReleaseResource(%d)", atk2_strerror(Error), OSError_ReleaseResource_ResID());
1218 break;
1219 case OSServiceId_SetEvent:
1220 syslog(LOG_INFO, "Error:%s=SetEvent(%d, 0x%x)", atk2_strerror(Error),
1221 OSError_SetEvent_TaskID(), OSError_SetEvent_Mask());
1222 break;
1223 case OSServiceId_ClearEvent:
1224 syslog(LOG_INFO, "Error:%s=ClearEvent(0x%x)", atk2_strerror(Error), OSError_ClearEvent_Mask());
1225 break;
1226 case OSServiceId_GetEvent:
1227 syslog(LOG_INFO, "Error:%s=GetEvent(%d, 0x%p)", atk2_strerror(Error),
1228 OSError_GetEvent_TaskID(), OSError_GetEvent_Event());
1229 break;
1230 case OSServiceId_WaitEvent:
1231 syslog(LOG_INFO, "Error:%s=WaitEvent(0x%x)", atk2_strerror(Error), OSError_WaitEvent_Mask());
1232 break;
1233 case OSServiceId_GetAlarmBase:
1234 syslog(LOG_INFO, "Error:%s=GetAlarmBase(0x%p)", atk2_strerror(Error), OSError_GetAlarmBase_AlarmID());
1235 break;
1236 case OSServiceId_GetAlarm:
1237 syslog(LOG_INFO, "Error:%s=GetAlarm(%d, 0x%p)", atk2_strerror(Error),
1238 OSError_GetAlarm_AlarmID(), OSError_GetAlarm_Tick());
1239 break;
1240 case OSServiceId_SetRelAlarm:
1241 syslog(LOG_INFO, "Error:%s=SetRelAlarm(%d, %d, %d)", atk2_strerror(Error),
1242 OSError_SetRelAlarm_AlarmID(), OSError_SetRelAlarm_increment(), OSError_SetRelAlarm_cycle());
1243 break;
1244 case OSServiceId_SetAbsAlarm:
1245 syslog(LOG_INFO, "Error:%s=SetAbsAlarm(%d, %d, %d)", atk2_strerror(Error),
1246 OSError_SetAbsAlarm_AlarmID(), OSError_SetAbsAlarm_start(), OSError_SetAbsAlarm_cycle());
1247 break;
1248 case OSServiceId_CancelAlarm:
1249 syslog(LOG_INFO, "Error:%s=CancelAlarm(%d)", atk2_strerror(Error), OSError_CancelAlarm_AlarmID());
1250 break;
1251 case OSServiceId_StartScheduleTableRel:
1252 syslog(LOG_INFO, "Error:%s=StartScheduleTableRel(%d, %d)", atk2_strerror(Error),
1253 OSError_StartScheduleTableRel_ScheduleTableID(), OSError_StartScheduleTableRel_Offset());
1254 break;
1255 case OSServiceId_StartScheduleTableAbs:
1256 syslog(LOG_INFO, "Error:%s=StartScheduleTableAbs(%d, %d)", atk2_strerror(Error),
1257 OSError_StartScheduleTableAbs_ScheduleTableID(), OSError_StartScheduleTableAbs_Start());
1258 break;
1259 case OSServiceId_StopScheduleTable:
1260 syslog(LOG_INFO, "Error:%s=StopScheduleTable(%d)", atk2_strerror(Error), OSError_StopScheduleTable_ScheduleTableID());
1261 break;
1262 case OSServiceId_NextScheduleTable:
1263 syslog(LOG_INFO, "Error:%s=NextScheduleTable(%d, %d)", atk2_strerror(Error),
1264 OSError_NextScheduleTable_ScheduleTableID_From(), OSError_NextScheduleTable_ScheduleTableID_To());
1265 break;
1266 case OSServiceId_GetScheduleTableStatus:
1267 syslog(LOG_INFO, "Error:%s=GetScheduleTableStatus(%d, 0x%p)", atk2_strerror(Error),
1268 OSError_GetScheduleTableStatus_ScheduleTableID(), OSError_GetScheduleTableStatus_ScheduleStatus());
1269 break;
1270 case OSServiceId_GetActiveApplicationMode:
1271 syslog(LOG_INFO, "Error:%s=GetActiveApplicationMode()", atk2_strerror(Error));
1272 break;
1273 case OSServiceId_StartOS:
1274 syslog(LOG_INFO, "Error:%s=StartOS()", atk2_strerror(Error));
1275 break;
1276 case OSServiceId_ShutdownOS:
1277 syslog(LOG_INFO, "Error:%s=ShutdownOS()", atk2_strerror(Error));
1278 break;
1279 case OSServiceId_IncrementCounter:
1280 syslog(LOG_INFO, "Error:%s=IncrementCounter(%d)", atk2_strerror(Error), OSError_IncrementCounter_CounterID());
1281 break;
1282 case OSServiceId_TaskMissingEnd:
1283 syslog(LOG_INFO, "Error:%s=MissingEnd()", atk2_strerror(Error));
1284 break;
1285 case IOCServiceId_IOC_Send:
1286 syslog(LOG_INFO, "Error:%s=MissingEnd()", atk2_ioc_strerror(Error));
1287 break;
1288 case IOCServiceId_IOC_Write:
1289 syslog(LOG_INFO, "Error:%s=MissingEnd()", atk2_ioc_strerror(Error));
1290 break;
1291 case IOCServiceId_IOC_SendGroup:
1292 syslog(LOG_INFO, "Error:%s=MissingEnd()", atk2_ioc_strerror(Error));
1293 break;
1294 case IOCServiceId_IOC_WriteGroup:
1295 syslog(LOG_INFO, "Error:%s=MissingEnd()", atk2_ioc_strerror(Error));
1296 break;
1297 case IOCServiceId_IOC_Receive:
1298 syslog(LOG_INFO, "Error:%s=MissingEnd()", atk2_ioc_strerror(Error));
1299 break;
1300 case IOCServiceId_IOC_Read:
1301 syslog(LOG_INFO, "Error:%s=MissingEnd()", atk2_ioc_strerror(Error));
1302 break;
1303 case IOCServiceId_IOC_ReceiveGroup:
1304 syslog(LOG_INFO, "Error:%s=MissingEnd()", atk2_ioc_strerror(Error));
1305 break;
1306 case IOCServiceId_IOC_ReadGroup:
1307 syslog(LOG_INFO, "Error:%s=MissingEnd()", atk2_ioc_strerror(Error));
1308 break;
1309 case IOCServiceId_IOC_EmptyQueue:
1310 syslog(LOG_INFO, "Error:%s=MissingEnd()", atk2_ioc_strerror(Error));
1311 break;
1312 default:
1313 syslog(LOG_INFO, "Error:%s=UnKnownFunc()", atk2_strerror(Error));
1314 break;
1315 }
1316
1317}
1318#endif /* CFG_USE_ERRORHOOK */
1319
1320/*
1321 * プレタスクフックルーチン
1322 *
1323 * Task13/Task14実行前のプレタスクフックの場合,メッセージを出力
1324 */
1325#ifdef CFG_USE_PRETASKHOOK
1326void
1327PreTaskHook(void)
1328{
1329 TaskType tskid;
1330
1331 GetTaskID(&tskid);
1332 if (tskid == Task13) {
1333 syslog(LOG_INFO, "\nPreTaskHook before Task13!\n");
1334 }
1335 if (tskid == Task14) {
1336 syslog(LOG_INFO, "\nPreTaskHook before Task14!\n");
1337 }
1338}
1339#endif /* CFG_USE_PRETASKHOOK */
1340
1341/*
1342 * ポストタスクフックルーチン
1343 *
1344 * Task13/Task14実行後のポストタスクフックの場合,メッセージを出力
1345 */
1346#ifdef CFG_USE_POSTTASKHOOK
1347void
1348PostTaskHook(void)
1349{
1350 TaskType tskid;
1351
1352 GetTaskID(&tskid);
1353 if (tskid == Task13) {
1354 syslog(LOG_INFO, "\nPostTaskHook after Task13!\n");
1355 }
1356 if (tskid == Task14) {
1357 syslog(LOG_INFO, "\nPostTaskHook after Task14!\n");
1358 }
1359}
1360#endif /* CFG_USE_POSTTASKHOOK */
1361
1362/*
1363 * スタートアップフックルーチン
1364 */
1365#ifdef CFG_USE_STARTUPHOOK
1366#ifdef TOPPERS_ENABLE_SYS_TIMER
1367extern void target_timer_initialize(void);
1368#endif /* TOPPERS_ENABLE_SYS_TIMER */
1369
1370void
1371StartupHook(void)
1372{
1373#ifdef TOPPERS_ENABLE_SYS_TIMER
1374 target_timer_initialize();
1375#endif /* TOPPERS_ENABLE_SYS_TIMER */
1376 syslog_initialize();
1377 syslog_msk_log(LOG_UPTO(LOG_INFO));
1378 InitSerial();
1379 print_banner();
1380}
1381#endif /* CFG_USE_STARTUPHOOK */
1382
1383/*
1384 * シャットダウンフックルーチン
1385 */
1386#ifdef CFG_USE_SHUTDOWNHOOK
1387#ifdef TOPPERS_ENABLE_SYS_TIMER
1388extern void target_timer_terminate(void);
1389#endif /* TOPPERS_ENABLE_SYS_TIMER */
1390
1391void
1392ShutdownHook(StatusType Error)
1393{
1394 /* 終了ログ出力 */
1395 syslog(LOG_INFO, "Sample System ShutDown");
1396 syslog(LOG_INFO, "ShutDownCode:%s", atk2_strerror(Error));
1397 syslog(LOG_INFO, "");
1398
1399 if (Error == E_OS_SYS_ASSERT_FATAL) {
1400 syslog(LOG_INFO, "fatal_file_name:%s", fatal_file_name);
1401 syslog(LOG_INFO, "fatal_line_num:%d", fatal_line_num);
1402 }
1403
1404#ifdef TOPPERS_ENABLE_SYS_TIMER
1405 target_timer_terminate();
1406#endif /* TOPPERS_ENABLE_SYS_TIMER */
1407 TermSerial();
1408
1409}
1410#endif /* CFG_USE_SHUTDOWNHOOK */
1411
1412/*
1413 * プロテクションフックルーチン
1414 */
1415#ifdef CFG_USE_PROTECTIONHOOK
1416ProtectionReturnType
1417ProtectionHook(StatusType FatalError)
1418{
1419 StatusType ercd;
1420 FaultyContextType faulty_context;
1421 TaskType taskid;
1422
1423 syslog(LOG_INFO, "ProtectionHook");
1424
1425 if (FatalError == E_OS_STACKFAULT) {
1426 syslog(LOG_INFO, "E_OS_STACKFAULT");
1427 ercd = PRO_SHUTDOWN;
1428 }
1429 else if (FatalError == E_OS_PROTECTION_EXCEPTION) {
1430 faulty_context = GetFaultyContext();
1431 syslog(LOG_INFO, "E_OS_PROTECTION_EXCEPTION and GetFaultyContext() = %s", faulty_context_tbl[faulty_context]);
1432
1433 switch (faulty_context) {
1434 case FC_TASK:
1435 ercd = GetTaskID(&taskid);
1436 if (taskid == MainTask) {
1437 ercd = PRO_IGNORE;
1438 }
1439 else {
1440 ercd = PRO_TERMINATETASKISR;
1441 }
1442 break;
1443 case FC_C2ISR:
1444 ercd = PRO_TERMINATETASKISR;
1445 break;
1446 case FC_SYSTEM_HOOK:
1447 ercd = PRO_IGNORE;
1448 break;
1449 case FC_TRUSTED_FUNC:
1450 ercd = PRO_IGNORE;
1451 break;
1452 case FC_INVALID:
1453 ercd = PRO_SHUTDOWN;
1454 break;
1455 default:
1456 ercd = PRO_SHUTDOWN;
1457 syslog(LOG_INFO, "unknown error fo GetFaultyContext() = %d", faulty_context);
1458 }
1459 }
1460 else {
1461 ercd = PRO_SHUTDOWN;
1462 }
1463
1464 return(ercd);
1465}
1466#endif /* CFG_USE_PROTECTIONHOOK */
Note: See TracBrowser for help on using the repository browser.