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