source: atk2-sc3_fl850f1l/arch/ccrh/sample/sample1.c@ 117

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

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

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