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