source: autosar_os_training/trunk/program/sample/sample1.c@ 124

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

AUTOSAR OS教材用のファイルをコミット.

File size: 44.2 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 1801 2015-03-27 06:34:43Z t_ishikawa $
57 */
58
59/*
60 * サンプルプログラム(1)の本体
61 *
62 * ATK2-SC1の基本的な動作を確認するためのサンプルプログラム
63 *
64 * プログラムの概要:PCとボード間でシリアル通信を行い,ユーザ入力
65 * コマンドに応じた動作とログ出力を行なう
66 *
67 * <コマンド一覧>
68 * ・タスク指定
69 * '1' : 以降のコマンドを Task1 に対して行う
70 * '2' : 以降のコマンドを Task2 に対して行う
71 * '3' : 以降のコマンドを Task3 に対して行う
72 * '4' : 以降のコマンドを Task4 に対して行う
73 * '5' : 以降のコマンドを Task5 に対して行う
74 * ・タスク管理機能
75 * 'a' : ActivateTask にてタスクを起動する.
76 * 'A' : TerminateTask にてタスクを終了する.
77 * '!'(Shift+1) : ChainTask にてタスクを終了し,Task1 を起動する
78 * '"'(Shift+2) : ChainTask にてタスクを終了し,Task2 を起動する
79 * '#'(Shift+3) : ChainTask にてタスクを終了し,Task3 を起動する
80 * '$'(Shift+4) : ChainTask にてタスクを終了し,Task4 を起動する
81 * '%'(Shift+5) : ChainTask にてタスクを終了し,Task5 を起動する
82 * 's' : ノンプリエンプティブ属性であるタスク MainTask にて最高
83 * 優先度タスク HighPriorityTask を起動し,Schedule にて
84 * 再スケジューリングを行う
85 * 'S' : ノンプリエンプティブタスク NonPriTask を起動する
86 * ノンプリエンプティブタスク NonPriTask にて最高優先度
87 * タスク HighPriorityTask を起動し,タスク終了する
88 * 'z' : 実行中のタスクから GetTaskID を実行して,実行状態の TaskID を取得する
89 * 'Z' : メインタスクから GetTaskState を実行して,対象タスクの状態を取得する
90 * 'x' : div命令を実行して,未定義命令例外を発生させる
91 * ・割込み管理機能
92 * 'd' : DisableAllInterrupts を実行後,ハードウェアカウンタ値を
93 * 3回表示し, EnableAllInterrupts を実行する
94 * 'D' : SuspendAllInterrupts を実行後,ハードウェアカウンタ値を
95 * 3回表示し,さらに SuspendAllInterrupts を実行後,ハード
96 * ウェアカウンタ値を3回表示し,ResumeAllInterrupts を実行後,
97 * ハードウェアカウンタ値を3回表示し,ResumeAllInterrupts を
98 * 実行する
99 * 'f' : SuspendOSInterrupts を実行後,ハードウェアカウンタ値を
100 * 3回表示し,さらに SuspendOSInterrupts を実行後,ハード
101 * ウェアカウンタ値を3回表示し,さらに SuspendAllInterrupts
102 * を実行後,ハードウェアカウンタ値を3回表示し,
103 * ResumeAllInterrupts を実行後,ハードウェアカウンタを3回
104 * 表示し,ResumeOSInterrupts を実行後ハードウェアカウンタ
105 * 値を3回表示し,ResumeOSInterrupts を実行する
106 * 'T' : ハードウェアカウンタ値を3回表示する
107 * ・リソース管理機能
108 * 'k' : GetResource にてリソース TskLevelRes を取得する.なお,
109 * Task3 は,このリソースより優先度が高いためエラーとなる
110 * 'K' : ReleaseResource にてリソース TskLevelRes を解放する
111 * 'i' : GetResource にてリソース CntRes を取得後,ハードウェア
112 * カウンタ値を3回表示し,ReleaseResource にてリソース
113 * CntRes を解放する
114 * ・イベント制御機能
115 * 'e' : SetEvent にてイベントを設定する.Task2 と Task3 以外は
116 * 割り当てがないためエラーとなる
117 * 'w' : ClearEvent にて自タスクのイベントをクリアする.Task2 と
118 * Task3 以外は割り当てがないためエラーとなる
119 * 'E' : GetEvent にてイベント状態を取得する.Task2 と Task3
120 * 以外は割り当てがないためエラーとなる
121 * 'W' : WaitEvent にて自タスクのイベントを待つ.Task3 と Task4
122 * 以外はエラーとなる
123 * ・アラーム機能
124 * 'b' : GetAlarmBase にてアラーム MainCycArm のアラームベース
125 * 情報を取得する
126 * 'B' : GetAlarm にてアラーム MainCycArm の残りカウント値を2回
127 * 連続で取得する
128 * 'v' : SetRelAlarm にてアラーム ActTskArm を起動し,500ms 後に
129 * タスク Task1 を起動する
130 * 'V' : SetRelAlarm にてアラーム SetEvtArm を起動し,500ms 後に
131 * イベント T3Evt を設定する
132 * 'n' : SetRelAlarm にてアラーム CallBackArm を,パラメータ
133 * 900ms 後に満了・単発アラーム指定で設定する
134 * 'N' : SetRelAlarm にてアラーム CallBackArm を,パラメータ
135 * 900ms 後に満了・ 500ms 周期アラーム指定で設定する
136 * 'm' : SetAbsAlarm にてアラーム CallBackArm を,パラメータ
137 * カウンタ値900に満了・単発アラーム指定で設定する
138 * 'M' : SetAbsAlarm にてアラーム CallBackArm を,パラメータ
139 * カウンタ値900に満了・ 500ms 周期アラームで設定する
140 * 'h' : CancelAlarm にてアラーム CallBackArm をキャンセルする
141 * ・カウンタ操作機能
142 * 'c' : タスクにて IncrementCounter を実行し,カウンタ SampleCnt
143 * にシグナル通知する
144 * 1 シグナルでアラーム SampleArm が満了し,コールバックを
145 * 実行する
146 * 'C' : タスクにて IncrementCounter を実行し,カウンタ SampleCnt2
147 * にシグナル通知する
148 * 1 シグナルでアラーム SampleArm1 が満了し,SampleCnt3 を
149 * インクリメントする. SampleCnt3 は 1 シグナルで SampleAlm2
150 * が満了しコールバックを実行する
151 * 'j' : タスクにて GetCounterValue を実行する
152 * 取得した値は保存する
153 * 'J' : タスクにて GetEalsedCounterValue を実行する
154 * 元の値は前回のGetCounterValue または GetEalsedCounterValue にて取得
155 * した値とする.初回,または,GetCounterValueを実行していない場合は0
156 * とする
157 *
158 * 'r' : タスクにて GetISRIDを実行する
159 * タスクコンテキストからはGetISRIDを呼出した場合はエラーとして
160 * INVALID_ISRが返却される
161 *
162 * 割込みコンテキストからのGetISRID発行は,SystemTimerCntのコールバック
163 * ルーチン('n' コマンドで実行)にて行う
164 *
165 * タスクコンテキストからのGetISRID発行は,SampleCnt2のコールバック
166 * ルーチン('C' または 'c' コマンドで実行)にて行う
167 *
168 * ・スケジュールテーブル制御機能
169 * 't' : スケジュールテーブル動作制御ON/OFF
170 *
171 * 'i' : SchtblSampleCntカウンタをインクリメントする
172 * SchtblSampleCntカウンタはスケジュールテーブルの駆動カウンタ
173 * '1' : 以降のコマンドを scheduletable1 に対して行う(デフォルト値)
174 * '2' : 以降のコマンドを scheduletable2 に対して行う.
175 * '3' : 以降のコマンドを scheduletable3(存在しないID) に対して行う
176 * コマンドのエラー確認にも使用する
177 * 's' : StartScheduleTableRelを実行し,相対値(5)でスケジュールテーブルを開始する
178 * 'S' : StartScheduleTableAbsを実行し,絶対値(5)でスケジュールテーブルを開始する
179 * 'f' : StopScheduleTableを実行し,スケジュールテーブルを停止する
180 * 'n' : NextScheduleTableを実行し,scheduletable2に切替える
181 * 'N' : NextScheduleTableを実行し,scheduletable1に切替える
182 * 'g' : GetScheduleTableStatusを実行し,スケジュールテーブル状態を取得する
183 * 'q' : ShutdownOS( E_OK ) OS実行制御機能の'q'と同等機能
184 * 'Q' : ShutdownOS( E_OS_STATE ) OS実行制御機能の'Q'と同等機能
185 *
186 * ・OS実行制御機能
187 * 'p' : GetActiveApplicationMode にてアプリケーションモードを
188 * 取得する
189 * 'q' : ShutdownOS をコード E_OK で実行し,サンプルプログラムを
190 * 終了する
191 * 'Q' : ShutdownOS をコード E_OS_STATE で実行し,サンプルプログラム
192 * を終了する
193 *
194 * <オブジェクト一覧>
195 * ・OS
196 * スタートアップフック:使用
197 * シャットダウンフック:使用
198 * エラーフック:使用
199 * プレタスクフック:未使用
200 * ポストタスクフック:未使用
201 * ・タスク
202 * メインタスク
203 * タスクID:MainTask
204 * 優先度:14
205 * 多重起動数:1
206 * スケジュール:ノンプリエンプティブ
207 * 自動起動:AppMode1, AppMode2, AppMode3
208 * 概要:ユーザインタフェース(シリアルIOよりコマンドを受信し,
209 * それに対応した動作を行なう)
210 * 周期アラーム MainCycArm により,10msごとに待ち解除し
211 * コマンドの受信有無をポーリングする
212 * イベント(ID:MainEvt)を関連付けている
213 * 最高優先度タスク
214 * タスクID:HighPriorityTask
215 * 優先度:15
216 * 多重起動数:1
217 * スケジュール:フルプリエンプティブ
218 * 自動起動:なし
219 * 概要:起動ログを出力して終了する.ノンプリエンプティブタスク
220 * から起動され,プリエンプトしているかどうかの確認用
221 * ノンプリエンプティブタスク
222 * タスクID:NonPriTask
223 * 優先度:1
224 * 多重起動数:8
225 * スケジュール:ノンプリエンプティブ
226 * 自動起動:なし
227 * 概要:起動ログを出力し,最高優先度タスク HighPriorityTask を
228 * 起動後,終了ログを出力してタスクを終了する
229 * タスク1
230 * タスクID:Task1
231 * 優先度:4
232 * スケジュール:フルプリエンプティブ
233 * 自動起動:AppMode2
234 * 多重起動数:8
235 * 概要:並列処理タスク(メインタスクからの指令により動作)
236 * 起動されすると無限ループに入り,コマンド処理を実行する
237 * リソース TskLevelRes を関連付けている
238 * リソース CntRes を関連付けている
239 * タスク2
240 * タスクID:Task2
241 * 優先度:7
242 * 多重起動数:1
243 * スケジュール:フルプリエンプティブ
244 * 自動起動:なし
245 * 概要:並列処理タスク(メインタスクからの指令により動作)
246 * 起動されすると無限ループに入り,コマンド処理を実行する
247 * リソース TskLevelRes を関連付けている
248 * リソース CntRes を関連付けている
249 * イベント T2Evt を関連付けている
250 * タスク3
251 * タスクID:Task3
252 * 優先度:12
253 * 多重起動数:1
254 * スケジュール:フルプリエンプティブ
255 * 自動起動:AppMode3
256 * 概要:並列処理タスク(メインタスクからの指令により動作)
257 * 起動されすると無限ループに入り,コマンド処理を実行する
258 * イベント待ちすることが可能である
259 * リソース CntRes を関連付けている
260 * イベント T3Evt を関連付けている
261 * タスク4
262 * タスクID:Task4
263 * 優先度:6
264 * 多重起動数:5
265 * スケジュール:フルプリエンプティブ
266 * 自動起動:なし
267 * 概要:並列処理タスク(メインタスクからの指令により動作)
268 * 起動されすると無限ループに入り,コマンド処理を実行する
269 * リソース TskLevelRes を関連付けている
270 * リソース CntRes を関連付けている
271 * 内部リソース GroupRes を関連付けている
272 * タスク5
273 * タスクID:Task5
274 * 優先度:9
275 * 多重起動数:5
276 * スケジュール:フルプリエンプティブ
277 * 自動起動:なし
278 * 概要:並列処理タスク(メインタスクからの指令により動作)
279 * 起動されすると無限ループに入り,コマンド処理を実行する
280 * リソース TskLevelRes を関連付けている
281 * リソース CntRes を関連付けている
282 * 内部リソース GroupRes を関連付けている
283 * タスク6
284 * タスクID:Task6
285 * 優先度:14
286 * 多重起動数:1
287 * スケジュール:フルプリエンプティブ
288 * 自動起動:なし
289 * 概要:起動メッセージ出力し,イベント(T6Evt)を待ち
290 * タスク7
291 * タスクID:Task7
292 * 優先度:14
293 * 多重起動数:1
294 * スケジュール:フルプリエンプティブ
295 * 自動起動:なし
296 * 概要:起動メッセージ出力し,イベント(T7Evt)を待ち
297 * タスク8
298 * タスクID:Task8
299 * 優先度:14
300 * 多重起動数:1
301 * スケジュール:フルプリエンプティブ
302 * 自動起動:なし
303 * 概要:起動メッセージ出力し,イベント(T8Evt)を待ち
304 *
305 * ・割込みサービスルーチン
306 * シリアルIO受信割込み
307 * ISRID:RxHwSerialInt
308 * 優先度:2
309 * カテゴリ:2
310 * 概要:コマンドを受信する
311 * ・リソース
312 * タスクレベルリソース
313 * リソースID:TskLevelRes
314 * プロパティ:標準
315 * タスク用カウンタリソース
316 * リソースID:CntRes
317 * プロパティ:標準
318 * タスクグループリソース
319 * リソースID:GroupRes
320 * プロパティ:内部
321 * ・イベント
322 * メインタスクイベント
323 * イベントID:MainEvt
324 * タスク2イベント
325 * イベントID:T2Evt
326 * タスク3イベント
327 * イベントID:T3Evt
328 * ・カウンタ
329 * システムタイマカウンタ
330 * カウンタID:MAIN_HW_COUNTER
331 * カウント値:0〜999
332 * 加算値:1
333 * サンプルカウンタ
334 * カウンタID:SampleCnt
335 * カウント値:0〜99
336 * 加算値:10
337 * ・アラーム
338 * メイン周期アラーム
339 * アラームID:MainCycArm
340 * ベースカウンタID:MAIN_HW_COUNTER
341 * アクション:イベント設定 MainEvt
342 * 自動起動:なし
343 * タスク起動アラーム
344 * アラームID:ActTskArm
345 * ベースカウンタID:MAIN_HW_COUNTER
346 * アクション:タスク起動 Task1
347 * 自動起動:なし
348 * イベント設定アラーム
349 * アラームID:SetEvtArm
350 * ベースカウンタID:MAIN_HW_COUNTER
351 * アクション:イベント設定 T3Evt
352 * 自動起動:なし
353 * コールバック実行アラーム
354 * アラームID:CallBackArm
355 * ベースカウンタID:MAIN_HW_COUNTER
356 * アクション:コールバック関数実行
357 * 自動起動:なし
358 * IncrementCounter確認用アラーム
359 * アラームID:SampleArm
360 * ベースカウンタID:SampleCnt
361 * アクション:コールバック関数実行
362 * 自動起動:なし
363 * ・アプリケーションモード
364 * 自動起動なしモード
365 * アプリケーションモードID:AppMode1
366 * Task1自動起動モード
367 * アプリケーションモードID:AppMode2
368 * Task3自動起動モード
369 * アプリケーションモードID:AppMode3
370 *
371 */
372
373#include "Os.h"
374#include "t_syslog.h"
375#include "t_stdlib.h"
376#include "sysmod/serial.h"
377#include "sysmod/syslog.h"
378#include "sample1.h"
379
380#include "sysmod/banner.h"
381#include "target_sysmod.h"
382#include "target_serial.h"
383#include "target_hw_counter.h"
384
385
386#define GetHwCnt(x, y)
387#define GetAppModeInfo() (0)
388
389/*
390 * ファイル名,行番号の参照用の変数
391 */
392extern const char8 *fatal_file_name; /* ファイル名 */
393extern sint32 fatal_line_num; /* 行番号 */
394
395/*
396 * 内部関数プロトタイプ宣言
397 */
398sint32 main(void);
399TASK(MainTask);
400TASK(HighPriorityTask);
401TASK(NonPriTask);
402TASK(Task1);
403TASK(Task2);
404TASK(Task3);
405TASK(Task4);
406TASK(Task5);
407TASK(Task6);
408TASK(Task7);
409TASK(Task8);
410ALARMCALLBACK(SysTimerAlmCb);
411static void TaskProk(uint8 task_no);
412static uint8 GetCommand(void);
413static void PutActTsk(uint8 task_no);
414static void PutActNonPriTsk(void);
415static void PutTermTsk(uint8 task_no);
416static void PutChainTsk(uint8 from_task_no, uint8 to_task_no);
417static void PutSchedule(void);
418static void PutTaskID(void);
419static void PutTaskState(uint8 task_no);
420static void PutDisAllInt(void);
421static void PutSusAllInt(void);
422static void PutSusOSInt(void);
423static void PutHwCnt3(void);
424static void PutGetCntRes(void);
425static void PutGetTskRes(void);
426static void PutRelTskRes(void);
427static void PutSetEvt(uint8 task_no);
428static void PutClrEvt(uint8 task_no);
429static void PutGetEvt(uint8 task_no);
430static void PutWaitEvt(uint8 task_no);
431static void PutArmBase(void);
432static void PutArmTick(void);
433static void PutSetRel(uint8 alarm_no, uint8 tick_no, uint8 cycle_no);
434static void PutSetAbs(uint8 alarm_no, uint8 tick_no, uint8 cycle_no);
435static void PutCanArm(void);
436static void PutAppMode(void);
437static void schedule_table_sample_routine(void);
438
439/*
440 * 内部データバッファ
441 */
442static volatile uint8 command_tbl[8]; /* コマンド引渡しテーブル */
443
444/*
445 * 内部定数データテーブル
446 */
447/* 無効イベントマスク値 */
448#define invalid_mask (EventMaskType) (0)
449
450/* イベントマスクテーブル */
451static const EventMaskType event_mask_tbl[] = {
452 invalid_mask,
453 T2Evt,
454 T3Evt,
455 invalid_mask,
456 invalid_mask
457};
458
459/* タスクIDテーブル */
460static const TaskType task_id_tbl[] = {
461 Task1,
462 Task2,
463 Task3,
464 Task4,
465 Task5
466};
467
468/* アラームIDテーブル */
469static const AlarmType alarm_id_tbl[] = {
470 ActTskArm,
471 SetEvtArm,
472 CallBackArm
473};
474
475/* ティック値テーブル */
476static const TickType tick_tbl[] = {
477 (TickType) 500,
478 (TickType) 900
479};
480
481/* サイクル値テーブル */
482static const TickType cycle_tbl[] = {
483 (TickType) 0,
484 (TickType) COUNTER_MIN_CYCLE
485};
486
487/* イベントマスク名文字列テーブル */
488static const char8 *event_name_tbl[] = {
489 "Invalid",
490 "T2Evt",
491 "T3Evt",
492 "Invalid",
493 "Invalid"
494};
495
496/* タスク名文字列テーブル */
497static const char8 *task_name_tbl[] = {
498 "Task1",
499 "Task2",
500 "Task3",
501 "Task4",
502 "Task5"
503};
504
505/* タスク状態文字列テーブル */
506static const char8 *task_state_tbl[] = {
507 "SUSPENDED",
508 "RUNNING",
509 "READY",
510 "WAITING",
511};
512
513/* アラーム名文字列テーブル */
514static const char8 *alarm_name_tbl[] = {
515 "ActTskArm",
516 "SetEvtArm",
517 "CallBackArm"
518};
519
520/*
521 * APIエラーログマクロ
522 *
523 * ErrorHookが有効の場合はErrorHookから
524 * エラーログを出力し, ErrorHookが無効の場合は
525 * 以下のマクロよりエラーログ出力を行う
526 */
527#if defined(CFG_USE_ERRORHOOK)
528#define error_log(api) (api)
529#else /* !defined( CFG_USE_ERRORHOOK ) */
530#define error_log(api) \
531 { \
532 StatusType ercd; \
533 ercd = api; /* 各API実行 */ \
534 if (ercd != E_OK) { \
535 syslog(LOG_INFO, "Error:%d", atk2_strerror(ercd)); \
536 } \
537 }
538#endif /* defined( CFG_USE_ERRORHOOK ) */
539
540/*
541 * ユーザメイン関数
542 *
543 * アプリケーションモードの判断と,カーネル起動
544 */
545sint32
546main(void)
547{
548 AppModeType crt_app_mode;
549
550 /*
551 * アプリケーションモードの判断
552 */
553 switch (GetAppModeInfo()) {
554 case 0:
555 crt_app_mode = AppMode1;
556 break;
557 case 1:
558 crt_app_mode = AppMode2;
559 break;
560 default:
561 crt_app_mode = AppMode3;
562 break;
563 }
564
565 /*
566 * カーネル起動
567 */
568 StartOS(crt_app_mode);
569
570 while (1) {
571 }
572} /* main */
573
574/*
575 * メインタスク
576 *
577 * ユーザコマンドの受信と,コマンドごとの処理実行
578 */
579TASK(MainTask)
580{
581 uint8 command;
582 uint8 task_no;
583 uint32 i;
584
585 TickType val = 0U;
586 TickType eval = 0U;
587
588 /*
589 * タスク番号・コマンドバッファ初期化
590 */
591 task_no = (uint8) (0);
592 for (i = 0U; i < (sizeof(command_tbl) / sizeof(command_tbl[0])); i++) {
593 command_tbl[i] = 0U;
594 }
595
596 /*
597 * MainCycArmを周期アラームとして設定
598 */
599 SetRelAlarm(MainCycArm, TICK_FOR_10MS, TICK_FOR_10MS);
600
601 /*
602 * コマンド実行ループ
603 */
604 while (1) {
605 WaitEvent(MainEvt); /* 10msの作業時間待ち */
606 ClearEvent(MainEvt);
607
608 /*
609 * 入力コマンド取得
610 */
611 syslog(LOG_INFO, "Input Command:");
612 command = GetCommand();
613
614 /*
615 * 入力コマンドチェック
616 */
617 if ((command <= (uint8) (0x1fU)) || (command >= (uint8) (0x80U))) {
618 syslog(LOG_INFO, "Not ASCII character");
619 }
620 else {
621#ifndef OMIT_ECHO
622 syslog(LOG_INFO, "%c", command);
623#endif /* OMIT_ECHO */
624
625 /*
626 * コマンド判別
627 */
628 switch (command) {
629 case '1':
630 case '2':
631 case '3':
632 case '4':
633 case '5':
634 /*
635 * 処理対象タスクの変更
636 */
637 task_no = (uint8) (command - '1');
638 break;
639 case 'A':
640 case '!':
641 case '"':
642 case '#':
643 case '$':
644 case '%':
645 case 'z':
646 case 'k':
647 case 'K':
648 case 'l':
649 case 'i':
650 case 'w':
651 case 'W':
652 /*
653 * タスクへのコマンド通知
654 */
655 command_tbl[task_no] = command;
656 break;
657 /*
658 * 以降はメインタスクでコマンド処理
659 */
660 case 'a':
661 PutActTsk(task_no);
662 break;
663 case 's':
664 PutSchedule();
665 break;
666 case 'S':
667 PutActNonPriTsk();
668 break;
669 case 'Z':
670 PutTaskState(task_no);
671 break;
672 case 'x':
673 syslog(LOG_INFO, "call RAISE_CPU_EXCEPTION");
674 RAISE_CPU_EXCEPTION;
675 break;
676 case 'd':
677 PutDisAllInt();
678 break;
679 case 'D':
680 PutSusAllInt();
681 break;
682 case 'f':
683 PutSusOSInt();
684 break;
685 case 'T':
686 PutHwCnt3();
687 break;
688 case 'e':
689 PutSetEvt(task_no);
690 break;
691 case 'E':
692 PutGetEvt(task_no);
693 break;
694 case 'b':
695 PutArmBase();
696 break;
697 case 'B':
698 PutArmTick();
699 PutArmTick();
700 break;
701 case 'v':
702 /* SetRelAlarm(ActTskArm, 500, 0)を実行 */
703 PutSetRel(0U, 0U, 0U);
704 break;
705 case 'V':
706 /* SetRelAlarm(SetEvtArm, 500, 0)を実行 */
707 PutSetRel(1U, 0U, 0U);
708 break;
709 case 'n':
710 /* SetRelAlarm(CallBackArm, 900, 0)を実行 */
711 PutSetRel(2U, 1U, 0U);
712 break;
713 case 'N':
714 /* SetRelAlarm(CallBackArm, 900, 500)を実行 */
715 PutSetRel(2U, 1U, 1U);
716 break;
717 case 'm':
718 /* SetAbsAlarm(CallBackArm, 900, 0)を実行 */
719 PutSetAbs(2U, 1U, 0U);
720 break;
721 case 'M':
722 /* SetAbsAlarm(CallBackArm, 900, 500)を実行 */
723 PutSetAbs(2U, 1U, 1U);
724 break;
725 case 'h':
726 /* CancelAlarm(CallBackArm)を実行 */
727 PutCanArm();
728 break;
729 case 'c':
730 syslog(LOG_INFO, "Call IncrementCounter(SampleCnt)");
731 IncrementCounter(SampleCnt);
732 break;
733 case 'C':
734 syslog(LOG_INFO, "Call IncrementCounter(SampleCnt2)");
735 IncrementCounter(SampleCnt2);
736 break;
737 case 'j':
738 syslog(LOG_INFO, "GetCounterValue(MAIN_HW_COUNTER, val)");
739 GetCounterValue(MAIN_HW_COUNTER, &val);
740 syslog(LOG_INFO, " val = %d", val);
741 break;
742 case 'J':
743 syslog(LOG_INFO, "Pre val = %d", val);
744 syslog(LOG_INFO, "GetElapsedValue(MAIN_HW_COUNTER, val ,eval)");
745 GetElapsedValue(MAIN_HW_COUNTER, &val, &eval);
746 syslog(LOG_INFO, " val = %d", val);
747 syslog(LOG_INFO, " eval = %d", eval);
748 break;
749 case 'r':
750 syslog(LOG_INFO, "GetISRID() Call from Task Context");
751 syslog(LOG_INFO, "GetISRID() = %d", GetISRID());
752 break;
753 case 'p':
754 PutAppMode();
755 break;
756 case 't':
757 schedule_table_sample_routine();
758 break;
759 case 'q':
760 ShutdownOS(E_OK);
761 break;
762 case 'Q':
763 ShutdownOS(E_OS_STATE);
764 break;
765 default:
766 /* 上記のコマンド以外の場合,処理を行わない */
767 break;
768 }
769 }
770 }
771
772 /*
773 * ここにはこない
774 */
775 syslog(LOG_INFO, "MainTask TERMINATE");
776 error_log(TerminateTask());
777} /* TASK( MainTask ) */
778
779/*
780 * 最高優先度タスク
781 *
782 * 各タスクのプリエンプト確認用
783 */
784TASK(HighPriorityTask)
785{
786 syslog(LOG_INFO, "HighPriorityTask ACTIVATE");
787 error_log(TerminateTask());
788} /* TASK( HighPriorityTask ) */
789
790
791/*
792 * ノンプリエンプティブタスク
793 *
794 * 実行中はプリエンプトしないことの確認用
795 */
796TASK(NonPriTask)
797{
798 syslog(LOG_INFO, "NonPriTask ACTIVATE");
799 syslog(LOG_INFO, "Call ActivateTask(HighPriorityTask)");
800 error_log(ActivateTask(HighPriorityTask));
801 syslog(LOG_INFO, "NonPriTask TERMINATE");
802
803 error_log(TerminateTask());
804} /* TASK( NonPriTask ) */
805
806
807/*
808 * 並列実行タスク1
809 */
810TASK(Task1)
811{
812 TaskProk(0U);
813} /* TASK( Task1 ) */
814
815
816/*
817 * 並列実行タスク2
818 */
819TASK(Task2)
820{
821 TaskProk(1U);
822} /* TASK( Task2 ) */
823
824
825/*
826 * 並列実行タスク3
827 */
828TASK(Task3)
829{
830 TaskProk(2U);
831} /* TASK( Task3 ) */
832
833
834/*
835 * 並列実行タスク4
836 */
837TASK(Task4)
838{
839 TaskProk(3U);
840} /* TASK( Task4 ) */
841
842
843/*
844 * 並列実行タスク5
845 */
846TASK(Task5)
847{
848 TaskProk(4U);
849} /* TASK( Task5 ) */
850
851
852/*
853 * 並列実行タスク内部処理
854 *
855 * メインタスクから通知されたコマンドごとの処理実行
856 */
857static void
858TaskProk(uint8 task_no)
859{
860 uint8 command; /* コマンド退避バッファ */
861
862 /*
863 * タスク起動ログ出力
864 */
865 syslog(LOG_INFO, "%s ACTIVATE", task_name_tbl[task_no]);
866
867 /*
868 * コマンド実行ループ
869 */
870 while (1) {
871
872 /*
873 * コマンド取得
874 */
875 while (command_tbl[task_no] == '\0') {
876 }
877 command = command_tbl[task_no];
878 command_tbl[task_no] = 0U;
879
880 /*
881 * コマンド判定
882 */
883 switch (command) {
884 case 'A':
885 PutTermTsk(task_no);
886 break;
887 case '!':
888 case '"':
889 case '#':
890 case '$':
891 case '%':
892 PutChainTsk(task_no, (command - '!'));
893 break;
894 case 'z':
895 PutTaskID();
896 break;
897 case 'k':
898 PutGetTskRes();
899 break;
900 case 'K':
901 PutRelTskRes();
902 break;
903 case 'i':
904 PutGetCntRes();
905 break;
906 case 'w':
907 PutClrEvt(task_no);
908 break;
909 case 'W':
910 PutWaitEvt(task_no);
911 break;
912 default:
913 /* 上記のコマンド以外の場合,処理は行わない */
914 break;
915 }
916 }
917} /* TaskProk */
918
919/*
920 * コマンド受信処理
921 */
922static uint8
923GetCommand(void)
924{
925 uint8 command; /* コマンド受信バッファ */
926
927 /*
928 * コマンドを受信するまでループ
929 */
930 command = '\0';
931 do {
932 WaitEvent(MainEvt); /* 10msウェイト */
933 ClearEvent(MainEvt);
934 RecvPolSerialChar(&command); /* 受信バッファポーリング */
935 if (command == '\n') {
936 command = '\0';
937 }
938 } while (command == '\0');
939
940
941 return(command);
942} /* GetCommand */
943
944/*
945 * ActivateTask 実行・ログ出力処理
946 */
947static void
948PutActTsk(uint8 task_no)
949{
950 syslog(LOG_INFO, "Call ActivateTask(%s)", task_name_tbl[task_no]);
951
952 error_log(ActivateTask(task_id_tbl[task_no]));
953
954} /* PutActTsk */
955
956/*
957 * ActivateTask 実行(NonPriTask)・ログ出力処理
958 */
959static void
960PutActNonPriTsk(void)
961{
962 syslog(LOG_INFO, "Call ActivateTask(NonPriTask)");
963
964 error_log(ActivateTask(NonPriTask));
965} /* PutActNonPriTsk */
966
967/*
968 * TerminateTask 実行・ログ出力処理
969 */
970static void
971PutTermTsk(uint8 task_no)
972{
973 StatusType ercd; /* エラーコード */
974
975 syslog(LOG_INFO, "%s TERMINATE", task_name_tbl[task_no]);
976
977 ercd = TerminateTask();
978 ShutdownOS(ercd);
979}
980
981/*
982 * ChainTask 実行・ログ出力処理
983 */
984static void
985PutChainTsk(uint8 from_task_no, uint8 to_task_no)
986{
987 StatusType ercd; /* エラーコード */
988
989 syslog(LOG_INFO, "Call ChainTask(%s)", task_name_tbl[to_task_no]);
990 syslog(LOG_INFO, "%s TERMINATE", task_name_tbl[from_task_no]);
991
992 ercd = ChainTask(task_id_tbl[to_task_no]);
993 if (ercd == E_OS_LIMIT) {
994 syslog(LOG_INFO, "Call TerminateTask()");
995 syslog(LOG_INFO, "Because of ChainTask E_OS_LIMIT return");
996 ercd = TerminateTask();
997 }
998 ShutdownOS(ercd);
999} /* PutChainTsk */
1000
1001/*
1002 * Schedule 実行・ログ出力処理
1003 */
1004static void
1005PutSchedule(void)
1006{
1007 syslog(LOG_INFO, "Call ActivateTask(HighPriorityTask)");
1008
1009 error_log(ActivateTask(HighPriorityTask));
1010 syslog(LOG_INFO, "Call Schedule()");
1011
1012 error_log(Schedule());
1013 syslog(LOG_INFO, "Retrun Schedule()");
1014} /* PutSchedule */
1015
1016/*
1017 * GetTaskID 実行・ログ出力処理
1018 */
1019static void
1020PutTaskID(void)
1021{
1022 TaskType task_id; /* タスクID取得バッファ */
1023
1024 error_log(GetTaskID(&task_id));
1025
1026 syslog(LOG_INFO, "TaskID:%d", task_id);
1027} /* PutTaskID */
1028
1029/*
1030 * GetTaskState 実行・ログ出力処理
1031 */
1032static void
1033PutTaskState(uint8 task_no)
1034{
1035 TaskStateType state; /* タスクID取得バッファ */
1036
1037 error_log(GetTaskState(task_id_tbl[task_no], &state));
1038
1039 syslog(LOG_INFO, task_name_tbl[task_no]);
1040 syslog(LOG_INFO, " State:%s", task_state_tbl[state]);
1041} /* PutTaskState */
1042
1043/*
1044 * DisableAllInterrupts/EnableAllInterrupts 実行・ログ出力処理
1045 */
1046static void
1047PutDisAllInt(void)
1048{
1049 syslog(LOG_INFO, "Call DisableAllInterrupts");
1050
1051 DisableAllInterrupts();
1052
1053 PutHwCnt3();
1054 syslog(LOG_INFO, "Call EnableAllInterrupts");
1055
1056 EnableAllInterrupts();
1057} /* PutDisAllInt */
1058
1059/*
1060 * SuspendAllInterrupts/ResumeAllInterrupts 実行・ログ出力処理
1061 */
1062static void
1063PutSusAllInt(void)
1064{
1065 syslog(LOG_INFO, "Call SuspendAllInterrupts");
1066
1067 SuspendAllInterrupts();
1068
1069 PutHwCnt3();
1070 syslog(LOG_INFO, "Call SuspendAllInterrupts");
1071
1072 SuspendAllInterrupts();
1073
1074 PutHwCnt3();
1075 syslog(LOG_INFO, "Call ResumeAllInterrupts");
1076
1077 ResumeAllInterrupts();
1078
1079 PutHwCnt3();
1080 syslog(LOG_INFO, "Call ResumeAllInterrupts");
1081
1082 ResumeAllInterrupts();
1083} /* PutSusAllInt */
1084
1085/*
1086 * SuspendOSInterrupts/ResumeOSInterrupts 実行・ログ出力処理
1087 */
1088static void
1089PutSusOSInt(void)
1090{
1091 syslog(LOG_INFO, "Call SuspendOSInterrupts");
1092
1093 SuspendOSInterrupts();
1094
1095 PutHwCnt3();
1096 syslog(LOG_INFO, "Call SuspendOSInterrupts");
1097
1098 SuspendOSInterrupts();
1099
1100 PutHwCnt3();
1101 syslog(LOG_INFO, "Call SuspendAllInterrupts");
1102
1103 SuspendAllInterrupts();
1104
1105 PutHwCnt3();
1106 syslog(LOG_INFO, "Call ResumeAllInterrupts");
1107
1108 ResumeAllInterrupts();
1109
1110 PutHwCnt3();
1111 syslog(LOG_INFO, "Call ResumeOSInterrupts");
1112
1113 ResumeOSInterrupts();
1114
1115 PutHwCnt3();
1116 syslog(LOG_INFO, "Call ResumeOSInterrupts");
1117
1118 ResumeOSInterrupts();
1119} /* PutSusOSInt */
1120
1121/*
1122 * 割込み動作テスト用HWカウンタ値のログ出力処理
1123 */
1124static void
1125PutHwCnt3(void)
1126{
1127 uint8 isr1_cnt = 0U; /* C1ISR カウント値取得バッファ */
1128 uint8 isr2_cnt = 0U; /* C2ISR カウント値取得バッファ */
1129 uint8 cnt; /* 出力回数カウンタ */
1130
1131 for (cnt = 0U; cnt < 3U; cnt++) {
1132 GetHwCnt(&isr1_cnt, &isr2_cnt);
1133 syslog(LOG_INFO, "C1ISR Cnt:%d, C2ISR Cnt:%d",
1134 isr1_cnt, isr2_cnt);
1135 }
1136} /* PutHwCnt3 */
1137
1138/*
1139 * GetResource/ReleaseResource 実行(カウンタリソース)・ログ出力処理
1140 */
1141static void
1142PutGetCntRes(void)
1143{
1144 syslog(LOG_INFO, "Call GetResource(CntRes)");
1145 error_log(GetResource(CntRes));
1146
1147 PutHwCnt3();
1148 syslog(LOG_INFO, "Call ReleaseResource(CntRes)");
1149
1150 error_log(ReleaseResource(CntRes));
1151} /* PutGetCntRes */
1152
1153/*
1154 * GetResource 実行(タスクレベル)・ログ出力処理
1155 */
1156static void
1157PutGetTskRes(void)
1158{
1159 syslog(LOG_INFO, "Call GetResource(TskLevelRes)");
1160
1161 error_log(GetResource(TskLevelRes));
1162} /* PutGetTskRes */
1163
1164/*
1165 * ReleaseResource 実行(タスクレベル)・ログ出力処理
1166 */
1167static void
1168PutRelTskRes(void)
1169{
1170 syslog(LOG_INFO, "Call ReleaseResource(TskLevelRes)");
1171
1172 error_log(ReleaseResource(TskLevelRes));
1173}
1174
1175/*
1176 * SetEvent 実行・ログ出力処理
1177 */
1178static void
1179PutSetEvt(uint8 task_no)
1180{
1181 syslog(LOG_INFO, "Call SetEvent(%s, %s)",
1182 task_name_tbl[task_no], event_name_tbl[task_no]);
1183
1184 error_log(SetEvent(task_id_tbl[task_no], event_mask_tbl[task_no]));
1185} /* PutSetEvt */
1186
1187/*
1188 * ClearEvent 実行・ログ出力処理
1189 */
1190static void
1191PutClrEvt(uint8 task_no)
1192{
1193 syslog(LOG_INFO, "Call ClearEvent(%s)", event_name_tbl[task_no]);
1194
1195 error_log(ClearEvent(event_mask_tbl[task_no]));
1196} /* PutClrEvt */
1197
1198/*
1199 * GetEvent 実行・ログ出力処理
1200 */
1201static void
1202PutGetEvt(uint8 task_no)
1203{
1204 EventMaskType mask; /* イベントマスク取得バッファ */
1205
1206 error_log(GetEvent(task_id_tbl[task_no], &mask));
1207
1208 syslog(LOG_INFO, "%s Event Mask:0x%x", task_name_tbl[task_no], mask);
1209} /* PutGetEvt */
1210
1211/*
1212 * WaitEvent 実行・ログ出力処理
1213 */
1214static void
1215PutWaitEvt(uint8 task_no)
1216{
1217 syslog(LOG_INFO, "Call WaitEvent(%s)", event_name_tbl[task_no]);
1218
1219 error_log(WaitEvent(event_mask_tbl[task_no]));
1220 syslog(LOG_INFO, "Return WaitEvent(%s)", event_name_tbl[task_no]);
1221} /* PutWaitEvt */
1222
1223/*
1224 * GetAlarmBase 実行・ログ出力処理
1225 */
1226static void
1227PutArmBase(void)
1228{
1229 AlarmBaseType info; /* アラームベース情報取得バッファ */
1230
1231 error_log(GetAlarmBase(MainCycArm, &info));
1232
1233 syslog(LOG_INFO, "MainCycArm Base:");
1234 syslog(LOG_INFO, "\tMAXALLOWEDVALUE=%d", info.maxallowedvalue);
1235 syslog(LOG_INFO, "\tTICKSPERBASE=%d", info.ticksperbase);
1236 syslog(LOG_INFO, "\tMINCYCLE=%d", info.mincycle);
1237} /* PutArmBase */
1238
1239/*
1240 * PutArmTick 実行・ログ出力処理
1241 */
1242static void
1243PutArmTick(void)
1244{
1245 TickType tick; /* 残りティック取得バッファ */
1246
1247 error_log(GetAlarm(MainCycArm, &tick));
1248
1249 syslog(LOG_INFO, "MainCycArm Tick:%d", tick);
1250} /* PutArmTick */
1251
1252/*
1253 * SetRelAlarm 実行・ログ出力処理
1254 */
1255static void
1256PutSetRel(uint8 alarm_no, uint8 tick_no, uint8 cycle_no)
1257{
1258 syslog(LOG_INFO, "Call SetRelAlarm(%s, %d, %d)",
1259 alarm_name_tbl[alarm_no], tick_tbl[tick_no], cycle_tbl[cycle_no]);
1260
1261 error_log(SetRelAlarm(alarm_id_tbl[alarm_no],
1262 tick_tbl[tick_no], cycle_tbl[cycle_no]));
1263} /* PutSetRel */
1264
1265/*
1266 * SetAbsAlarm 実行・ログ出力処理
1267 */
1268static void
1269PutSetAbs(uint8 alarm_no, uint8 tick_no, uint8 cycle_no)
1270{
1271 syslog(LOG_INFO, "Call SetAbsAlarm(%s, %d, %d)",
1272 alarm_name_tbl[alarm_no], tick_tbl[tick_no], cycle_tbl[cycle_no]);
1273
1274 error_log(SetAbsAlarm(alarm_id_tbl[alarm_no],
1275 tick_tbl[tick_no], cycle_tbl[cycle_no]));
1276} /* PutSetAbs */
1277
1278/*
1279 * CancelAlarm 実行・ログ出力処理
1280 */
1281static void
1282PutCanArm(void)
1283{
1284 syslog(LOG_INFO, "Call CancelAlarm(CallBackArm)");
1285
1286 error_log(CancelAlarm(CallBackArm));
1287} /* PutCanArm */
1288
1289/*
1290 * GetActiveApplicationMode 実行・ログ出力処理
1291 */
1292static void
1293PutAppMode(void)
1294{
1295 switch (GetActiveApplicationMode()) {
1296 case AppMode1:
1297 syslog(LOG_INFO, "ActiveApplicationMode:AppMode1");
1298 break;
1299 case AppMode2:
1300 syslog(LOG_INFO, "ActiveApplicationMode:AppMode2");
1301 break;
1302 case AppMode3:
1303 syslog(LOG_INFO, "ActiveApplicationMode:AppMode3");
1304 break;
1305 default:
1306 syslog(LOG_INFO, "ActiveApplicationMode:Non");
1307 break;
1308 }
1309} /* PutAppMode */
1310
1311
1312/*
1313 * エラーフックルーチン
1314 */
1315#ifdef CFG_USE_ERRORHOOK
1316void
1317ErrorHook(StatusType Error)
1318{
1319 /*
1320 * エラー要因ごとのパラメータログ出力
1321 */
1322 switch (OSErrorGetServiceId()) {
1323 case OSServiceId_ActivateTask:
1324 syslog(LOG_INFO, "Error:%s=ActivateTask(%d)", atk2_strerror(Error), OSError_ActivateTask_TaskID());
1325 break;
1326 case OSServiceId_TerminateTask:
1327 syslog(LOG_INFO, "Error:%s=TerminateTask()", atk2_strerror(Error));
1328 break;
1329 case OSServiceId_ChainTask:
1330 syslog(LOG_INFO, "Error:%s=ChainTask(%d)", atk2_strerror(Error), OSError_ChainTask_TaskID());
1331 break;
1332 case OSServiceId_Schedule:
1333 syslog(LOG_INFO, "Error:%s=Schedule()", atk2_strerror(Error));
1334 break;
1335 case OSServiceId_GetTaskID:
1336 syslog(LOG_INFO, "Error:%s=GetTaskID(0x%p)", atk2_strerror(Error), OSError_GetTaskID_TaskID());
1337 break;
1338 case OSServiceId_GetTaskState:
1339 syslog(LOG_INFO, "Error:%s=GetTaskState(%d, 0x%p)", atk2_strerror(Error),
1340 OSError_GetTaskState_TaskID(), OSError_GetTaskState_State());
1341 break;
1342 case OSServiceId_EnableAllInterrupts:
1343 syslog(LOG_INFO, "Error:%s=EnableAllInterrupts()", atk2_strerror(Error));
1344 break;
1345 case OSServiceId_DisableAllInterrupts:
1346 syslog(LOG_INFO, "Error:%s=DisableAllInterrupts()", atk2_strerror(Error));
1347 break;
1348 case OSServiceId_ResumeAllInterrupts:
1349 syslog(LOG_INFO, "Error:%s=ResumeAllInterrupts()", atk2_strerror(Error));
1350 break;
1351 case OSServiceId_SuspendAllInterrupts:
1352 syslog(LOG_INFO, "Error:%s=SuspendAllInterrupts()", atk2_strerror(Error));
1353 break;
1354 case OSServiceId_ResumeOSInterrupts:
1355 syslog(LOG_INFO, "Error:%s=ResumeOSInterrupts()", atk2_strerror(Error));
1356 break;
1357 case OSServiceId_SuspendOSInterrupts:
1358 syslog(LOG_INFO, "Error:%s=SuspendOSInterrupts()", atk2_strerror(Error));
1359 break;
1360 case OSServiceId_GetISRID:
1361 syslog(LOG_INFO, "Error:%s=GetISRID()", atk2_strerror(Error));
1362 break;
1363 case OSServiceId_GetResource:
1364 syslog(LOG_INFO, "Error:%s=GetResource(%d)", atk2_strerror(Error), OSError_GetResource_ResID());
1365 break;
1366 case OSServiceId_ReleaseResource:
1367 syslog(LOG_INFO, "Error:%s=ReleaseResource(%d)", atk2_strerror(Error), OSError_ReleaseResource_ResID());
1368 break;
1369 case OSServiceId_SetEvent:
1370 syslog(LOG_INFO, "Error:%s=SetEvent(%d, 0x%x)", atk2_strerror(Error),
1371 OSError_SetEvent_TaskID(), OSError_SetEvent_Mask());
1372 break;
1373 case OSServiceId_ClearEvent:
1374 syslog(LOG_INFO, "Error:%s=ClearEvent(0x%x)", atk2_strerror(Error), OSError_ClearEvent_Mask());
1375 break;
1376 case OSServiceId_GetEvent:
1377 syslog(LOG_INFO, "Error:%s=GetEvent(%d, 0x%p)", atk2_strerror(Error),
1378 OSError_GetEvent_TaskID(), OSError_GetEvent_Event());
1379 break;
1380 case OSServiceId_WaitEvent:
1381 syslog(LOG_INFO, "Error:%s=WaitEvent(0x%x)", atk2_strerror(Error), OSError_WaitEvent_Mask());
1382 break;
1383 case OSServiceId_GetAlarmBase:
1384 syslog(LOG_INFO, "Error:%s=GetAlarmBase(0x%p)", atk2_strerror(Error), OSError_GetAlarmBase_AlarmID());
1385 break;
1386 case OSServiceId_GetAlarm:
1387 syslog(LOG_INFO, "Error:%s=GetAlarm(%d, 0x%p)", atk2_strerror(Error),
1388 OSError_GetAlarm_AlarmID(), OSError_GetAlarm_Tick());
1389 break;
1390 case OSServiceId_SetRelAlarm:
1391 syslog(LOG_INFO, "Error:%s=SetRelAlarm(%d, %d, %d)", atk2_strerror(Error),
1392 OSError_SetRelAlarm_AlarmID(), OSError_SetRelAlarm_increment(), OSError_SetRelAlarm_cycle());
1393 break;
1394 case OSServiceId_SetAbsAlarm:
1395 syslog(LOG_INFO, "Error:%s=SetAbsAlarm(%d, %d, %d)", atk2_strerror(Error),
1396 OSError_SetAbsAlarm_AlarmID(), OSError_SetAbsAlarm_start(), OSError_SetAbsAlarm_cycle());
1397 break;
1398 case OSServiceId_CancelAlarm:
1399 syslog(LOG_INFO, "Error:%s=CancelAlarm(%d)", atk2_strerror(Error), OSError_CancelAlarm_AlarmID());
1400 break;
1401 case OSServiceId_StartScheduleTableRel:
1402 syslog(LOG_INFO, "Error:%s=StartScheduleTableRel(%d, %d)", atk2_strerror(Error),
1403 OSError_StartScheduleTableRel_ScheduleTableID(), OSError_StartScheduleTableRel_Offset());
1404 break;
1405 case OSServiceId_StartScheduleTableAbs:
1406 syslog(LOG_INFO, "Error:%s=StartScheduleTableAbs(%d, %d)", atk2_strerror(Error),
1407 OSError_StartScheduleTableAbs_ScheduleTableID(), OSError_StartScheduleTableAbs_Start());
1408 break;
1409 case OSServiceId_StopScheduleTable:
1410 syslog(LOG_INFO, "Error:%s=StopScheduleTable(%d)", atk2_strerror(Error), OSError_StopScheduleTable_ScheduleTableID());
1411 break;
1412 case OSServiceId_NextScheduleTable:
1413 syslog(LOG_INFO, "Error:%s=NextScheduleTable(%d, %d)", atk2_strerror(Error),
1414 OSError_NextScheduleTable_ScheduleTableID_From(), OSError_NextScheduleTable_ScheduleTableID_To());
1415 break;
1416 case OSServiceId_GetScheduleTableStatus:
1417 syslog(LOG_INFO, "Error:%s=GetScheduleTableStatus(%d, 0x%p)", atk2_strerror(Error),
1418 OSError_GetScheduleTableStatus_ScheduleTableID(), OSError_GetScheduleTableStatus_ScheduleStatus());
1419 break;
1420 case OSServiceId_GetActiveApplicationMode:
1421 syslog(LOG_INFO, "Error:%s=GetActiveApplicationMode()", atk2_strerror(Error));
1422 break;
1423 case OSServiceId_StartOS:
1424 syslog(LOG_INFO, "Error:%s=StartOS()", atk2_strerror(Error));
1425 break;
1426 case OSServiceId_ShutdownOS:
1427 syslog(LOG_INFO, "Error:%s=ShutdownOS()", atk2_strerror(Error));
1428 break;
1429 case OSServiceId_IncrementCounter:
1430 syslog(LOG_INFO, "Error:%s=IncrementCounter(%d)", atk2_strerror(Error), OSError_IncrementCounter_CounterID());
1431 break;
1432 case OSServiceId_TaskMissingEnd:
1433 syslog(LOG_INFO, "Error:%s=MissingEnd()", atk2_strerror(Error));
1434 break;
1435 default:
1436 syslog(LOG_INFO, "Error:%s=UnKnownFunc()", atk2_strerror(Error));
1437 break;
1438 }
1439
1440} /* ErrorHook */
1441#endif /* CFG_USE_ERRORHOOK */
1442
1443/*
1444 * プレタスクフックルーチン
1445 *
1446 * 空ルーチンを呼出す
1447 */
1448#ifdef CFG_USE_PRETASKHOOK
1449void
1450PreTaskHook(void)
1451{
1452} /* PreTaskHook */
1453#endif /* CFG_USE_PRETASKHOOK */
1454
1455/*
1456 * ポストタスクフックルーチン
1457 *
1458 * 空ルーチンを呼出す
1459 */
1460#ifdef CFG_USE_POSTTASKHOOK
1461void
1462PostTaskHook(void)
1463{
1464} /* PostTaskHook */
1465#endif /* CFG_USE_POSTTASKHOOK */
1466
1467/*
1468 * スタートアップフックルーチン
1469 */
1470#ifdef CFG_USE_STARTUPHOOK
1471#ifdef TOPPERS_ENABLE_SYS_TIMER
1472extern void target_timer_initialize(void);
1473#endif /* TOPPERS_ENABLE_SYS_TIMER */
1474
1475void
1476StartupHook(void)
1477{
1478#ifdef TOPPERS_ENABLE_SYS_TIMER
1479 target_timer_initialize();
1480#endif /* TOPPERS_ENABLE_SYS_TIMER */
1481 syslog_initialize();
1482 syslog_msk_log(LOG_UPTO(LOG_INFO));
1483 InitSerial();
1484 print_banner();
1485} /* StartupHook */
1486#endif /* CFG_USE_STARTUPHOOK */
1487
1488/*
1489 * シャットダウンフックルーチン
1490 */
1491#ifdef CFG_USE_SHUTDOWNHOOK
1492#ifdef TOPPERS_ENABLE_SYS_TIMER
1493extern void target_timer_terminate(void);
1494#endif /* TOPPERS_ENABLE_SYS_TIMER */
1495
1496void
1497ShutdownHook(StatusType Error)
1498{
1499 /* 終了ログ出力 */
1500 syslog(LOG_INFO, "");
1501 syslog(LOG_INFO, "Sample System ShutDown");
1502 syslog(LOG_INFO, "ShutDownCode:%s", atk2_strerror(Error));
1503 syslog(LOG_INFO, "");
1504
1505 if (Error == E_OS_SYS_ASSERT_FATAL) {
1506 syslog(LOG_INFO, "fatal_file_name:%s", fatal_file_name);
1507 syslog(LOG_INFO, "fatal_line_num:%d", fatal_line_num);
1508 }
1509
1510#ifdef TOPPERS_ENABLE_SYS_TIMER
1511 target_timer_terminate();
1512#endif /* TOPPERS_ENABLE_SYS_TIMER */
1513 TermSerial();
1514
1515} /* ShutdownHook */
1516#endif /* CFG_USE_SHUTDOWNHOOK */
1517
1518/*
1519 * プロテクションフックルーチン
1520 */
1521#ifdef CFG_USE_PROTECTIONHOOK
1522ProtectionReturnType
1523ProtectionHook(StatusType FatalError)
1524{
1525 StatusType ercd;
1526
1527 syslog(LOG_INFO, "");
1528 syslog(LOG_INFO, "ProtectionHook");
1529
1530 if (FatalError == E_OS_STACKFAULT) {
1531 syslog(LOG_INFO, "E_OS_STACKFAULT");
1532 ercd = PRO_SHUTDOWN;
1533 }
1534 else if (FatalError == E_OS_PROTECTION_EXCEPTION) {
1535 syslog(LOG_INFO, "E_OS_PROTECTION_EXCEPTION");
1536 ercd = PRO_IGNORE;
1537 }
1538 else {
1539 ercd = PRO_SHUTDOWN;
1540 }
1541
1542 return(ercd);
1543}
1544#endif /* CFG_USE_PROTECTIONHOOK */
1545
1546/*
1547 * システムタイマによるアラームコールバック
1548 */
1549ALARMCALLBACK(SysTimerAlmCb)
1550{
1551 /*
1552 * コールバック実行ログ出力
1553 */
1554 syslog(LOG_INFO, "CallBackArm Expire");
1555
1556} /* ALARMCALLBACK(SysTimerAlmCb) */
1557
1558/*
1559 * IncrementCounter確認用アラームコールバック
1560 */
1561ALARMCALLBACK(SampleAlmCb)
1562{
1563 /*
1564 * コールバック実行ログ出力
1565 */
1566 syslog(LOG_INFO, "SampleArm Expire");
1567
1568} /* ALARMCALLBACK( SampleAlmCb ) */
1569
1570/*
1571 * IncrementCounter確認用アラームコールバック
1572 */
1573ALARMCALLBACK(SampleAlmCb2)
1574{
1575 /*
1576 * コールバック実行ログ出力
1577 */
1578 syslog(LOG_INFO, "SampleArm2 Expire");
1579
1580} /* ALARMCALLBACK( SampleAlmCb2 ) */
1581
1582/*
1583 * スケジュールテーブルテスト用メインループ
1584 *
1585 * ユーザコマンドの受信と,コマンドごとの処理実行
1586 */
1587static void
1588schedule_table_sample_routine(void)
1589{
1590 uint8 command; /* コマンドバッファ */
1591 ScheduleTableType scheduletable_id; /* コマンド引数バッファ */
1592 ScheduleTableStatusType status; /* スケジュール状態引数 */
1593 TickType val; /* カウンタの現在値 */
1594 uint8 flag = FALSE; /* リターンするか判定するためのフラグ */
1595
1596 syslog(LOG_INFO, "\t[ schedule table sample routine IN, press 't' OUT ]");
1597 syslog(LOG_INFO, "");
1598
1599 scheduletable_id = scheduletable1;
1600 /*
1601 * コマンド実行ループ
1602 */
1603 while (1) {
1604
1605 WaitEvent(MainEvt); /* 10msの作業時間待ち */
1606 ClearEvent(MainEvt);
1607
1608 /*
1609 * 入力コマンド取得
1610 */
1611 syslog(LOG_INFO, "Input Command:");
1612 command = GetCommand();
1613 syslog(LOG_INFO, "%c", command);
1614
1615 /*
1616 * コマンド判定
1617 */
1618 switch (command) {
1619 case '1':
1620 scheduletable_id = scheduletable1;
1621 break;
1622 case '2':
1623 scheduletable_id = scheduletable2;
1624 break;
1625 case 'i':
1626 IncrementCounter(SchtblSampleCnt);
1627 val = 0U;
1628 GetCounterValue(SchtblSampleCnt, &val);
1629 if ((val % 5U) == 0U) {
1630 syslog(LOG_INFO, "\tGetCounterValue(SchtblSampleCnt ) = %d", val);
1631 }
1632 break;
1633 case 's':
1634 syslog(LOG_INFO, "\tStartScheduleTableRel(scheduletable%d, 5)", scheduletable_id + 1U);
1635 error_log(StartScheduleTableRel(scheduletable_id, 5U));
1636 break;
1637 case 'S':
1638 syslog(LOG_INFO, "\tStartScheduleTableAbs(scheduletable%d, 5)", scheduletable_id + 1U);
1639 error_log(StartScheduleTableAbs(scheduletable_id, 5U));
1640 break;
1641 case 'f':
1642 syslog(LOG_INFO, "\tStopScheduleTable(scheduletable%d)", scheduletable_id + 1U);
1643 error_log(StopScheduleTable(scheduletable_id));
1644 break;
1645 case 'n':
1646 syslog(LOG_INFO, "\tNextScheduleTable(scheduletable%d, scheduletable%d)", scheduletable_id + 1U, scheduletable2 + 1U);
1647 error_log(NextScheduleTable(scheduletable_id, scheduletable2));
1648 break;
1649 case 'N':
1650 syslog(LOG_INFO, "\tNextScheduleTable(scheduletable%d, scheduletable%d)", scheduletable_id + 1U, scheduletable1 + 1U);
1651 error_log(NextScheduleTable(scheduletable_id, scheduletable1));
1652 break;
1653 case 'g':
1654 status = 0U;
1655 syslog(LOG_INFO, "\tGetScheduleTableStatus(scheduletable%d, status)", scheduletable_id + 1U);
1656 error_log(GetScheduleTableStatus(scheduletable_id, &status));
1657 syslog(LOG_INFO, "\tstatus = %d", status);
1658 break;
1659 case 't':
1660 syslog(LOG_INFO, "\t[ schedule table sample routine OUT, press 't' IN ]");
1661 flag = TRUE;
1662 break;
1663 case 'q':
1664 ShutdownOS(E_OK);
1665 break;
1666 case 'Q':
1667 ShutdownOS(E_OS_STATE);
1668 break;
1669 default:
1670 /* コマンドが上記のケース以外なら処理は行わない */
1671 break;
1672 }
1673 /* フラグが立っていた場合,リターンする */
1674 if (flag == TRUE) {
1675 return;
1676 }
1677 }
1678} /* schedule_table_sample_routine */
1679
1680/*
1681 * スケジュールテーブル確認用タスク6
1682 */
1683TASK(Task6)
1684{
1685 /*
1686 * タスク起動ログ出力
1687 */
1688 syslog(LOG_INFO, "Task6 ACTIVATE");
1689 WaitEvent(T6Evt);
1690 syslog(LOG_INFO, "Task6 FINISH");
1691 TerminateTask();
1692} /* TASK( Task6 ) */
1693
1694
1695/*
1696 * スケジュールテーブル確認用タスク7
1697 */
1698TASK(Task7)
1699{
1700 /*
1701 * タスク起動ログ出力
1702 */
1703 syslog(LOG_INFO, "Task7 ACTIVATE");
1704 WaitEvent(T7Evt);
1705 syslog(LOG_INFO, "Task7 FINISH");
1706 TerminateTask();
1707} /* TASK( Task7 ) */
1708
1709
1710/*
1711 * スケジュールテーブル確認用タスク8
1712 */
1713TASK(Task8)
1714{
1715 /*
1716 * タスク起動ログ出力
1717 */
1718 syslog(LOG_INFO, "Task8 ACTIVATE");
1719 WaitEvent(T8Evt);
1720 syslog(LOG_INFO, "Task8 FINISH");
1721 TerminateTask();
1722} /* TASK( Task8 ) */
Note: See TracBrowser for help on using the repository browser.