2 = TOPPERS/JSPカーネル ユーザズマニュアル =
4 (Release 1.4.3対応,最終更新: 23-Apr-2007)
6 ※ このユーザズマニュアルは,μITRON4.0仕様書(Ver. 4.02.00)の内容を
7 前提に記述してあります.μITRON4.0仕様書は,以下のURLからダウンロード
9 http://www.ertl.jp/ITRON/SPEC/mitron4-j.html
11 ----------------------------------------------------------------------
13 Toyohashi Open Platform for Embedded Real-Time Systems/
14 Just Standard Profile Kernel
16 Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
17 Toyohashi Univ. of Technology, JAPAN
18 Copyright (C) 2004-2007 by Embedded and Real-Time Systems Laboratory
19 Graduate School of Information Science, Nagoya Univ., JAPAN
21 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation
22 によって公表されている GNU General Public License の Version 2 に記
23 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア
24 を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下,
26 (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
27 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
29 (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
30 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
31 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
33 (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
34 用できない形で再配布する場合には,次のいずれかの条件を満たすこ
36 (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
37 作権表示,この利用条件および下記の無保証規定を掲載すること.
38 (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
40 (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
41 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
43 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
44 よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も
45 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直
46 接的または間接的に生じたいかなる損害に関しても,その責任を負わない.
48 @(#) $Id: user.txt,v 1.1 2009/01/31 05:27:37 suikan Exp $
49 ----------------------------------------------------------------------
50 * μITRON4.0仕様は,トロン協会が中心となって策定されたオープンなリア
51 ルタイムカーネル仕様です.μITRON4.0仕様の仕様書は,トロン協会のホー
52 ムページ(http://www.assoc.tron.org/)から入手することができます.
53 ----------------------------------------------------------------------
54 * TRON は "The Real-time Operating system Nucleus" の略称です.
55 * ITRON は "Industrial TRON" の略称です.
56 * μITRON は "Micro Industrial TRON" の略称です.
57 * TRON,ITRON,およびμITRONは,特定の商品ないしは商品群を指す名称で
59 * TOPPERS は "Toyohashi OPen Platform for Embedded Real-time Systems"
60 の略称,JSP は "Just Standard Profile" の略称です.
61 * 本マニュアル中の商品名は,各社の商標または登録商標です.
62 ----------------------------------------------------------------------
67 TOPPERS/JSPカーネル(以下,単にJSPカーネルと書く)は,TOPPERSプロジェ
68 クトにおいて開発したμITRON4.0仕様に準拠したリアルタイムカーネルである.
69 JSP(Just Standard Profile)の名前が示す通り,μITRON4.0仕様のスタンダ
70 ードプロファイル規定に従って実装されている.
72 1.1 ターゲットプロセッサ/ターゲットシステム
74 JSPカーネルは,現時点で,以下のターゲットプロセッサ/ターゲットシステ
81 M68040(MC68LC040) DVE-68K/40(電産)
84 SH1(SH7032) KZ-SH1-01(京都マイクロコンピュータ)
85 ※ RISC評価キットSH-1(CQ出版)でも動作
86 SH1(SH7034) μITRON搭載SH1CPUボード((株)中央製作所)
90 SH2(SH7145) AP_SH2F_6A(アルファプロジェクト)
91 SH2(SH7615) HSB7615IT (北斗電子)
94 SH3(SH7709A) MS7709ASE01 (日立超LSIシステムズ)
95 SH3(SH7729R) MS7729RSE01 (日立超LSIシステムズ)
96 SH3(SH7727) MS7727CP01 (日立超LSIシステムズ)
97 SH4(SH7750) MS7750SE01 (日立超LSIシステムズ)
100 SH3(SH7709A) MS7709ASE01 (日立超LSIシステムズ)
101 SH3(SH7727) MS7727CP01 (日立超LSIシステムズ)
104 H8(H8/3052F) AKI-H8/3052F(秋月電子通商)
105 H8(H8/3069F) AKI-H8/3069F(秋月電子通商)
107 h8-renesas Renesas社の開発環境
108 H8(HSB8F3048BF25) H8/3048F-ONEスタータキット((株)北斗電子)
110 h8s-renesas Renesas社の開発環境
111 H8S(H8S/2339F) MiNET-H8S/2339F(株式会社ミスポ製)
114 ARM9(ARM922T) Integrator/AP+CM922T(ARM)
115 ARM9(ARM926EJ-S) AZ9360MB(YDK)
118 ARM9 (ARM920T) Integrator/AP+CM920T(ARM)
119 ARM9E(ARM966E-S) Integrator/AP+CM966E-S(ARM)
122 M32R(M32102S6FP) M3A-2131G50(三菱電機)
123 M32R(M32102S6FP) M3A-ZA36 (三菱電機)
125 m32c-renesas Renesas社の開発環境
129 MicroBlaze MIREF(YDK)
130 MicroBlaze MIRE_MULTI3000(YDK)
131 MicroBlaze MultiMedia Board(Xilinx)
132 MicroBlaze Suzaku(アットマークテクノ)
135 TMS320C54x(TSM320C5402)TMS320VC5402 DSK(TI)
138 Xstormy16 三洋マイコン開発ツール(三洋電機)
140 m16c-renesas Renesas社の開発環境
141 M16C(M30620FCAFP-CPU) OASKS16(オークス電子)
142 M16C(M30262F8FG-CPU) OAKS16-MINI(オークス電子)
148 s1c33-gnu33 GNU33開発環境
153 Nios2 NiosII Development Board(アルテラ)
156 V850 TK-850/KJ1+ (Application Corp.)
157 V850 TK-850/SG2 (Application Corp.)
159 tlcs900 東芝セミコンダクタ社製の開発環境
160 TMP91CY22-CPU Zup-F16拡張ボード(タマデン工業株式会社)
162 また,以下のターゲットは,以前のバージョン(1.4.1)のコードからアップデ
163 ートされておらず,動作確認を行っていないため,1.4.2以降では,参考実装
167 H8(H8/3048F) AKI-H8/3048F(秋月電子通商)
168 H8 (H8/3069F) NKEV-010H8 (品川通信計装サービス)
171 H8S(2350) H8S/2350 評価ボード(ミスポ)
174 PowerPC32(MPC860T) TB6102S(タンバック)
177 MIPS3(VR4131) KZ-Vr4131PCI-01(京都マイクロコンピュータ)
178 MIPS3(VR5500) RTE-VR5500-CB(64)(マイダス・ラボ)
181 JSPカーネルは,カーネルのできる限り多くの部分をC言語で記述する,ターゲッ
182 ト非依存部と依存部を明確に分離するなど,他のターゲットプロセッサへのポ
183 ーティングが容易な構造になっている.ただし,ポーティングにどの程度の手
184 間がかかるかは,ターゲットプロセッサのアーキテクチャやシステムの構成な
187 このユーザズマニュアルでは,ターゲット(ターゲットプロセッサおよびター
188 ゲットシステム)に依存しない機能についてのみ説明している.ターゲットに
189 依存する機能については,ターゲット毎のマニュアルを参照すること.
193 JSPカーネルは,GCCなどのGNU開発環境を標準のソフトウェア開発環境として
194 いるが,他の種類の開発環境も利用できるように考慮している.利用できる開
195 発環境については,ターゲット毎または開発環境毎のマニュアルで説明する.
197 ターゲット非依存部は,大部分は標準的なC言語によって記述されているが,
198 性能と可読性を両立させるために,一部でインライン関数を用いている.イン
199 ライン関数の機能を持たない開発環境の場合でも,改造なしに対応可能ではあ
200 るが,非効率/無駄なコードが生成されるおそれがある.
202 カーネル本体は,外部のライブラリ関数に依存しないように記述している.た
203 だし,コンパイラが標準Cライブラリ関数を呼び出すコードを生成する場合が
204 あり,その場合には標準Cライブラリが必要である.また,システムサービス
205 やサポートライブラリ,アプリケーションプログラムで標準Cライブラリが必
206 要になる場合も考えられる.実際,標準配布キットに含まれる中で,システム
207 ログ機能を呼び出すためのライブラリ関数内で,可変数引数を処理するための
208 機能(stdarg.h, va_list, va_start, va_arg)を用いている(実際には,GNU
209 開発環境では,可変数引数を処理するための機能はGCC本体でサポートしてい
210 るため,標準Cライブラリは必要ない).これらの理由により,標準Cライブラ
215 JSPカーネルのシミュレーション環境として,Linux上で動作する環境と
216 Windows上で動作する環境を用意している.これらのシミュレーション環境は,
217 LinuxおよびWindowsの一つのプロセスの中で複数のタスクを切り替えて動作さ
218 せるもので,スレッドライブラリとして使うこともできる.
220 これらのシミュレーション環境についての詳細は,シミュレーション環境毎の
225 JSPカーネルは,名前が示す通り,μITRON4.0仕様のスタンダードプロファイ
226 ルに含まれる機能をすべてサポートしている.スタンダードプロファイルでは,
227 割込みハンドラと割込みサービスルーチンのいずれかをサポートすればよいが,
228 JSPカーネルは,現状では割込みハンドラのみをサポートしている.
230 スタンダードプロファイルに含まれない機能として,ターゲット依存に以下の
231 割込み管理機能およびサービスコールをサポートする場合がある.これらの機
232 能の具体的な内容については,ターゲット毎に異なる.詳しくは,ターゲット
241 また,μITRON4.0仕様に定義されている以外に,以下の独自の拡張機能および
244 (1) CPU例外発生時のシステム状態の参照
246 スタンダードプロファイルでは,CPU例外ハンドラ内で,CPU例外が発生したコ
247 ンテキストや状態を参照できることが必要であるが,そのためのAPIは定めて
248 いない.JSPカーネルでは,CPU例外が発生した処理でsns_yyyを呼び出した場
249 合の結果を,CPU例外ハンドラ内で取り出せるようにするために,以下の五つ
250 のサービスコールを独自にサポートしている.
252 vxsns_ctx CPU例外発生時のコンテキストの参照
253 vxsns_loc CPU例外発生時のCPUロック状態の参照
254 vxsns_dsp CPU例外発生時のディスパッチ禁止状態の参照
255 vxsns_dpn CPU例外発生時のディスパッチ保留状態の参照
256 vxsns_tex CPU例外発生時のタスク例外処理禁止状態の参照
260 性能評価用システム時刻参照機能とは,JSPカーネル上で動作するタスクやJSP
261 カーネル自身の性能を計測するための,システム時刻をμ秒単位で読み出す機
262 能である.この機能のために追加したサービスコールは次の通りである.
264 vxget_tim 性能評価用システム時刻の参照
266 性能評価用システム時刻参照機能をサポートするかどうかは,ターゲット依存
267 部の定義ファイルで指定することができる.また,ターゲットシステムの制限
268 により,この機能をサポートできない場合もある.
272 JSPカーネルでは,システムの終了時に呼び出される終了処理ルーチンを登録
273 するための機能をサポートしている.この機能のために追加した静的APIは次
276 VATT_TER 終了処理ルーチンの追加(静的API)
278 終了処理ルーチンについては,「2.12 システム終了手順と終了処理ルーチン」
283 カーネル上で動作するタスクから呼び出される関数が,カーネルの初期化完了
284 前や終了処理開始後にも呼び出される可能性がある場合には,その中でカーネ
285 ルのサービスコールを呼び出せるかを判別することが必要となる.JSPカーネ
286 ルでは,この判別を可能にするために,次のサービスコールを追加している.
292 現バージョンでは,静的APIの処理中のエラーの検出機能の中で,ターゲット
293 依存のエラーの検出が不十分である.例えば,割込みハンドラ番号が不正な値
294 である場合,カーネルとコンフィギュレータのいずれもエラーを検出せず,カー
297 kernel_cfg.cは,カーネル,システムサービス,アプリケーションのいずれの
298 インクルードファイルもインクルードし,いずれのシンボルも参照する可能性
299 がある.そのため,カーネル,システムサービス,アプリケーションでシンボ
300 ル等が衝突している場合や,コンパイルオプションが食い違っている場合に,
301 kernel_cfg.cが正しくコンパイルできなくなる場合が考えられる.カーネルの
302 シンボルをリネームするなどの方法でかなり軽減されてはいるが,問題がなく
305 シリアルインタフェースドライバで,シリアルポートをクローズした後にオー
306 プンしなおした場合に,正しく動作しない.これは,シリアルインタフェース
307 ドライバが使用しているセマフォが初期化されないためである.
311 CRE_DTQのパラメータdtqcntは,μITRON4.0仕様のVer. 4.01.00では一般定数
312 式パラメータと規定されているが,JSPカーネルではVer. 4.02.00に準拠して,
313 プリプロセッサ定数式パラメータと扱っている.
318 この節では,μITRON4.0仕様で実装定義となっている事項を中心に,JSPカー
323 μITRON4.0仕様のスタンダードプロファイルは,システム全体を一つのモジュー
324 ルにリンクすることを想定して規定されている.また,サービスコールの呼出
325 しは,単なるサブルーチンコールによって行うことが想定されている.JSPカー
326 ネルは,この想定に従い,アプリケーションとカーネルを一つのモジュールに
327 リンクし,サブルーチンコールによってサービスコールを呼び出す方法のみを
330 JSPカーネル上で動作するアプリケーションは,すべてC言語で記述することを
331 原則としている.そのため,タスクや割込みハンドラなどの処理単位をアセン
332 ブリ言語で記述する方法は,特別には用意していない(もちろん,インタフェー
333 スさえC言語の関数にあわせれば,記述にアセンブリ言語を使うことは問題な
336 JSPカーネルでは,サービスコールの大部分を一つの割込み禁止区間として実
337 装しているため,サービスコールの不可分性は厳密に保証される.逆に欠点と
338 しては,最大割込み禁止時間(最大割込み応答時間も同様)が,待ちキューに
339 つながれるタスクの最大数やタイムイベントの最大数に依存することになるが,
340 スタンダードプロファイルの機能セットの範囲内では,この方法でもそれほど
345 JSPカーネルでは,以下にリストアップするデータ型を,signed int型,
346 unsigned int型,またはsize_t型に定義している.これらの型のサイズは,
347 JSPカーネルがポーティングされているターゲットプロセッサ/コンパイラの
348 多くにおいて 32ビットであるため,そうでない場合にのみターゲット毎のマ
349 ニュアルに明示する.すなわち,ターゲット毎のマニュアルに明示されていな
350 い限り,以下にリストアップするデータ型のサイズは 32ビットである.
352 signed int型に定義しているデータ型
365 unsigned int型に定義しているデータ型
372 TEXPTN タスク例外要因のビットパターン
373 FLGPTN イベントフラグのビットパターン
378 ただし,RELTIM型の有効ビット数は31ビットを越えることはない.すなわち,
379 unsigned int型のサイズが32ビットの場合には,RELTIM型の有効ビット数は
380 31ビットであり,(2^31 - 1)を越える値を RELTIM型のパラメータに渡した場
381 合,E_PARエラーとなる.unsigned int型のサイズが16ビットの場合には,
382 RELTIM型の有効ビット数も16ビットである.スタンダードプロファイルでは,
383 RELTIM型は16ビット以上と規定しており,この仕様でスタンダードプロファイ
386 SYSTIM型は,32ビットの符号無し整数型に定義しており,構造体として定義す
389 時間をあらわすデータ型(TMO,RELTIM,SYSTIM)の時間単位は,スタンダー
390 ドプロファイルの規定に従い,すべて1ミリ秒としている.
394 オブジェクトのID番号には,1から連続した正の値を用いる.オブジェクトの
395 ID番号に抜けがある場合(例えば,ID=1とID=3のオブジェクトが登録され,
396 ID=2のオブジェクトが登録されない場合)には,コンフィギュレータがエラー
397 を報告する.負のID番号を用いたシステムオブジェクトとユーザオブジェクト
400 生成できるオブジェクトの最大数は,カーネルのコード上は,ID番号がID型
401 (signed int型に定義している)で表現できる範囲内であるが,実際にはメモ
402 リ容量によって制限される.なお,JSPカーネルでは,オブジェクトを生成す
403 るためのサービスコールはサポートしていない.
405 タスクとメッセージの優先度には,1〜16の正の値を用いる.
409 JSPカーネルでは,以下に示すメインエラーコードを返すエラーの検出を省略
415 また,ポインタの値が不正な場合のパラメータエラー(E_PAR)の検出も省略
416 している.メモリアクセス違反(E_MACV)の検出も省略しているため,引数に
417 ポインタを渡すサービスコールに対して,存在しないメモリ番地を差すポイン
418 タなど,不正なアクセスを引き起こすポインタを渡した場合,プロセッサがバ
419 スエラーなどのCPU例外を起こす場合がある(具体的な動作はターゲットプロ
422 μITRON4.0仕様書に定義されているメインエラーコードの中で,スタンダード
423 プロファイルの機能では発生しないものや,JSPカーネルの実装上発生しない
424 ものがある.JSPカーネルでサービスコールが返すメインエラーコードについ
425 ては,「9.3 メインエラーコード一覧」を参照のこと.
427 JSPカーネルでは,サブエラーコードは用いていない.サブエラーコードには
432 JSPカーネルでは,割込みハンドラの機能とそれを定義する静的API(DEF_INH)
433 をサポートしており,割込みサービスルーチンの機能とそれを追加する静的
434 API(ATT_ISR)はサポートしていない.
436 割込みハンドラのC言語による記述形式は次の通りとする.
438 void interrupt_handler(void)
443 JSPカーネルでは,C言語で記述された割込みハンドラが呼ばれる時点で,CPU
444 ロック解除状態になっている.また,割込みハンドラからリターンするには,
447 割込みハンドラをアセンブリ言語で記述する方法は,サポートしていない.
449 NMI(マスクできない割込み)以外にカーネルの管理外の割込みがあるかどう
450 かは,ターゲット依存である.具体的な仕様については,ターゲット毎のマニュ
455 JSPカーネルでは,タイムイベントハンドラとして,周期ハンドラのみをサポー
456 トしている.周期ハンドラは,isig_timサービスコールの中から,サブルーチ
457 ンコールで呼び出される.そのため,周期ハンドラの優先順位は,isig_timを
458 呼び出した割込みハンドラよりも一つだけ高い(厳密に言うと,isig_timを呼
459 び出した割込みハンドラよりも高く,その割込みハンドラよりも高い優先順位
464 JSPカーネルでは,スタンダードプロファイル規定に従って,CPU例外ハンドラ
465 の機能とそれを定義する静的API(DEF_EXC)をサポートしている.
467 JSPカーネルでは,CPU例外ハンドラは非タスクコンテキストで実行される.非
468 タスクコンテキストから呼び出せるサービスコールは,CPU例外ハンドラ内か
469 ら呼び出すことができる.ただし,CPU例外がCPUロック状態で発生した場合に
470 は,CPU例外ハンドラ中でCPUロックを解除することはできず,非タスクコンテ
471 キストから呼び出せるサービスコールを呼び出すこともできない.
473 μITRON4.0仕様において,CPU例外ハンドラ内で行えるべきものとして規定さ
474 れている各操作は,次のような方法で行うことができる.
476 (a) CPU例外が発生したコンテキストや状態の参照は,そのために用意された
477 JSPカーネル独自のサービスコール(vxsns_ctx,vxsns_loc,vxsns_dsp,
478 vxsns_dpn,vxsns_tex)を用いて行うことができる.詳しくは,「3.10
479 CPU例外発生時のシステム状態参照」を参照すること.
481 (b) CPU例外が発生したタスクのID番号の参照は,iget_tidサービスコールを
484 (c) タスク例外処理の要求は,iras_texサービスコールを呼び出すことによっ
487 CPU例外ハンドラの優先順位は,タスクコンテキストを実行中にCPU例外が発生
488 した場合には,ディスパッチャよりも高く,すべての割込みハンドラおよびタ
489 イマハンドラよりも低い.非タスクコンテキストを実行中にCPU例外が発生し
490 た場合には,CPU例外が発生した処理の優先順位よりも一つだけ高い(厳密に
491 言うと,CPU例外が発生した処理よりも高く,CPU例外が発生した処理よりも高
492 い優先順位を持つ他のいずれの処理よりも低い).
494 CPU例外ハンドラのC言語による記述形式は次の通りとする.
496 void cpu_exception_handler(VP p_excinf)
501 p_excinf には,CPU例外に関する情報を記憶している領域の先頭番地が渡され
502 る.これは,CPU例外ハンドラ内で,CPU例外が発生したコンテキストや状態を
503 参照する際に必要となる.詳しくは,「3.10 CPU例外発生時のシステム状態参
504 照」参照すること.CPU例外ハンドラからリターンするには,C言語の関数から
507 CPU例外ハンドラをアセンブリ言語で記述する方法は,サポートしていない.
509 2.8 非タスクコンテキストからのサービスコール呼出しと割込み禁止区間
511 JSPカーネルでは,タスクコンテキスト専用のサービスコールと,非タスクコ
512 ンテキスト専用のサービスコールを厳密に区別している.タスクコンテキスト
513 専用のサービスコールを非タスクコンテキストから呼び出した場合や,非タス
514 クコンテキスト専用のサービスコールをタスクコンテキストから呼び出した場
517 また,非タスクコンテキストから呼び出されたサービスコールの遅延実行は行っ
518 ていない.そのため,非タスクコンテキストから呼び出したサービスコールも,
519 操作対象のオブジェクトの状態に依存して発生するエラーを検出することがで
522 2.9 システム初期化手順と初期化ルーチン
524 カーネルを起動するには,ターゲットに依存して行わなければならない最低限
525 の初期化を行った後,CPUロック状態と同等の状態で,kernel_start関数を呼
526 び出す.JSPカーネルでは,ターゲット毎にスタートアップモジュールを用意
527 して,この処理を行っている.詳しくは,ターゲット毎のマニュアルを参照す
530 ATT_INIによって追加された初期化ルーチンは,カーネル内部のデータ構造の
531 初期化や他の静的APIの処理を終えた後に,システムコンフィギュレーション
532 ファイル中でのATT_INIの記述順と同じ順序で呼び出される.初期化ルーチン
533 内では,サービスコールを呼び出してはならない.初期化ルーチン内でサービ
534 スコールを呼び出した場合,システムの動作は保証されない(実際には,ター
535 ゲットによって,呼び出しても差し支えないサービスコールがある).また,
536 初期化ルーチンを実行中にカーネルの管理外の割込みが禁止されているかどう
537 かは,ターゲットおよびkernel_start関数が呼び出された時の状態に依存する.
538 具体的には,ターゲット毎のマニュアルを参照すること.
542 JSPカーネルは,μITRON4.0仕様に規定されたシステムコンフィギュレーショ
543 ン手順に準拠した手順で,コンフィギュレーションを行う.
545 システムの構成を記述したシステムコンフィギュレーションファイルは,まず
546 C言語のプリプロセッサで処理され,その結果をカーネルのコンフィギュレー
547 タ(cfgプログラム)に入力する.カーネルのコンフィギュレータは,カーネ
548 ル構成・初期化ファイルをkernel_cfg.cに,ID自動割付け結果ヘッダファイル
549 をkernel_id.hに生成する.また,静的APIのパラメータチェックに用いるファ
550 イルをkernel_chk.cに,静的APIの解析内容を含むオブジェクト定義ファイル
551 をkernel_obj.datに生成する.静的APIの文法エラー(および処理中のエラー
552 の一部)が検出されれば,カーネルのコンフィギュレータがエラーを報告する.
554 kernel_cfg.cは,コンパイルされて,アプリケーションプログラムおよびカー
555 ネルと共にリンクされる.リンクにより生成されたロードモジュールは,カー
556 ネルのパラメータチェックプログラム(chkプログラム)によって,静的APIの
557 パラメータチェックが行われる.パラメータの値のエラーが検出されると,パ
558 ラメータチェックプログラムがエラーを報告するが,「1.5 既知の問題点」で
559 述べた通り,現バージョンではパラメータエラーのチェックは不完全である.
561 以上の手順は,Makefile内に記述されている.ソフトウェア部品のコンフィギュ
562 レータを組み込みたい場合には,Makefileを修正する必要がある.
566 アプリケーションが用いることができるインクルードファイルは,includeディ
569 t_services.hは,カーネル上で動作するプログラムのソースファイルでインク
570 ルードするべき標準インクルードファイルである.この中で,kernel.h(さら
571 にここから,t_stddef.h,itron.h,tool_defs.h,sys_defs.h,cpu_defs.h,
572 t_syslog.h)とserial.hをインクルードしている.また,アプリケーションに
575 s_services.hは,直接ハードウェアにアクセスするデバイスドライバのソース
576 ファイルでインクルードするべき標準インクルードファイルである.この中で,
577 sil.h(さらにここから,t_stddef.h,itron.h,tool_defs.h,sys_defs.h,
578 cpu_defs.h,t_syslog.h)とt_config.h(さらにここから,sys_config.h,
579 cpu_config.h,tool_config.h)をインクルードしている.また,アプリケー
580 ションから呼ばれるデバイスドライバのインクルードファイルで,インライン
581 関数などでシステムインタフェースレイヤを用いている場合にも,このファイ
584 この2つのファイルからインクルードされるファイル(上に列挙したもの)は,
585 直接インクルードしないのが原則であるが,次の3つのケースは例外である.
587 (1) カーネルから呼ばれるデバイスドライバのインクルードファイルで,イン
588 ライン関数などでシステムインタフェースレイヤを用いている場合には,
591 (2) カーネル上で動作するプログラムで,ターゲット依存情報を参照したい場
592 合には,t_config.hをインクルードする.
594 (3) 他のITRON仕様OSからソフトウェアをポーティングする場合などには,
595 kernel.hを直接インクルードしてもよい.
597 (4) ITRON仕様共通規定に準拠するソフトウェア部品のインクルードファイル
598 は,itron.hを直接インクルードしてもよい.
600 JSPカーネルのRelease 1.3以前のバージョンでは,t_services.hは
601 jsp_services.hというファイル名になっていた.バージョンを問わずに動作す
602 るプログラムを作る際には,t_services.hをインクルードし,古いバージョン
603 でjsp_services.hをt_services.hにシンボリックリンクを貼る方法を推奨する.
605 なお,jsp_kernel.hは,カーネルを構成するプログラムのソースファイルでイ
606 ンクルードするべき標準インクルードファイルであり,カーネル上で動作する
607 プログラムのソースファイルからは通常はインクルードしない.
609 2.12 システム終了手順と終了処理ルーチン
611 アプリケーションから kernel_exit関数を呼び出すことで,カーネルを終了す
612 ることができる.kernel_exit関数が呼び出されると,カーネルは,終了処理
613 ルーチンの実行,開発環境依存の終了処理(atexit によって登録された関数
614 や C++ におけるデストラクタの実行)を行った後,カーネルの終了処理を行
617 終了処理ルーチンは,アプリケーションで用意し,VATT_TER を使ってカーネ
618 ルに登録する.VATT_TER によって追加された終了処理ルーチンは,カーネル
619 の管理外の割込みを除くすべての割込みを禁止した状態で,システムコンフィ
620 ギュレーションファイル中での VATT_TER の記述順と逆の順序で呼び出される.
621 終了処理ルーチン内では,サービスコールを呼び出してはならない.終了処理
622 ルーチン内でサービスコールを呼び出した場合,システムの動作は保証されな
623 い(実際には,ターゲットによって,呼び出しても差し支えないサービスコー
628 JSPカーネルでは,t_stddef.h の中で,次のマクロを定義している.
632 JSPカーネルでは,assertマクロを独自に定義している.開発環境の標準の
637 C言語とEC++言語では,throw() が空になるように定義している.C++言語から
638 呼び出す可能性のあるC言語で記述された関数のプロトタイプ宣言に,throw()
641 また,t_services.h の中で,次のマクロを定義している.
645 サービスコール s を呼び出し,返値がエラーであれば,エラーメッセージを
650 サービスコール s を呼び出し,返値がエラーであれば,エラーメッセージを
654 3.JSPカーネルのサービスコールと静的API
656 この節では,JSPカーネルのサービスコールと静的APIについて,μITRON4.0仕
657 様で実装定義となっている事項とJSPカーネル独自のサービスコールを中心に
662 タスクの起動要求キューイング数の最大値(TMAX_ACTCNT)は1に固定している.
664 (1) CRE_TSK タスクの生成(静的API)
666 tskatr に TA_ASM が指定された場合の機能(タスクをアセンブリ言語で記述
667 する)はサポートしていない.また,stk に NULL 以外が指定された場合の機
668 能(スタック領域の先頭番地を指定する)もサポートしていない.
670 (2) act_tsk, iact_tsk タスクの起動
672 (3) can_act タスク起動要求のキャンセル
676 ext_tsk が非タスクコンテキストから呼ばれた場合,システムログ機能を用い
677 てエラー情報を出力し(LOG_EMERGレベル),そのまま実行を続けるが,動作
680 ext_tsk がCPUロック状態(またはディスパッチ禁止状態)で呼ばれた場合,
681 システムログにエラーを記録し(LOG_WARNINGレベル),CPUロック解除状態
682 (またはディスパッチ許可状態)にしてからタスクを終了する.
686 (6) chg_pri タスク優先度の変更
688 (7) get_pri タスク優先度の参照
692 タスクの起床要求キューイング数の最大値(TMAX_WUPCNT)は 1 に固定してい
693 る.また,タスクの強制待ち要求ネスト数の最大値(TMAX_SUSCNT)も 1 に固
697 (2) tslp_tsk 起床待ち(タイムアウトあり)
699 (3) wup_tsk, iwup_tsk タスクの起床
701 (4) can_wup タスク起床要求のキャンセル
703 (5) rel_wai, irel_wai 待ち状態の強制解除
705 (6) sus_tsk 強制待ち状態への移行
707 (7) rsm_tsk 強制待ち状態からの再開
708 (8) frsm_tsk 強制待ち状態からの強制再開
710 タスクの強制待ち要求ネスト数の最大値(TMAX_SUSCNT)が 1 であるため,
711 rsm_tsk と frsm_tsk の処理内容は同一である.
717 TEXPTN型は,unsigned int型に定義している.よって TBIT_TEXPTN は,
718 unsigned int型が 32ビットの場合は 32,16ビットの場合は 16 になる.
720 (1) DEF_TEX タスク例外処理ルーチンの定義(静的API)
722 texatr に TA_ASM が指定された場合の機能(タスク例外処理ルーチンをアセ
723 ンブリ言語で記述する)はサポートしていない.
725 (2) ras_tex, iras_tex タスク例外処理の要求
727 (3) dis_tex タスク例外処理の禁止
729 (4) ena_tex タスク例外処理の許可
731 (5) sns_tex タスク例外処理禁止状態の参照
737 セマフォの最大資源数は,UINT型(unsigned int型に定義している)で表現で
738 きる数値の範囲内である.すなわち,unsigned int型が 32ビットの場合は
739 (2^32 - 1),16ビットの場合は (2^16 - 1) = 65535 である.TMAX_MAXSEM は
742 (1) CRE_SEM セマフォの生成(静的API)
744 (2) sig_sem, isig_sem セマフォ資源の返却
746 (3) wai_sem セマフォ資源の獲得
747 (4) pol_sem セマフォ資源の獲得(ポーリング)
748 (5) twai_sem セマフォ資源の獲得(タイムアウトあり)
752 一つのイベントフラグで複数のタスクが待ち状態になれる機能はサポートして
755 FLGPTN型は,unsigned int型に定義している.よって TBIT_FLGPTN は,
756 unsigned int型が 32ビットの場合は 32,16ビットの場合は 16 になる.
758 (1) CRE_FLG イベントフラグの生成(静的API)
760 flgatr に TA_WMUL が指定された場合の機能(イベントフラグで複数のタスク
761 が待ち状態になれる)はサポートしていない.
763 (2) set_flg, iset_flg イベントフラグのセット
765 (3) clr_flg イベントフラグのクリア
767 (4) wai_flg イベントフラグ待ち
768 (5) pol_flg イベントフラグ待ち(ポーリング)
769 (6) twai_flg イベントフラグ待ち(タイムアウトあり)
773 dtqcnt個のデータを格納するのに必要なデータキュー領域のサイズは,
774 sizeof(VP_INT) * dtqcnt バイトである.TSZ_DTQ は定義していない.
776 (1) CRE_DTQ データキューの生成(静的API)
778 dtq に NULL 以外が指定された場合の機能(データキュー領域の先頭番地を指
781 (2) snd_dtq データキューへの送信
782 (3) psnd_dtq, ipsnd_dtq データキューへの送信(ポーリング)
783 (4) tsnd_dtq データキューへの送信(タイムアウトあり)
785 (5) fsnd_dtq, ifsnd_dtq データキューへの強制送信
787 (6) rcv_dtq データキューからの受信
788 (7) prcv_dtq データキューからの受信(ポーリング)
789 (8) trcv_dtq データキューからの受信(タイムアウトあり)
793 T_MSG型は下記のように定義されている.T_MSG型のサイズは,ターゲットプロ
794 セッサ/コンパイラのポインタのサイズに一致する.
796 typedef struct t_msg {
800 JSPカーネルでは,優先度別メッセージキューヘッダ領域は用いていない.
801 TSZ_MPRIHD は定義していないが,定義するとしたら 0 となる.
803 (1) CRE_MBX メールボックスの生成(静的API)
805 mprihd に NULL 以外が指定された場合の機能(優先度別メッセージキューヘッ
806 ダ領域の先頭番地を指定する)はサポートしていない.
808 (2) snd_mbx メールボックスへの送信
810 (3) rcv_mbx メールボックスからの受信
811 (4) prcv_mbx メールボックスからの受信(ポーリング)
812 (5) trcv_mbx メールボックスからの受信(タイムアウトあり)
818 サイズが blkszバイトのメモリブロックを blkcnt個獲得できるのに必要な固
819 定長メモリプール領域のサイズは,TROUND_VP(blksz) * blkcnt バイトである.
820 ここで,TROUND_VP(blksz) は,blksz をターゲットプロセッサ/コンパイラ
821 のポインタのサイズの倍数になるよう切り上げた数を表す.TSZ_MPF は定義し
824 (1) CRE_MPF 固定長メモリプールの生成(静的API)
826 mpf に NULL 以外が指定された場合の機能(固定長メモリプール領域の先頭番
829 (2) get_mpf 固定長メモリブロックの獲得
830 (3) pget_mpf 固定長メモリブロックの獲得(ポーリング)
831 (4) tget_mpf 固定長メモリブロックの獲得(タイムアウトあり)
833 (5) rel_mpf 固定長メモリブロックの返却
835 blkパラメータ(返却するメモリブロックの先頭番地)の値が,返却先のメモ
836 リプール領域の外や,メモリブロックの途中を指す場合には,E_PARエラーを
837 返す.未獲得のメモリブロックを返却した場合や,返却済のメモリブロックを
842 タイムイベントハンドラに関しては,「2.6 タイムイベントハンドラ」を参照
847 JSPカーネルでは,タイムティックの供給(isig_tim を周期的に呼び出す処理)
848 はシステムサービスのシステムクロックドライバによって実現している.シス
849 テムクロックドライバの主要部分は,ターゲット毎にハードウェアタイマを使っ
850 て実現されており,isig_tim を呼び出す周期はターゲット毎に定める.その
851 ため TIC_NUME と TIC_DENO は,ターゲット依存部のアプリケーション用のイ
852 ンクルードファイル(cpu_defs.h および sys_defs.h)の中で定義している.
853 ターゲットによっては,この数値を変更するだけで isig_tim を呼び出す周期
854 を変更できるように実装されている場合もある.詳しくは,ターゲット毎のマ
857 (1) set_tim システム時刻の設定
859 (2) get_tim システム時刻の参照
861 (3) isig_tim タイムティックの供給
863 isig_tim は,ターゲット依存に定義された TIC_NUME と TIC_DENO で指定さ
864 れる時間だけシステム時刻を進め,必要なタイムイベント(タイムアウト,周
865 期ハンドラの起動など)の処理を行う.JSPカーネルでは,システムクロック
866 ドライバがこのサービスコールを周期的に呼び出すため,アプリケーションか
871 周期ハンドラの起動位相を保存する機能はサポートしていない.
873 (1) CRE_CYC 周期ハンドラの生成(静的API)
875 cycatr に TA_PHS が指定された場合の機能(周期ハンドラの起動位相を保存
876 する)はサポートしていない.また,TA_ASM が指定された場合の機能(周期
877 ハンドラをアセンブリ言語で記述する)もサポートしていない.
879 cycatr に TA_STA を指定し,cycphs に 0 を指定した場合,周期ハンドラの
880 初回の起動は,システム起動後の最初のタイムティックで行われる.すなわち,
881 cycphs に 1 を指定した場合と同じ振る舞いとなる.混乱の原因となるため,
882 cycphs に 0 を指定することは推奨しない.
884 (2) sta_cyc 周期ハンドラの動作開始
886 (3) stp_cyc 周期ハンドラの動作停止
890 (1) rot_rdq, irot_rdq タスクの優先順位の回転
892 (2) get_tid, iget_tid 実行状態のタスクIDの参照
894 (3) loc_cpu, iloc_cpu CPUロック状態への移行
896 (4) unl_cpu, iunl_cpu CPUロック状態の解除
898 (5) dis_dsp ディスパッチの禁止
900 (6) ena_dsp ディスパッチの許可
902 (7) sns_ctx コンテキストの参照
904 (8) sns_loc CPUロック状態の参照
906 (9) sns_dsp ディスパッチ禁止状態の参照
908 (10) sns_dpn ディスパッチ保留状態の参照
910 (11) vsns_ini カーネル動作状態の参照
913 BOOL state = vsns_ini();
923 カーネルの初期化完了前または終了処理開始後に呼び出された場合に TRUE,
924 カーネルの動作中に呼び出された場合に FALSE を返す.
926 このサービスコールが TRUE を返す時には,他のサービスコールを呼び出して
927 はならない.このサービスコールが TRUE を返す時に他のサービスコールを呼
928 び出した場合,システムの動作は保証されない.
932 割込みハンドラに関しては,「2.5 割込みハンドラ」を参照すること.
934 (1) DEF_INH 割込みハンドラの定義(静的API)
936 INHNO型の定義と inhno の意味はターゲット毎に定める.inhatr には,
937 TA_HLNG のみを指定することができる.
941 (4) chg_ixx 割込みマスクの変更
942 (5) get_ixx 割込みマスクの参照
944 これらのサービスコールがサポートされているかどうか,サポートされている
945 場合の仕様(xx の部分の名称,型とパラメータの名称と意味,CPUロック状態
946 やディスパッチ状態との関連)については,ターゲット依存である.具体的に
947 は,ターゲット毎のマニュアルを参照すること.
951 CPU例外ハンドラに関しては「2.7 CPU例外ハンドラ」を,初期化ルーチンに関
952 しては「2.9 システム初期化手順と初期化ルーチン」参照すること.
954 (1) DEF_EXC CPU例外ハンドラの定義(静的API)
956 EXCNO型の定義と excno の意味はターゲット毎に定める.excatr には,
957 TA_HLNG のみを指定することができる.
959 (2) ATT_INI 初期化ルーチンの追加(静的API)
961 iniatr に TA_ASM が指定された場合の機能(初期化ルーチンをアセンブリ言
964 (3) VATT_TER 終了処理ルーチンの追加(静的API)
967 VATT_TER({ ATR teratr, VP_INT exinf, FP terrtn });
970 ATR teratr 終了処理ルーチン属性
971 VP_INT exinf 終了処理ルーチンの拡張情報
972 FP terrtn 終了処理ルーチンの起動番地
976 終了処理ルーチンを,指定される各パラメータに基づいて追加する.teratr
977 は終了処理ルーチンの属性,exinf は終了処理ルーチンを起動する時にパラメ
978 ータとして渡す拡張情報,terrtn は終了処理ルーチンの起動番地である.
980 VATT_TER においては,teratr はプリプロセッサ定数式パラメータである.
981 teratr には,TA_HLNG の指定ができる.TA_HLNG(=0x00)が指定された場合
982 には高級言語用のインタフェースで終了処理ルーチンを起動する.
984 VATT_ATR によって追加された終了処理ルーチンは,システム終了処理時に実
985 行される.詳しくは,「2.12 システム終了手順と終了処理ルーチン」を参照
988 3.10 CPU例外発生時のシステム状態参照
990 CPU例外ハンドラ内で,CPU例外が発生したコンテキストや状態を参照するため
991 のサービスコールとして,JSPカーネルでは,五つのサービスコールを独自に
992 サポートしている.サービスコール vxsns_yyy は,CPU例外が発生した処理で
993 sns_yyy を呼び出した場合の結果を取り出すもので,CPU例外ハンドラに渡さ
994 れるパラメータ p_excinf をパラメータとする.
996 (1) vxsns_ctx CPU例外発生時のコンテキストの参照
999 BOOL state = vxsns_ctx(VP p_excinf);
1002 VP p_excinf CPU例外に関する情報を記憶している領域の
1010 CPU例外が発生したコンテキストが,非タスクコンテキストの場合に TRUE,タ
1011 スクコンテキストの場合に FALSE を返す.p_excinf には,CPU例外ハンドラ
1012 に渡される p_excinfパラメータをそのまま渡す.CPU例外ハンドラ以外から呼
1013 び出した場合や,p_excinf を正しく渡さなかった場合の振舞いは保証されな
1016 (2) vxsns_loc CPU例外発生時のCPUロック状態の参照
1019 BOOL state = vxsns_loc(VP p_excinf);
1022 VP p_excinf CPU例外に関する情報を記憶している領域の
1030 CPU例外が発生した状態が,CPUロック状態の場合に TRUE,CPUロック解除状態
1031 の場合に FALSE を返す.p_excinf には,CPU例外ハンドラに渡される
1032 p_excinfパラメータをそのまま渡す.CPU例外ハンドラ以外から呼び出した場
1033 合や,p_excinf を正しく渡さなかった場合の振舞いは保証されない.
1035 (3) vxsns_dsp CPU例外発生時のディスパッチ禁止状態の参照
1038 BOOL state = vxsns_dsp(VP p_excinf);
1041 VP p_excinf CPU例外に関する情報を記憶している領域の
1045 BOOL state ディスパッチ禁止状態
1049 CPU例外が発生した状態が,ディスパッチ禁止状態の場合に TRUE,ディスパッ
1050 チ許可状態の場合に FALSE を返す.p_excinf には,CPU例外ハンドラに渡さ
1051 れる p_excinfパラメータをそのまま渡す.CPU例外ハンドラ以外から呼び出し
1052 た場合や,p_excinf を正しく渡さなかった場合の振舞いは保証されない.
1056 CPU例外ハンドラの起動によってディスパッチ禁止/許可状態は変化せず,CPU
1057 例外ハンドラ中ではディスパッチの禁止や許可は行えないため,vxsns_dsp の
1058 返り値は sns_dsp の返り値に常に一致する.そのため,vxsns_dsp と
1059 sns_dsp の処理内容は同一となっている.
1061 (4) vxsns_dpn CPU例外発生時のディスパッチ保留状態の参照
1064 BOOL state = vxsns_dpn(VP p_excinf);
1067 VP p_excinf CPU例外に関する情報を記憶している領域の
1071 BOOL state ディスパッチ保留状態
1075 CPU例外が発生した状態が,ディスパッチ保留状態の場合に TRUE,そうでない
1076 場合に FALSE を返す.すなわち,ディスパッチャよりも優先順位が高い処理
1077 が実行されていた時,CPUロック状態であった時およびディスパッチ禁止状態
1078 であった時は,TRUE を返す.p_excinf には,CPU例外ハンドラに渡される
1079 p_excinfパラメータをそのまま渡す.CPU例外ハンドラ以外から呼び出した場
1080 合や, p_excinf を正しく渡さなかった場合の振舞いは保証されない.
1082 (5) vxsns_tex CPU例外発生時のタスク例外処理禁止状態の参照
1085 BOOL state = vxsns_tex(VP p_excinf);
1088 VP p_excinf CPU例外に関する情報を記憶している領域の
1092 BOOL state タスク例外処理禁止状態
1096 CPU例外が発生した時に実行状態であったタスクが,タスク例外処理禁止状態
1097 の場合に TRUE,タスク例外処理許可状態の場合に FALSE を返す.CPU例外が
1098 非タスクコンテキストで発生し,その時に実行状態のタスクがなかった場合に
1099 も,FALSE を返す.p_excinf には,CPU例外ハンドラに渡される p_excinfパ
1100 ラメータをそのまま渡す.CPU例外ハンドラ以外から呼び出した場合や,
1101 p_excinf を正しく渡さなかった場合の振舞いは保証されない.
1105 CPU例外ハンドラの起動によってタスク例外処理禁止/許可状態は変化せず,
1106 CPU例外ハンドラ中ではタスク例外処理の禁止や許可は行えないため,
1107 vxsns_tex の返り値は sns_tex の返り値に常に一致する.そのため,
1108 vxsns_tex と sns_tex の処理内容は同一となっている.
1110 3.11 性能評価用システム時刻参照機能
1112 JSPカーネルでは,JSPカーネル上で動作するタスクやJSPカーネル自身の性能
1113 を計測するために,システム時刻より精度の高い性能評価用システム時刻を読
1114 み出す機能を,ターゲット依存にサポートしている.性能評価用システム時刻
1115 は,μ秒単位で表現されるが,実際の精度はターゲット依存である.具体的に
1116 は,ターゲット毎のマニュアルを参照すること.
1118 性能評価用システム時刻参照機能では,次のデータ型を用いる.
1120 SYSUTIM 性能評価用システム時刻(符号無し整数)
1122 SYSUTIM型のサイズ数はターゲット依存である.具体的には,ターゲット毎の
1125 (1) vxget_tim 性能評価用システム時刻の参照
1128 ER ercd = vxget_tim(SYSUTIM *p_sysutim);
1135 SYSUTIM sysutim 現在の性能評価用システム時刻
1142 現在の性能評価用システム時刻を読み出し,sysutim に返す.
1144 このサービスコールは,タスクコンテキストからのみ呼び出すことができる.
1145 非タスクコンテキストから呼び出した場合には,E_CTXエラーとなる.
1147 タスクコンテキストであれば,CPUロック状態であっても呼び出せるが,CPUロッ
1148 ク状態が長時間継続すると,タイマ割込みが入らないためにシステム時刻が更
1149 新されず,このサービスコールも正しい性能評価用システム時刻を返せなくな
1150 る.時間測定区間が短い場合を除いては,時間測定区間全体をCPUロック状態
1156 システムログ機能は,カーネル内で発生した異常事象(アサーションの失敗,
1157 エラーコードを返せないエラー)を,システムの外部に通知するための機能で
1158 ある.カーネルのトレースログ,システムサービスやアプリケーション内で発
1159 生した異常事象やトレースログにも,同じ機能を利用することができる.
1163 カーネル内で発生した異常事象をシステムの外部に通知するための方法として,
1164 シリアルインタフェースに出力する,ディスクに書き出すなどの方法が考えら
1167 システムログ機能は,カーネル内部から呼び出されるという観点からは,カー
1168 ネルの一部と考えるのが自然である.一方,シリアルインタフェースやディス
1169 クにアクセスするためのサービス(デバイスドライバなど)はカーネル上で動
1170 作するため,それらを用いるシステムログ機能は,カーネル上に実装されたシ
1171 ステムサービスと考える方が自然で,位置づけが微妙である.
1173 そこでJSPカーネルでは,カーネルの拡張機能として,異常事象に関する情報
1174 やトレースログ情報(これを,ログ情報と総称する)を,カーネル内のバッファ
1175 (これをログバッファと呼ぶ)に記録する機能と,ログバッファからログ情報
1176 を読み出す機能を用意する.これを,システムログ機能と呼ぶ.ログ情報をロ
1177 グバッファから読み出し,デバイスにアクセスするサービスを用いて外部に出
1178 力する機能は,システムログタスクとしてカーネル上に実現する.
1180 4.2 ログバッファへの記録と低レベル出力
1182 上述したように,ログ情報をシステムの外部に出力するために,デバイスにア
1183 クセスするサービスが必要になるが,これらのサービスはカーネル上で動作し
1184 ているため,カーネルの動作を継続できないような重大な異常事象が起こった
1185 場合には,これらのサービスを使うことができない.また,これらのサービス
1186 自身をデバッグする場合にも,デバイスにアクセスするサービスを使うことが
1189 そこで,カーネル上で動作するサービスが使えない場合にでもログ情報を出力
1190 するために,低レベル出力機能を用意する.低レベル出力機能は,ターゲット
1191 依存に用意する低レベルの文字出力関数(sys_putc)を用いてログ情報を出力
1192 する機能である.低レベルの文字出力関数は,ターゲット依存部で用意するこ
1193 ととしているが,最終製品に組み込まれる場合などでは,文字を出力する方法
1194 がない状況も考えられる.そのような場合,低レベルの文字出力関数に送られ
1195 た文字は,メモリ上に残しておくか,捨ててしまうしかない.
1197 ログ情報を,ログバッファへ記録するか低レベル出力機能を用いて出力するか
1198 の設定は,カーネルの拡張サービスコール(vmsk_log)によって行うことがで
1199 きる.vmsk_log の使い方については後述する.
1201 低レベル出力機能を用いると,ログメッセージの作成処理(printf 相当の処
1202 理)と低レベルの文字出力処理をカーネル内で行うために,カーネルの応答性
1203 が悪くなることに注意しなければならない.特に,低レベルの文字出力処理は
1204 デバイスをポーリングする形で実装するのが通常で,その場合には,カーネル
1205 の応答性は実用的と言えない程に悪くなる.
1207 一方,カーネルの動作を継続できるような(あまり重大でない)事象について
1208 は,ログ情報をカーネル内のログバッファに記録し,記録したログ情報の出力
1209 は,デバイスにアクセスするサービスを用いて動作するシステムログタスクに
1210 任せる.システムログタスクはカーネル上で動作するタスクであり,カーネル
1211 の拡張サービスコール(vrea_log)を用いて,ログバッファからログ情報を読
1212 み出す.JSPカーネルの標準配布キットには,システムログタスクの一例とし
1213 て,シリアルインタフェースにログ情報を文字列の形で出力するシステムログ
1218 JSPカーネルのシステムログ機能は,ログ情報に以下の種別を設けている.
1220 LOG_TYPE_INH 割込みハンドラ
1221 LOG_TYPE_ISR 割込みサービスルーチン
1223 LOG_TYPE_EXC CPU例外ハンドラ
1224 LOG_TYPE_TEX タスク例外処理ルーチン
1225 LOG_TYPE_TSKSTAT タスク状態変化
1226 LOG_TYPE_DSP ディスパッチャ
1227 LOG_TYPE_SVC サービスコール
1228 LOG_TYPE_COMMENT コメント
1229 LOG_TYPE_ASSERT アサーションの失敗
1231 これらの種別は,ITRONデバッギングインタフェース仕様を参考に定めている.
1232 ただし,ITRONデバッギングインタフェース仕様におけるトレースログ形式は,
1233 RIM(RTOS Interface Module)がデバッグツールに渡す場合の形式を定めたも
1234 のであり,カーネルが出力する形式と一致している必要はない(RIM が変換す
1235 ればよいため).実際,上の種別の中で,LOG_TYPE_CYC と LOG_TYPE_ASSERT
1236 は,デバッギングインタフェース仕様と一致していない.
1238 ログ情報の種別の中で,LOG_TYPE_COMMENT と LOG_TYPE_ASSERT 以外はカーネ
1239 ルのトレースログのためのもので,どのように用いるかはターゲット依存部に
1244 JSPカーネルのシステムログ機能は,ログ情報を出力する際に指定する重要度
1245 に基づいて,実際に出力するログ情報を動的に設定することができる.これは,
1246 UNIX のシステムログ機能をまねたもので,ログの重要度の種類や指定方法も
1247 UNIX の API を参考にしている.また,低レベル出力機能を用いて出力するロ
1248 グ情報も,重要度に基づいて動的に設定することができる.
1250 具体的には,ログの重要度として次の8段階を用意している.
1252 LOG_EMERG システムをシャットダウンすべきエラー
1255 LOG_ERROR 重要性の低いシステムエラー
1256 LOG_WARNING 警告メッセージ.システムは安全に継続動作できる
1259 LOG_DEBUG デバッグのためのメッセージ
1261 なお,アサーションの失敗は,LOG_EMERG で出力する.カーネルのトレースロ
1262 グは,LOG_DEBUG で出力するのを標準とする(ターゲット依存).
1264 どの重要度のログ情報をログバッファに記録するかと,どの重要度のログ情報
1265 を低レベル出力機能を用いて出力するかは,カーネルの拡張サービスコール
1266 (vmsk_log)によって設定することができる.vmsk_log の各パラメータは,
1267 指定するログ情報の集合を表すビットマップである.また,ビットマップを作
1268 るためのマクロとして,LOG_MASK と LOG_UPTO を用意している.
1272 JSPカーネルは,カーネルのトレースログを取得するための基本的な仕組みを
1273 持っているが,トレースログの実際の取得方法はターゲット依存となる.カー
1274 ネルのトレースログの取得に,システムログ機能を使うのも選択肢の1つであ
1275 る.ただし,カーネルのトレースログをシステムログタスクを用いて取り出す
1276 方法は考えていない(システムログタスクが動作することによりトレースログ
1277 が生成され,取り出すより多くのログ情報が生成される可能性があるため).
1279 4.6 システムログ機能の拡張サービスコール
1281 システムログ機能の提供する拡張サービスコールは次の通りである.
1283 (1) ER vwri_log(UINT prio, SYSLOG *p_log)
1285 システムログ機能に,重要度 prio でログ情報を出力する(ログバッファへ記
1286 録するか低レベル出力機能を用いて出力する).SYSLOG は,ログ情報を格納
1287 するためのデータ型(構造体)で,この拡張サービスコールには,それへのポ
1290 (2) ER_UINT vrea_log(SYSLOG *p_log)
1292 ログバッファからログ情報を1つ取り出す.ログバッファが空の時は E_OBJ,
1293 そうでない場合は,失われたログ情報の数(ログ情報が失われていない場合は
1294 0)を返す.システムログタスクが用いることを想定している.
1296 (3) ER vmsk_log(UINT logmask, UINT lowmask)
1298 ログバッファに記録すべきログ情報の重要度のビットマスク(logmask)と,
1299 低レベル出力機能を用いて出力すべきログ情報の重要度のビットマスク
1302 4.7 システムログ機能のためのライブラリ関数とマクロ
1304 システムログ機能は,上記のサービスコールに加えて,次のライブラリ関数と
1307 (1) void _syslog_n(UINT prio, UINT type, VP_INT arg1, ..., VP_INT argn)
1310 ログ種別が type,パラメータが arg1〜argn のログ情報を,重要度 prio で
1313 (2) void syslog_n(UINT prio, const char *format, arg1, ..., argn)
1316 format 文字列およびそれに続く引数から作成されるコメント(ログ種別が
1317 LOG_TYPE_COMMENT のログ情報)を,重要度 prio で出力するためのマクロ.
1319 format はメッセージのフォーマット記述,arg1〜argn はフォーマット記述中
1320 で参照される値で,printf のフォーマット記述のサブセットとなっている.
1321 arg1〜argn は VP_INT型にキャストされるため,VP_INT型に型変換できる任意
1322 の型を渡すことができ,型チェックはされない.format および arg1〜argn
1325 ・format のフォーマット記述は,このマクロから戻った後も変化してはなら
1326 ない.定数文字列を渡すことを想定している.
1328 ・format 中に使えるフォーマット指定は次の通り.
1330 %d 引数をsigned int型とみなし,10進数で表示
1331 %u 引数をunsigned int型とみなし,10進数で表示
1332 %x 引数をunsigned int型とみなし,16進数(英文字は小文字)で表示
1333 %X 引数をunsigned int型とみなし,16進数(英文字は大文字)で表示
1334 %p 引数をポインタとみなし,16進数(英文字は小文字)で表示
1335 %c 引数を文字コードとみなし,文字を表示
1336 %s 引数を文字列を示すポインタとみなし,文字列を表示
1339 %d, %u, %x, %X においては,'%' の直後に表示桁数を指定する10進数値を記述
1340 することができる.その場合,表示すべき文字列が指定した桁数に満たない場
1341 合には,指定した桁数内に右詰めで表示する.10進数値が '0' で始まる場合
1344 また,VP_INT型のサイズが long型のサイズ以上である環境においては,次の
1345 フォーマット指定も使用することができる.この他のフォーマット指定に 'l'
1346 を付加した場合には無視する(%lcと%lsには対応していない).
1348 %ld 引数をsigned long型とみなし,10進数で表示
1349 %lu 引数をunsigned long型とみなし,10進数で表示
1350 %lx 引数をunsigned long型とみなし,16進数(英文字は小文字)で表示
1351 %lX 引数をunsigned long型とみなし,16進数(英文字は大文字)で表示
1353 ・arg1〜argn にポインタを渡す場合(%s に対応する引数の場合)に,ポイン
1354 タの指すデータは,このマクロから戻った後も変化してはならない.定数文字
1357 (3) void syslog(UINT prio, const char *format, ...)
1359 format 文字列およびそれに続く引数から作成されるメッセージを,重要度
1360 prio でログ情報として出力するためのライブラリ関数で,引数の数を可変に
1361 したもの.format に続く引数は最大5個まで.format およびそれに続く引数
1362 には,syslog_n と同様の制限がある.
1364 このライブラリ関数は,可変数引数を処理するために内部で文字列をスキャン
1365 する.そのため,実行時間が長くなる可能性があり,割込み禁止状態で呼び出
1366 すべきではない.主にアプリケーションプログラムが用いることを想定してい
1367 る.そのため,このライブラリ関数のソースファイルは,サポートライブラリ
1370 (4) UINT LOG_MASK(UINT prio)
1372 重要度 prio のみセットされたビットマップを作るマクロ.vmsk_log に渡す
1375 (5) UINT LOG_UPTO(UINT prio)
1377 重要度 prio 以上の重要度がすべてセットされたビットマップを作るマクロ.
1378 vmsk_log に渡す引数を作るために用いる.
1380 (6) void syslog_printf(const char *format, VP_INT *args, void (*putc)(char))
1381 (7) void syslog_print(SYSLOG *p_sys, void (*putc)(char))
1382 (8) void syslog_output(void (*putc)(char))
1384 ログ情報をフォーマット出力するためのライブラリ関数.syslog_printf は渡
1385 されたフォーマット文字列と引数を,syslog_print は渡されたログ情報を,
1386 syslog_output はログバッファに格納されたログ情報をフォーマット出力する.
1388 システムログタスクが用いることを想定しているため,このライブラリ関数の
1389 ソースファイルはサポートライブラリのディレクトリに置いている.ただし,
1390 低レベル出力を行うために,システムログ機能内部でも用いている.
1394 JSPカーネルのシステムログ機能の想定されている設定方法は,以下の通りで
1397 (a) 重大な異常事象を示すログ情報は低レベル出力機能を用いて出力し,そう
1398 でないログ情報の出力はシステムログタスクに任せる.
1400 ログバッファに記録するログ情報の重要度と,低レベル出力を用いて出力する
1401 ログ情報の重要度を適切に設定する.また,ログバッファからログ情報を読み
1402 出して外部へ通知するシステムログタスクと,低レベルの文字出力関数を用意
1405 (b) すべてのログ情報を,低レベル出力機能を用いて出力する.
1407 必要なログ情報はすべて低レベル出力機能を用いて出力するよう設定
1408 (vmsk_log の第1パラメータを 0 に設定)する.また,低レベルの文字出力
1409 関数を用意する.システムログタスクは不要.
1411 (c) ログ情報はメモリ上に記録するだけで,システム外部には出力しない.
1413 必要なログ情報はすべてログバッファへ記録するように設定(vmsk_log の第2
1414 パラメータを 0 に設定)する.システムログタスクは不要.
1418 いずれのログ情報も記録/出力しないように設定(vmsk_log の両パラメータ
1421 別の方法として,OMIT_SYSLOG を定義してコンパイルすることで,システムロ
1422 グ機能をカーネルから取り外し,カーネルのコードサイズを小さくすることが
1423 できる.ただし,アプリケーションから syslog,syslog_printf,syslog_print,
1424 syslog_output の各関数を呼び出している場合,それらの関数のコードは外れ
1425 ない.また,カーネルからのログ情報は記録/出力しないが,アプリケーショ
1426 ンからのログ情報は記録/出力したい場合には,カーネルのみ OMIT_SYSLOG
1427 を定義してコンパイルすればよい.この場合,システムログ機能の初期化関数
1428 (_kernel_syslog_initialize)と終了処理関数(_kernel_syslog_teminate)
1429 は,アプリケーションから呼び出す必要がある.
1431 なお,(b)〜(c) の設定に固定して使用する場合にも,カーネル内の一部のコー
1432 ドが不要になり,コードサイズを小さくできる余地があるが,簡易な方法は用
1438 この節では,JSPカーネルがサポートしているシステムインタフェースレイヤ
1439 (SIL)と,JSPカーネルが標準的に動作させるドライバおよびシステムタスク
1442 5.1 システムインタフェースレイヤ(SIL)
1444 JSPカーネルは,ITRONデバイスドライバ設計ガイドラインの一部分として検討
1445 されているシステムインタフェースレイヤ(SIL)の中で,以下に挙げる機能
1446 をサポートしている.SILを用いるプログラムからは,t_services.hに代えて,
1447 s_services.hをインクルードする.
1449 ITRONデバイスドライバ設計ガイドラインでは,デバイスドライバの中で,SIL
1450 を通して直接デバイスにアクセスするモジュール(PDIC)と,カーネルの機能
1451 を用いるモジュール(GDIC)を分離することにしている.すなわち,PDICは
1452 SILを用いるがカーネルの機能は用いず,GDICはカーネルの機能は用いるがSIL
1453 を用いてはならない.そのため,s_services.hには,カーネルを用いるための
1458 デバイスを扱うプログラムの中では,すべての割込み(NMIを除く,以下同じ)
1459 を禁止したい場合がある.μITRON4.0仕様のCPUロック状態は,カーネルの管
1460 理外の割込み(NMI以外にカーネルの管理外の割込みがあるかは,JSPカーネル
1461 ではターゲット依存)を禁止するとは限らず,このような場合に用いるのは適
1464 そこで,すべての割込みを禁止した状態を割込みロック状態と呼び,SILでは
1465 割込みロック状態を制御するための以下の機能を用意している.
1469 割込みロック状態の制御に必要な変数を宣言し,それを初期化するマクロ.こ
1470 のマクロを記述した時点で,割込みの禁止状態を記録する.SIL_LOC_INT,
1471 SIL_UNL_INTを用いる関数(ブロック)の先頭の変数宣言部に記述しなければ
1476 すべての割込みを禁止し,割込みロック状態に移行する.
1480 SIL_PRE_LOCを記述した時点の状態に戻す.
1482 割込みロック状態の制御機能の使用例は次の通り.
1489 この間にサービスコールを呼び出してはならない
1493 なお,JSPカーネル自身は割込みロック状態は管理していないため,割込ロッ
1494 ク状態ではサービスコールを呼び出してはならない(呼び出した場合の動作は
1499 デバイスをアクセスする際に,微少な時間待ちを入れなければならない場合が
1500 ある.そのような場合に,nopをいくつか入れるなどの方法で対応すると,ポ
1501 ータビリティが悪くなる.そこでSILでは,微少な時間待ちを行うための機能
1504 (1) void sil_dly_nse(UINT dlytim)
1506 dlytimで指定された以上の時間(単位はナノ秒),ループなどによって待つ.
1507 指定した値によっては,指定した時間よりもかなり長く待つ場合があるので注
1512 プロセッサのエンディアンを知るためのマクロとして,以下のマクロを定義し
1517 リトルエンディアンプロセッサではSIL_ENDIAN_LITTLE(=0),ビッグエンディ
1518 アンプロセッサではSIL_ENDIAN_BIG(=1)にマクロ定義される.
1522 メモリ空間にマッピングされたデバイスレジスタや,デバイスとの共有メモリ
1523 をアクセスするために,以下の関数を用意している.
1525 (1) VB sil_reb_mem(VP mem)
1527 memで指定されるアドレスから,8ビット単位で読んだ値を返す.
1529 (2) void sil_wrb_mem(VP mem, VB data)
1531 memで指定されるアドレスに,dataで指定される値を8ビット単位で書き込む.
1533 (3) VH sil_reh_mem(VP mem)
1535 memで指定されるアドレスから,16ビット単位で読んだ値を返す.
1537 (4) void sil_wrh_mem(VP mem, VH data)
1539 memで指定されるアドレスに,dataで指定される値を16ビット単位で書き込む.
1541 (5) VH sil_reh_lem(VP mem)
1543 memで指定されるアドレスから,16ビット単位でリトルエンディアンで読んだ
1544 値を返す.リトルエンディアンプロセッサでは,sil_reh_memと一致する.
1546 (6) void sil_wrh_lem(VP mem, VH data)
1548 memで指定されるアドレスに,dataで指定される値を16ビット単位でリトルエ
1549 ンディアンで書き込む.リトルエンディアンプロセッサでは,sil_wrh_memと
1552 (7) VH sil_reh_bem(VP mem)
1554 memで指定されるアドレスから,16ビット単位でビッグエンディアンで読んだ
1555 値を返す.ビッグエンディアンプロセッサでは,sil_reh_memと一致する.
1557 (8) void sil_wrh_bem(VP mem, VH data)
1559 memで指定されるアドレスに,dataで指定される値を16ビット単位でビッグエ
1560 ンディアンで書き込む.ビッグエンディアンプロセッサでは,sil_wrh_memと
1563 (9) VW sil_rew_mem(VP mem)
1565 memで指定されるアドレスから,32ビット単位で読んだ値を返す.
1567 (10) void sil_wrw_mem(VP mem, VW data)
1569 memで指定されるアドレスに,dataで指定される値を32ビット単位で書き込む.
1571 (11) VW sil_rew_lem(VP mem)
1573 memで指定されるアドレスから,32ビット単位でリトルエンディアンで読んだ
1574 値を返す.リトルエンディアンプロセッサでは,sil_rew_memと一致する.
1576 (12) void sil_wrw_lem(VP mem, VW data)
1578 memで指定されるアドレスに,dataで指定される値を32ビット単位でリトルエ
1579 ンディアンで書き込む.リトルエンディアンプロセッサでは,sil_wrw_memと
1582 (13) VW sil_rew_bem(VP mem)
1584 memで指定されるアドレスから,32ビット単位でビッグエンディアンで読んだ
1585 値を返す.ビッグエンディアンプロセッサでは,sil_rew_memと一致する.
1587 (14) void sil_wrw_bem(VP mem, VW data)
1589 memで指定されるアドレスに,dataで指定される値を32ビット単位でビッグエ
1590 ンディアンで書き込む.ビッグエンディアンプロセッサでは,sil_wrw_memと
1593 なお,JSPカーネルのターゲット非依存部では,I/O空間にアクセスするための
1594 関数を用意していないが,ターゲット依存部でサポートすることは可能である.
1595 詳しくは,ターゲット毎のマニュアルを参照すること.
1599 システムクロックドライバは,ハードウェアタイマを用いて周期的に割込みを
1600 発生させ,isig_timを呼び出してカーネルにタイムティックを供給する.シス
1601 テムクロックドライバは,システムコンフィギュレーションファイルに
1602 timer.cfgをインクルードすることで,システムに組み込むことができる.
1604 5.2.1 システムクロックドライバの内部構成
1606 システムクロックドライバは,タイマの起動処理,タイマ割込みハンドラ,タ
1609 (1) void timer_initialize(VP_INT exinf)
1611 タイマの起動処理.タイマを初期化し,周期的なタイマ割込み要求を発生させ
1612 る.カーネルに初期化ルーチンとして登録する.exinfは無視する.
1614 (2) void timer_handler()
1616 タイマ割込みハンドラ.タイマ割込み要求をクリアした後,isig_timを呼び出
1617 してタイムティックを供給する.カーネルに割込みハンドラとして登録する.
1619 (3) void timer_terminate(VP_INT exinf)
1621 タイマの停止処理.周期的なタイマ割込み要求を停止させる.カーネルに終了
1622 処理ルーチンとして登録する.exinf は無視する.
1626 シリアルインタフェースドライバは,シリアルポートを扱うためのドライバで
1627 ある.シリアルインタフェースドライバは,システムコンフィギュレーション
1628 ファイルにserial.cfgをインクルードすることで,システムに組み込むことが
1631 シリアルインタフェースドライバは,ポート毎にセマフォを2個ずつ使用する.
1632 セマフォを生成する静的APIは,serial.cfgに含まれている.
1634 NEWLIBやGLIBCなどの標準Cライブラリを使用する場合には,標準Cライブラリ
1635 の低レベル入出力ルーチンをシリアルインタフェースドライバを呼び出すもの
1636 にすることで,タスクの標準入出力をシリアルインタフェースドライバ経由に
1637 切り替えることができる.具体的な方法は,用いる標準Cライブラリに依存す
1640 5.3.1 シリアルインタフェースドライバのサービスコール
1642 シリアルインタフェースドライバを呼び出すサービスコールの仕様は下記の通
1643 りである.この中で,シリアルポートのID番号(portid)の解釈はターゲット
1646 これらのサービスコールは,非タスクコンテキストから呼び出すことはできな
1647 い.また,serial_rea_datとserial_wri_datは,ディスパッチ保留状態で呼び
1648 出すことはできない.いずれも,呼び出した場合にはE_CTXエラーとなる.
1650 (1) ER serial_opn_por(ID portid)
1652 portidで示されるシリアルポートをオープンし,受信/送信が可能な状態にす
1655 (2) ER serial_cls_por(ID portid)
1657 portidで示されるシリアルポートをクローズする.
1659 (3) ER_UINT serial_rea_dat(ID portid, char *buf, UINT len)
1661 portidで示されるシリアルポートから,lenバイトの文字列を受信し,bufから
1662 の領域に入れる.lenバイト受信するまで,待ち状態となる.受信した文字数
1665 (4) ER_UINT serial_wri_dat(ID portid, char *buf, UINT len)
1667 portidで示されるシリアルポートに,bufからのlenバイトの文字列を送信する.
1668 lenバイト送信バッファに入れるまで,待ち状態となる.送信した文字数また
1671 (5) ER serial_ctl_por(ID portid, UINT ioctl)
1673 portidで示されるシリアルポートの制御情報を,ioctlで示される値に設定す
1676 ioctlには,以下の制御情報を表す定数を,ビット毎に論理和をとったものを
1679 IOCTL_ECHO(エコーバックモード)
1680 このビットを設定すると,シリアルインタフェースドライバがエコー
1681 バックを行う.具体的には,バッファから文字を取り出す度に,その
1685 LF(line feed)を書き出すと,CR(carriage return)+ LFに変換し
1688 IOCTL_FCSND(出力フロー制御)
1689 文字を送信する処理に対して,XON/XOFFによるフロー制御を行う.
1690 すなわち,STOP(コントロール-S)を受信すると送信を停止し,
1691 START(コントロール-Q)を受信すると送信を再開する.
1693 IOCTL_FCANY(送信フロー制御で任意の文字で送信再開)
1694 IOCTL_FCOUTを指定している時に,送信停止中に受信した任意の文字
1697 IOCTL_FCRCV(受信フロー制御)
1698 文字を受信する処理に対して,XON/XOFFによるフロー制御を行う.
1699 すなわち,受信バッファの残り領域が少なくなるとSTOP(コントロー
1700 ル-S)を送出し,残り領域が増えればSTART(コントロール-Q)を送
1703 なお,オープン直後のデフォルトの設定値は(IOCTL_ECHO | IOCTL_CRLF |
1704 IOCTL_FCOUT | IOCTL_FCIN)である.
1706 (6) ER serial_ref_por(ID portid, T_SERIAL_RPOR *pk_rpor)
1708 portidで示されるシリアルポートの状態を参照し,pk_rporで指定されるパケッ
1709 トに返す.パケット中のreacntには受信バッファ中の文字数を,wricntには送
1712 5.3.2 シリアルインタフェースドライバの内部構成
1714 シリアルインタフェースドライバは,前記のサービスコールに加えて,初期化
1715 処理と割込みハンドラで構成される.初期化処理は,カーネルに初期化ルーチ
1716 ンとして登録する.割込みハンドラは,カーネルに割込みハンドラとして登録
1717 する.これらの登録処理はserial.cfgに含まれる.
1719 (1) void serial_initialize(VP_INT exinf)
1721 シリアルインタフェースドライバを初期化する.カーネルに初期化ルーチンと
1726 シリアルI/Oデバイスの種類によって,割込みハンドラの種類や数は異なる.
1727 具体的には,送信割込みと受信割込みが別れているものと別れていないものや,
1728 ポートを複数持つシリアルI/Oデバイスでポート毎に割込みハンドラが別れて
1729 いるものと別れていないものがある.シリアルインタフェースドライバの割込
1730 みハンドラは,カーネルに割込みハンドラとして登録する.
1734 システムログタスクは,カーネル内のログバッファからログ情報を取り出し,
1735 デバイスにアクセスするサービスを用いて外部に出力するタスクである.
1737 JSPカーネルの標準配布キットに含まれるシステムログタスクは,シリアルイ
1738 ンタフェースにログ情報を文字列の形で出力するもので,システムログタスク
1739 の一例という位置付けで提供している.このシステムログタスクは,システム
1740 コンフィギュレーションファイルにlogtask.cfgをインクルードすることで,
1746 サポートライブラリは,アプリケーションやシステムサービスを作成するため
1747 に利用できるライブラリ関数群である.現バージョンでは,システムサービス
1748 やサンプルプログラムで使う最低限の関数しか用意していない.
1750 (1) const char *itron_strerror(ER ercd)
1752 ercd で示されるメインエラーコードに対応するエラーコードの文字列を返す.
1755 (2) void t_perror(const char *file, int line, const char *expr, ER ercd)
1757 エラーメッセージをシステムログサービスに出力する.assertマクロなどで利
1761 7.開発環境・インストール・ポーティング
1765 ソースファイルのディレクトリ構成は次の通り.
1769 systask/ システムサービスソースファイル
1770 library/ サポートライブラリソースファイル
1772 m68k/ M68040 プロセッサ依存ファイル
1773 dve68k/ DVE-68K/40 システム依存ファイル
1774 sh1/ SH1 プロセッサ依存ファイル
1775 kz_sh1/ KZ-SH1-01 システム依存ファイル
1776 zunda_sh1/ ZUNDA/SH1 システム依存ファイル
1777 sh2/ SH2 プロセッサ依存ファイル
1778 apsh2f6a/ APSH2F6A システム依存ファイル
1779 hsb7616it/ HSB7616IT システム依存ファイル
1780 sh3/ SH3 プロセッサ依存ファイル
1781 ms7727cp01/ MS7727CP01 システム依存ファイル
1782 solution_engine/ Solution Engine システム依存ファイル
1783 sh3-ghs/ SH3 プロセッサ依存ファイル(GHS開発環境)
1784 ms7727cp01/ MS7727CP01 システム依存ファイル
1785 solution_engine/ Solution Engine システム依存ファイル
1787 akih8_3048f/ AKI-H8/3048F システム依存ファイル
1788 akih8_3052f/ AKI-H8/3052F システム依存ファイル
1789 akih8_3069f/ AKI-H8/3069F システム依存ファイル
1790 nkev_010h8/ NKEV-010H8 システム依存ファイル
1791 h8-renesas/ H8 プロセッサ依存ファイル(Renesas開発環境)
1792 hsb8f3048bf25/ H8_3048F システム依存ファイル
1793 h8s/ H8S プロセッサ依存ファイル
1794 h8s2350/ H8S_2350 システム依存ファイル
1795 h8s2351/ H8S_2351 システム依存ファイル
1796 armv4/ ARMV4 プロセッサ依存ファイル
1797 integrator/ Integrator システム依存ファイル
1798 az9360mb/ AZ9360MB システム依存ファイル
1799 armv4-ghs/ ARMV4 プロセッサ依存ファイル(GHS開発環境)
1800 integrator/ Integrator システム依存ファイル
1801 microblaze/ MicroBlaze プロセッサ依存ファイル
1802 miref/ MIREF システム依存ファイル
1803 mire_multi/ MIRE_MULTI3000 システム依存ファイル
1804 mutlimedia/ MultiMedia Board システム依存ファイル
1805 suzaku/ Suzaku システム依存ファイル
1806 tms320c54x/ TMS320C54x プロセッサ依存ファイル
1807 c5402dsk/ TMS320VC5402 DSK システム依存ファイル
1808 xstormy16/ Xstormy16 プロセッサ依存ファイル
1809 simulator/ 三洋マイコン開発ツール環境 依存ファイル
1810 mips3/ MIPS3 プロセッサ依存ファイル
1811 vr4131/ VR4131 システム依存ファイル
1812 vr5500/ VR5500 システム依存ファイル
1813 m16c-renesas/ M16C プロセッサ依存ファイル(Renesas開発環境)
1814 oaks16/ OAKS16 システム依存ファイル
1815 oaks16_mini/ OAKS16_MINI システム依存ファイル
1816 m32c-renesas/ M32C プロセッサ依存ファイル(Renesas開発環境)
1817 oaks32/ OAKS32 システム依存ファイル
1818 m32r/ M32R プロセッサ依存ファイル
1819 m3a2131g50/ M3A-2131G50 システム依存ファイル
1820 m3a_za36/ M3A-ZA36 システム依存ファイル
1821 s1c33/ S1C33 プロセッサ依存ファイル
1822 dmt33209/ DMT33209 システム依存ファイル
1823 dmt33401/ DMT33401 システム依存ファイル
1824 luxun2/ LUXUN2 システム依存ファイル
1825 luxun4/ LUXUN4 システム依存ファイル
1826 s1c33-gnu33/ S1C33 プロセッサ依存ファイル(GNU33開発環境)
1827 dmt33209/ DMT33209 システム依存ファイル
1828 dmt33401/ DMT33401 システム依存ファイル
1829 luxun2/ LUXUN2 システム依存ファイル
1830 luxun4/ LUXUN4 システム依存ファイル
1831 powerpc32/ POWERPC32 プロセッサ依存ファイル
1832 ibm_ppc_emb_sample/ The IBM PowerPC Embedded Environment システム依存ファイル
1833 mpc860t/ MPC860T システム依存ファイル
1834 nios2/ NIOS2 プロセッサ依存ファイル
1835 altera_dev_board/ ALTERA_DEV システム依存ファイル
1836 v850/ V850 プロセッサ依存ファイル
1837 tk850_kj1/ TK-850ES システム依存ファイル
1838 tk850_sg2/ TK-850SG2 システム依存ファイル
1839 tlcs900-toshiba/ TLCS900 プロセッサ依存部ファイル
1840 zup_f16_ex/ Zup-F16拡張ボード システム依存ファイル
1841 linux/ Linux上のシミュレーション環境依存ファイル
1842 windows/ Windows上のシミュレーション環境依存ファイル
1844 WINDOWS/ Windows上のサンプルプログラムとプロジェクトファイル
1845 GHS/ GHS(Green Hills Software)開発環境用のファイル
1846 C5402DSK/ TMS320VC5402 DSK用のプロジェクトファイル
1847 H8-RENESAS/ H8-RENESAS用のプロジェクトディレクトリ
1848 M16C-RENESAS/ M16C-RENESAS用のプロジェクトディレクトリ
1849 M32C-RENESAS/ M32C-RENESAS用のプロジェクトディレクトリ
1850 pdic/ PDIC(デバイスドライバのOS非依存部分)
1851 simple_sio/ 簡易SIOドライバ(シリアルドライバが使用するもの)
1854 h8/ H8用ベクターテーブル生成ユーティリティ
1855 h8-renesas/ H8-RENESAS用ベクターテーブル生成ユーティリティ
1856 m16c-renesas/ M16C-RENESAS用ベクターテーブル生成ユーティリティ
1857 sample/ サンプルプログラムと Makefile
1859 windev/ Windowsデバイスマネージャ
1861 ターゲット非依存部(カーネルコンフィギュレータは除く)の各ファイルの概
1864 README TOPPERS/JSPカーネルの簡単な紹介
1865 configure コンフィギュレーションスクリプト
1868 itron.h ITRON仕様共通規定に関連する定義
1869 kernel.h μITRON4.0仕様に関連する定義
1870 kernel_debug.h μITRON4.0仕様 デバッグ用インクルードファイル
1871 sil.h システムインタフェースレイヤ(SIL)
1872 t_stddef.h カーネル・アプリケーション 共通インクルードファイル
1873 t_config.h ターゲット依存情報の定義
1874 t_syslog.h システムログサービス関連の定義
1875 t_services.h アプリケーション用 標準インクルードファイル
1876 s_services.h デバイスドライバ用 標準インクルードファイル
1877 kernel_cfg.h kernel_cfg.c用のインクルードファイル
1878 timer.h システムクロックドライバ関連の定義
1879 serial.h シリアルインタフェースドライバ関連の定義
1880 logtask.h システムログタスク関連の定義
1881 linux_sigio.h Linux用 ノンブロッキングI/Oサポート
1884 Makefile.kernel カーネルのファイル構成の定義
1885 jsp_kernel.h JSPカーネル用 標準インクルードファイル
1886 jsp_rename.def カーネルの内部識別名のリネーム定義
1887 jsp_rename.h カーネルの内部識別名のリネーム
1888 jsp_unrename.h カーネルの内部識別名のリネーム解除
1890 queue.h ダブルリンクキューの構造と操作
1891 startup.c カーネルの初期化処理
1892 banner.c カーネルの起動メッセージの出力
1893 task.h タスク操作ルーチン関連の定義
1895 wait.h 待ち状態操作ルーチン関連の定義
1897 time_event.h タイムイベント管理関連の定義
1898 time_event.c タイムイベント管理
1899 syslog.h システムログ機能関連の定義
1901 task_manage.c タスク管理機能
1902 task_sync.c タスク付属同期機能
1903 task_except.c タスク例外処理機能
1904 semaphore.h セマフォ機能関連の定義
1906 eventflag.h イベントフラグ機能関連の定義
1907 eventflag.c イベントフラグ機能
1908 dataqueue.h データキュー機能関連の定義
1909 dataqueue.c データキュー機能
1910 mailbox.h メールボックス機能関連の定義
1912 mempfix.h 固定長メモリプール関連の定義
1914 time_manage.c システム時刻管理機能
1915 cyclic.h 周期ハンドラ機能関連の定義
1917 sys_manage.c システム管理機能
1918 interrupt.h 割込み管理機能関連の定義
1920 exception.h CPU例外管理機能関連の定義
1921 exception.c CPU例外管理機能
1924 timer.c システムクロックドライバ
1925 timer.cfg システムクロックドライバの設定記述
1926 serial.c シリアルインタフェースドライバ
1927 serial.cfg シリアルインタフェースドライバの設定記述
1929 logtask.cfg システムログタスクの設定記述
1930 linux_sigio.c Linux用 ノンブロッキングI/Oサポート
1931 linux_sigio.cfg Linux用 ノンブロッキングI/Oサポートの設定記述
1932 linux_serial.c Linux用 疑似シリアルドライバ
1933 linux_serial.cfg Linux用 疑似シリアルドライバの設定記述
1934 cxxrt.c C++対応ランタイム本体
1935 cxxrt.cfg C++対応ランタイム用オブジェクト設定
1936 newlibrt.c NEWLIB対応ランタイム
1939 log_output.c システムログ機能用ライブラリ関数(syslog_outputなど)
1940 strerror.c itron_strerror関数
1941 t_perror.c t_perror関数
1946 genoffset offset.h 生成プログラム
1947 gencheck パラメータチェック用ファイルの生成
1948 genrename 内部シンボルリネーム定義の生成
1949 rename 内部シンボルのリネーム処理
1952 Makefile サンプルの Makefile
1953 Makefile.linux サンプルの Makefile(Linux用)
1954 Makefile.mware サンプルの Makefile(ミドルウェアとの組み合わせ用)
1955 sample1.cfg サンプルプログラム(1)の設定記述
1956 sample1.h サンプルプログラム(1)に関する定義
1957 sample1.c サンプルプログラム(1)の本体
1958 cxx_sample1.cfg C++用サンプルプログラム(1)の設定記述
1959 cxx_sample1.h C++用サンプルプログラム(1)に関する定義
1960 cxx_sample1.c C++用サンプルプログラム(1)の本体
1961 cxx_sample2.cfg C++用サンプルプログラム(1)の設定記述
1962 cxx_sample2.h C++用サンプルプログラム(1)に関する定義
1963 cxx_sample2.c C++用サンプルプログラム(1)の本体
1966 user.txt TOPPERS/JSPカーネル ユーザズマニュアル
1967 gnu_install.txt GNU開発環境構築マニュアル
1968 m68k.txt M68040 ターゲット依存部マニュアル
1969 sh1.txt SH1 ターゲット依存部マニュアル
1970 sh2.txt SH2 ターゲット依存部マニュアル
1971 sh3.txt SH3 ターゲット依存部マニュアル
1972 h8.txt H8 ターゲット依存部マニュアル
1973 h8-renesas.txt H8-RENESAS ターゲット依存部マニュアル
1974 h8s.txt H8S ターゲット依存部マニュアル
1975 armv4.txt ARMV4 ターゲット依存部マニュアル
1976 microblaze.txt MicroBlaze ターゲット依存部マニュアル
1977 tsm320c54x.txt TMS320C54x ターゲット依存部マニュアル
1978 xstormy16.txt Xstormy16 ターゲット依存部マニュアル
1979 mips3.txt MIPS3 ターゲット依存部マニュアル
1980 m16c.txt M16C ターゲット依存部マニュアル
1981 m32c.txt M32C ターゲット依存部マニュアル
1982 m32r.txt M32R ターゲット依存部マニュアル
1983 nios2.txt Nios2 ターゲット依存部マニュアル
1984 powerpc32.txt POWERPC32 ターゲット依存部マニュアル
1985 s1c33.txt S1C33 ターゲット依存部マニュアル
1986 v850.txt V850 ターゲット依存部マニュアル
1987 linux.txt Linux シミュレーション環境依存部マニュアル
1988 windows.txt Windows シミュレーション環境依存部マニュアル
1989 config.txt JSPカーネル ターゲット依存部 ポーティングガイド
1990 configurator.txt JSPカーネル コンフィギュレータ仕様
1991 design.txt JSPカーネル 設計メモ
1995 JSPカーネルを用いたシステム構築には,以下のツールが必要である.
1998 標準規格に準拠したCコンパイラ,Cライブラリ
1999 C++コンパイラ,C++ライブラリ,STL
2000 動作確認: GNU C++ 2.95.3,3.2,3.3(Linux環境)
2001 GNU C++ 3.2(Cygwin環境)
2004 GNU Make(動作確認は 3.79.1)
2008 BINUTILS(アセンブラ,リンカなど)
2009 GCC または GCC-CORE(Cコンパイラ)
2013 GNU開発環境をインストール方法については,「GNU開発環境構築マニュアル」
2014 を用意しているので,それを参照するとよい.また,動作確認バージョンにつ
2015 いては,ターゲット毎のマニュアルを参照すること.
2017 ホスト環境用のCコンパイラとCライブラリは,クロス環境用のツールのインス
2018 トールに必要になる.また,C++コンパイラ,C++ライブラリと STL(Standard
2019 Template Library)は,カーネルのコンフィギュレーションツールのコンパイ
2020 ルに必要である.クロス環境用のツールとコンフィギュレーションツールをバ
2021 イナリで入手した場合には,これらのツールは必要ない.
2023 クロス環境用の標準Cライブラリは,アプリケーションが標準Cライブラリを使
2024 用しない場合には,必要ない.ただし,コンパイラが標準Cライブラリ関数
2025 (memcpy,memsetなど)を呼び出すコードを生成する場合があり,その場合に
2026 は標準Cライブラリが必要である.ないしは,生成したコードが呼び出す関数
2029 以下では,これらのツールが用意できていることを前提に,UNIXマシン(動作
2030 確認は Linux)上で構築手順を説明する.また以下の説明では,makeコマンド
2031 が GNU Make であるものとする(JSPカーネルの Makefile は,GNU Make の拡
2034 7.3 コンフィギュレーションツールの構築
2036 カーネルを構築する前に,まず,コンフィギュレーションツールをコンパイル
2037 する必要がある(コンフィギュレーションツールをバイナリで入手した場合に
2040 JSPカーネルのコンフィギュレーションツールは,コンフィギュレータ(cfgプ
2041 ログラム)とパラメータチェックプログラム(chkプログラム)から構成され
2042 る.コンフィギュレーションツールの使い方については,「7.9 コンフィギュ
2043 レーションツールの使い方」を参照すること.
2045 コンフィギュレーションツール(cfgプログラムとchkプログラム)は,cfgディ
2046 レクトリに移動し,make dependで依存関係ファイル(Makefile.depend)を生
2047 成した後,makeコマンドにより生成される.
2055 次に,サンプルプログラムを構築する方法を説明する.
2057 まず,サンプルプログラムのオブジェクトファイルを置くディレクトリを作成
2058 し,コンフィギュレーションスクリプトを実行する.例えば,オブジェクトファ
2059 イルを置くディレクトリを,JSPカーネルのソースファイルを展開したディレ
2060 クトリの下のOBJという名称のディレクトリにする場合には,次のコマンドを
2061 実行する(ディレクトリの場所は名称は任意に決めてよい).
2065 % perl ../configure -C m68k -S dve68k
2067 ここで,m68kはターゲットプロセッサ名,dve68kはターゲットシステム名であ
2068 る.これらのコンフィギュレーションスクリプトのオプションについては,次
2071 コンフィギュレーションスクリプトの実行により,カレントディレクトリには,
2072 サンプルプログラムを構築するためのMakefile,サンプルプログラム用のコン
2073 フィギュレーションファイル(sample1.cfg),サンプルプログラム本体
2074 (sample1.hおよびsample1.c)が生成される.
2076 コンフィギュレーションスクリプトの実行後,必要であればMakefileを修正す
2077 る.Makefileの修正方法については,「7.7 Makefileの修正」を参照すること.
2079 その後,make dependで依存関係ファイル(Makefile.depend)を生成した後,
2080 makeコマンドによりサンプルプログラムのロードモジュール(jspまたは
2081 jsp.exe)が生成できる.依存関係ファイルの生成には若干時間がかかる.
2086 ここで構築したサンプルプログラム(sample1.h,sample1.c,sample1.cfg)
2087 は,JSPカーネルの基本的な動作を確認するためのものである.このプログラ
2088 ムの概要説明は,sample1.cの先頭のコメントにある.
2090 7.5 アプリケーションとカーネルを別々に構築する方法
2092 前節で説明した方法では,アプリケーションとカーネルを同時に生成するため,
2093 オブジェクトファイルを置くディレクトリに非常に多くのファイルが作成され
2094 て,扱いにくくなる.そこで,カーネルを修正する頻度が低い場合には,カー
2095 ネルは事前に構築しておき,後でアプリケーションだけを構築する方法を用意
2096 している.以下では,サンプルプログラムを構築を例に,その手順について説
2099 まず,カーネルを構築するディレクトリを作成し,コンフィギュレーションス
2100 クリプトを実行する.例えば,カーネルを構築するディレクトリを,JSPカー
2101 ネルのソースファイルを展開したディレクトリの下のkernel_libという名称の
2102 ディレクトリにする場合には,次のコマンドを実行する(ディレクトリの場所
2107 % perl ../configure -C m68k -S dve68k
2109 これにより,カーネルを構築するディレクトリに,Makefile,sample1.cfg,
2110 sample1.h,sample1.cが生成されるが,Makefile以外は使用しない.
2112 make dependで依存関係ファイル(Makefile.depend)を生成した後,make
2113 libkernel.aによりカーネルライブラリ(libkernel.a)が生成できる.
2118 次に,アプリケーションを構築するディレクトリを作成し,コンフィギュレー
2119 ションスクリプトを実行する.例えば,アプリケーションを構築するディレク
2120 トリを,JSPカーネルのソースファイルを展開したディレクトリの下のAPLとい
2121 う名称のディレクトリにする場合には,次のコマンドを実行する(ディレクト
2127 % perl ../configure -C m68k -S dve68k -L ../kernel_lib
2129 ここで-Lオプションには,カーネルを構築したディレクトリのパスを指定する.
2131 最後に,make dependで依存関係ファイル(Makefile.depend)を生成した後,
2132 makeコマンドによりサンプルプログラムのロードモジュール(jspまたは
2138 この手順では,アプリケーション構築時にはカーネルの再構築が必要かチェッ
2139 クしないため,カーネルのソースコードを修正した場合には,カーネルを構築
2140 したディレクトリでmake libkernel.aを再実行する必要がある.また,アプリ
2141 ケーション構築時にカーネルライブラリが更新されたかチェックしないため,
2142 アプリケーションを構築したディレクトリで,ロードモジュールを削除した後
2145 以上では,カーネルとアプリケーションを別々のディレクトリで構築したが,
2146 -Lオプションにカレントディレクトリ(".")を指定することで,同じディレ
2147 クトリで(別々に)構築することもできる.具体的には,次の手順となる.
2151 % perl ../configure -C m68k -S dve68k -L .
2157 ここで,make cleankernelは,カーネルライブラリを生成するための中間ファ
2158 イルを削除するものである.この手順では,make dependによりカーネルライ
2159 ブラリに関する依存関係を生成しないため,カーネルのソースコードを修正し
2160 た場合には,必ずmake cleankernel(または,make clean)してから,make
2161 libkernel.aする必要があるので注意すること.さらに,ロードモジュールを
2162 削除した後にmakeを再実行する必要があるのは,前の場合と同様である.
2164 7.6 コンフィギュレーションスクリプトの使い方
2166 コンフィギュレーションスクリプトは,JSPカーネルおよびアプリケーション
2167 プログラムを構築するために必要な基本的なコンフィギュレーションを行うた
2168 めのプログラムである.JSPカーネルを用いてアプリケーションを作成する場
2169 合には,まずオブジェクトファイルを置くディレクトリを作成し,そのディレ
2170 クトリでコンフィギュレーションスクリプトを実行する.オブジェクトファイ
2171 ルを置くディレクトリの場所や名称は,任意に決めてよい.
2173 コンフィギュレーションスクリプトに対するオプションは次の通り.
2176 ターゲットプロセッサ名またはシミュレーション環境名を,configディ
2177 レクトリの下のディレクトリ名称で指定する(必須).
2180 ターゲットシステム名を,configの下のプロセッサのディレクトリの
2181 下のディレクトリ名称で指定する.シミュレーション環境の場合には,
2185 開発環境名を,configの下のディレクトリ名称の後半の名称で指定す
2186 る.GNU開発環境を用いる場合には,指定する必要がない.
2189 アプリケーションプログラムの名称を指定する.省略した場合には,
2190 標準のサンプルプログラム(sample1)となる.
2193 アプリケーションプログラムのメインのオブジェクトファイル(-A
2194 で指定したアプリケーションプログラム名に".o"を付加したもの)以
2195 外に,リンクすべきオブジェクトファイルの名称を,".o"を付加した
2196 形で指定する.""で囲むことによって,複数のファイルを指定するこ
2197 とも可能である(-U オプションを複数使ってはならない).
2199 -L <カーネルライブラリのディレクトリ名>
2200 事前に構築したカーネルを用いて,アプリケーションのみを構築する
2201 場合には,このオプションにカーネルライブラリ(libkernel.a)の
2202 置かれたディレクトリ名を指定する.このオプションの使用方法につ
2203 いては,「7.5 アプリケーションとカーネルを別々に構築する方法」
2206 -D <JSPカーネルソースディレクトリ名>
2207 JSPカーネルのソースコードを置いたディレクトリ名を指定する.省
2208 略した場合には,configureの置かれているディレクトリとなる.
2210 コンフィギュレーションスクリプトが行う処理は次の通りである.
2214 sampleディレクトリから適切なMakefileを選択し,必要な箇所を書き換えて,
2219 指定したアプリケーションプログラムがsampleディレクトリにある場合,適切
2220 なサンプルプログラムのソースファイルを選択し,必要な箇所を書き換えて,
2221 サンプルプログラムのソースファイル(例えば,sample1.h,sample1.c,
2226 JSPカーネルの実行環境によっては,コンフィギュレーションスクリプトが生
2227 成したMakefileを修正することが必要になる.ここでは,Makefileの中で,修
2228 正が必要となる可能性の高い箇所について説明する.
2230 なお,Makefileを修正した後にコンフィギュレーションスクリプトを再実行す
2231 ると,修正したMakefileが上書きされてしまうので注意すること(古いものが
2232 Makefile.bakに保存される).
2236 CPUはターゲットプロセッサ名,SYSはターゲットシステム名,TOOLは開発環境
2237 名に定義する.これらの定義は,コンフィギュレーションスクリプトが行う.
2239 (B) オブジェクトファイルの拡張子の設定
2241 Cygwin環境でコンパイルする時には,OBJEXTを"exe"に定義する必要がある.
2242 これは,Cygwin環境では,オブジェクトプログラムに拡張子"exe"が付加され
2243 るのに対応するためのものである.Cygwin環境であることを判定できれば,コ
2244 ンフィギュレーションスクリプトがこの定義を行う.
2246 (C) 実行環境の定義(ターゲット依存)
2248 ターゲットによっては,実行環境に対応してターゲット依存部のコードを差し
2249 換える場合がある.これを可能にするために,実行環境の名称をDBGENVに定義
2250 している.標準では,GDBスタブを用いることを想定して,これをGNU_STUBに
2251 定義しているが,ターゲット依存の定義を入れたMakefile.configで上書きさ
2252 れる場合もある.どのターゲットがどの実行環境に対応しているかは,ターゲッ
2255 (D) カーネルライブラリのディレクトリ名の定義
2257 KERNEL_LIBには,カーネルライブラリの置かれたディレクトリ名を定義する.
2258 この定義は,通常はコンフィギュレーションスクリプトが行うが,事後に
2259 KERNEL_LIBの定義を変更してもかまわない.
2263 全体に共通するコンパイルオプションの追加が必要な場合には,下の変数の定
2264 義を変更する.そのコンパイルオプションが,特定のターゲットで常に必要な
2265 場合には,ターゲット依存の定義を入れたMakefile.configを修正すべきであ
2266 る.追加の可能性のあるコンパイルオプションについては,「7.8 コンパイル
2269 CDEFS -D オプションを記述する.
2270 INCLUDES -I オプションを記述する.
2271 COPTS コンパイラに対するその他のオプションを記述する.
2272 LDFLAGS リンカに対するオプションを記述する.
2273 LIBS ライブラリリンクのためのオプションを記述する.
2275 (F) アプリケーションプログラムに関する定義
2277 アプリケーションプログラムが一つのCソースファイル(*.c)のみで構成され
2278 ている場合には,UNAMEにそのファイル名を定義すればよい.アプリケーショ
2279 ンプログラムが複数のソースファイルで構成される場合には,UNAMEにそのア
2280 プリケーション名を定義し,オブジェクトファイル名をUTASK_ASMOBJSおよび
2281 UTASK_COBJSに列挙する.いずれの場合にも,コンフィギュレーションファイ
2282 ルは,UNAMEに定義した名前に拡張子"cfg"を付加した名前とする.
2284 ソースファイルをコンパイルするのとは別のディレクトリに置く場合には,
2285 UTASK_DIRSにそのディレクトリを追加する.また,アプリケーションのコンパ
2286 イルに必要なコンパイルオプションや,アプリケーションがライブラリを必要
2287 とする場合には,UTASK_CFLAGSおよびUTASK_LIBS に定義する.
2291 オブジェクトファイル名をOBJNAMEに定義する.デフォルトはjspである.
2295 ロードモジュールの形式を指定する.具体的には,ELF形式の時は$(OBJFILE)
2296 または$(OBJNAME).out(PARTNER-J環境の時),バイナリ形式の時は
2297 $(OBJNAME).bin,モトローラ S形式の時は$(OBJNAME).srecを指定する.
2298 $(OBJFILE) は,Cygwin環境でOBJEXTを"exe"に定義した時には$(OBJNAME).exe,
2299 そうでない場合には$(OBJNAME)となる.
2301 (I) カーネルのコンフィギュレーションファイルの生成
2303 ソフトウェア部品のコンフィギュレータを追加する場合には,この規則を修正
2308 JSPカーネルのコード中には,assertマクロが使われている.assertマクロは,
2309 NDEBUGを定義することで,オブジェクトコード中から消すことができる.カー
2310 ネルのデバッグが終了すれば,CDEFSに-DNDEBUGを指定してコンパイルした方
2313 また,システムログ機能を取り外すためのOMIT_SYSLOGを用意している.詳し
2314 くは,「4.8 システムログ機能の設定方法」を参照すること.
2316 7.9 コンフィギュレーションツールの使い方
2318 以下では,cfgプログラムとchkプログラムのオプションについて説明する.こ
2319 れらのプログラムによるコンフィギュレーション手順については,「2.10 静
2320 的APIとコンフィギュレータ」を参照すること.
2322 cfgプログラムとchkプログラムに共通のオプションは次の通り.
2337 メッセージを英語で表示する(デフォルト).
2342 cfgプログラムに対するオプションは次の通り.
2344 -s, --source <ファイル名>
2345 <ファイル名>で指定されたシステムコンフィギュレーションファイル
2346 (C言語のプリプロセッサで処理したもの)を読み込む.<ファイル名>
2347 を省略した場合は,システムコンフィギュレーションファイルを標準
2348 入力から読み込む(オプション自身を省略してはならない).
2351 静的APIのパラメータチェックに用いるファイルをkernel_chk.cに生
2354 -obj, --dump-object <ファイル名>
2355 静的APIの解析内容を含むオブジェクト定義ファイルを,<ファイル名>
2356 で指定されたファイルに生成する.<ファイル名>を省略した場合は,
2357 kernel_obj.datに生成する.
2360 __EMTPY_LABELマクロの使用を抑止する.
2363 IDの割付順序を指定する.xxxに指定できる内容は次の通り.
2365 alphabetic 名称の昇順(Aに近いものほど小さな値)
2366 fcfs 定義順の昇順 (先に宣言したものほど小さな値)
2367 alphabetic,reverse 名称の降順
2371 自動ID割付け結果ヘッダファイル(kernel_id.h)の名称を変更する.
2374 カーネル構成ファイル(kernel_cfg.c)の名称を変更する.
2377 ハンドラやタスク本体などの関数のプロトタイプ宣言をカーネル構成
2378 ファイル(kernel_cfg.c)に出力する.
2381 カーネル関連のヘッダをインクルードする際に,"ファイル名" ではなく
2385 TOPPERS/JSPカーネル Release 1.3互換の形式で生成する.
2386 (注意: -1.3で生成したファイルは1.4以降では使用できない)
2389 カーネルコンフィギュレータが処理できない静的APIを無視する.
2392 カーネルコンフィギュレータが処理できない静的APIを標準出力に出力
2398 chkプログラムに対するオプションは次の通り.
2400 -m, --module <モジュール記述>
2401 チェックするロードモジュールを指定する.標準のchkプログラムは,
2402 ロードモジュールのシンボルファイル(GNU BINUTILSのnmが出力する
2403 形式)とモトローラSレコードファイルを読み込んでパラメータチェッ
2404 クを行なう.この場合,<モジュール記述>には,シンボルファイルと
2405 Sレコードファイルの2つを","で区切って指定する.
2407 -cs, --script <ファイル名>
2408 <ファイル名>で指定されたチェックファイルを用いてチェックする.
2409 チェックファイルとは,cfgプログラムが生成したkernel_chk.cを,
2410 コンパイラおよび utils/gencheck により加工したファイルのことで
2411 ある.このオプションを省略した場合,いくつかのチェックが行われ
2412 なくなる.オプションを指定した場合には,<ファイル名>は省略でき
2415 -obj, --load-object <ファイル名>
2416 静的APIの解析内容を含むオブジェクト定義ファイルを,<ファイル名>
2417 で指定されたファイルから読み込む.<ファイル名>を省略した場合は,
2418 kernel_obj.datから読み込む.
2421 エラー検出レベルを変更する.レベルはLAZY(重大なエラーのみ検
2422 出),STANDARD(ITRON仕様の範囲のみで検出),TOPPERS(JSPカー
2423 ネルの制限違反まで検出),RESTRICTED(すべてのエラーを検出)の
2424 4種類のうちから選択する(デフォルトはRESTRICTED).
2428 JSPカーネルのリンク方法は,ターゲット依存のリンカスクリプト(*.ld)に
2429 記述されている.サンプルプログラムの Makefile では,ターゲット依存の定
2430 義を入れた Makefile.config の中で LDSCRIPT を定義すると,定義した名前
2433 JSPカーネル動作時には,以下のメモリ領域が必要になる.
2437 カーネルおよびアプリケーションのプログラムおよび定数データが置かれる領
2438 域.ROM上に置くことも可能である.先頭アドレスを,カーネルをリンクする
2439 際の -Ttext オプションで指定する.サンプルプログラムの Makefile では,
2440 ターゲット依存の定義を入れた Makefile.config の中で TEXT_START_ADDRESS
2441 を定義すると,リンク時に -Ttext オプションが付加される.
2445 カーネルおよびアプリケーションの使用するデータ領域.固定的なデータ領域
2446 と,sbrk関数によって取られるヒープ領域からなる.カーネルはヒープ領域を
2447 使用しない.先頭アドレスを,カーネルをリンクする際の -Tdata オプション
2448 で指定する.サンプルプログラムの Makefile では,ターゲット依存の定義を
2449 入れた Makefile.config の中で DATA_START_ADDRESS を定義すると,リンク
2450 時に -Tdata オプションが付加される.
2452 (c) 非タスクコンテキスト用のスタック領域
2454 割込みハンドラなどの非タスクコンテキストが使用するスタック領域.領域の
2455 設定方法はターゲット依存であるが,通常は,ターゲットシステム依存のイン
2456 クルードファイル(sys_config.h)でスタックの初期値を定義し,ターゲット
2457 プロセッサ依存のスタートアップモジュール(start.S)中で初期化される.
2459 7.11 他のターゲットへのポーティング
2461 JSPカーネルを他のターゲットへポーティングするために必要な作業は,カー
2462 ネル自身のポーティング,システムサービスのポーティング,開発環境の構築
2463 と標準の開発環境との差異の吸収などからなる.詳しくは,「JSPカーネル タ
2464 ーゲット依存部 ポーティングガイド」(config.txt)を参照すること.
2466 7.12 カーネルの内部識別子のリネーム
2468 μITRON4.0仕様は,カーネルの内部識別子を_kernel_または_KERNEL_で始める
2469 ことを要求している.ところが,カーネルのソースコード中で直接このような
2470 識別子を用いると,識別子の長さが長くなり,可読性を損なう.そこでJSPカー
2471 ネルでは,xxxxxというカーネルの内部識別子を_kernel_xxxxxにリネームする
2474 ところが,この仕組みにより,デバッグ作業が非効率になるケースが考えられ
2475 る.具体的には,ソースコード中の識別子がオブジェクトコード中の識別子と
2476 一致しないために,ソースコード中の変数を指定してその値を読んだり,関数
2477 を指定してそこにブレークポイントを置くといったことができない.
2479 この問題を解決するために,JSPカーネルでは,ソースコード中の必要な識別
2480 子をリネームするためのユーティリティ(utils/rename)を用意している.
2481 renameユーティリティに,リネーム定義ファイル(xxx_rename.def)のプリ
2482 フィックス(xxxの部分)と,リネームしたいファイルリストを与えると,リ
2483 ネーム処理を行なう.例えば,kernelディレクトリのすべてのファイルに対し
2484 て,カーネルの内部識別名をリネームするには,次のコマンドを用いればよい.
2487 % ../utils/rename jsp *
2494 TOPPERSプロジェクトおよびJSPカーネルのためのウェブサイトを,以下のURL
2497 http://www.toppers.jp/
2499 配付キットの最新版は,このウェブサイトからダウンロードすることができる.
2500 また,後述のメーリングリストのアーカイブなども,このウェブサイトで閲覧
2505 JSPカーネルの利用条件は,各ファイルの先頭に明示されている(このドキュ
2506 メントの先頭にもついている).著作権は,各ファイルの先頭に表示されてい
2509 利用条件の (3) の (b) において,利用の形態をTOPPERSプロジェクトに報告
2510 する方法としては,JSPカーネルを利用した製品の名称と応用分野,製品化し
2511 た会社名と業種等の情報を,以下のURLのページから報告するものとする.
2513 http://www.toppers.jp/report.html
2515 またその際に,JSPカーネルを使用してのコメントやご意見もいただけると幸
2520 JSPカーネルは無保証で提供されているものである.開発者は,その適用可能
2521 性も含めて,いかなる保証も行わない.また,サポートの約束もしていない.
2522 質問がある場合は,後述のメーリングリストを利用していただけると幸いであ
2527 JSPカーネルのユーザに対する情報提供およびユーザ相互間の情報交換を容易
2528 にするために,TOPPERSユーザズメーリングリストを用意している.このメー
2529 リングリストには,誰でも自由にメールを送付することができる.また,送付
2530 されたメールは,誰でも自由にウェブサイトで読むことができる.JSPカーネ
2531 ルにバグや問題点を発見した場合には,このメーリングリストに報告して欲し
2534 メーリングリストへのメールの送付先は次の通り.
2538 メーリングリストにバグや問題点などを報告する場合には,必要に応じて,次
2546 ・OSのバージョン(サービスパックの適用状況も)
2547 ・コンパイラなどの開発環境のバージョン(Cygwinのバージョンも)
2549 このメーリングリストへの登録を希望する場合は,まず,
2550 users-ctl@toppers.jp 宛てに,本文に
2553 例: subscribe Hiroaki Takada
2555 と書いたメールを送付する(上記のコマンド中には半角英文字のみを使うこと).
2556 折り返し,登録確認のためのメールが送られてくるので,その指示に従って登
2559 8.5 TOPPERSプロジェクトへの参加
2561 TOPPERSプロジェクトでは,何からの形でプロジェクトに貢献されたい方,プ
2562 ロジェクトで開発したソフトウェアをお使いの方,プロジェクトに興味をお持
2563 ちの方の参加を求めている.TOPPERSプロジェクトへの参加方法については,
2564 TOPPERSプロジェクトのウェブサイトを参照すること.
2566 8.6 ミドルウェア用の Makefile
2568 サンプルディレクトリにある Makefilew.mware はJSPカーネルにミドルウェア
2569 を組み合わせてコンパイルするための Makefile である.この Makefile から
2570 インクルードするミドルウェア用の Makefile では,以下の変数を定義するこ
2574 ミドルウェアのコンフィギュレーションファイル(ソース)を追加する.
2576 (2) MTASK_KERNEL_CFG
2577 ミドルウェアのコンフィギュレータから出力され,JSPカーネル のシステムコ
2578 ンフィギュレーションファイルにインクルードされるファイルを追加する.
2584 ミドルウェアをライブラリ化するソースファイルを追加する.
2587 ミドルウェアのアセンブリ言語のオブジェクトファイルを追加する.
2590 ミドルウェアの C++ 言語のオブジェクトファイルを追加する.
2593 ミドルウェアの C 言語のオブジェクトファイルを追加する.
2596 ミドルウェアをコンパイルするときのオプションを指定する.
2602 ライブラリ化したミドルウェアを指定する.
2610 ER ercd = act_tsk(ID tskid);
2611 ER ercd = iact_tsk(ID tskid);
2612 ER_UINT actcnt = can_act(ID tskid);
2614 ER ercd = ter_tsk(ID tskid);
2615 ER ercd = chg_pri(ID tskid, PRI tskpri);
2616 ER ercd = get_pri(ID tskid, PRI *p_tskpri);
2620 ER ercd = slp_tsk();
2621 ER ercd = tslp_tsk(TMO tmout);
2622 ER ercd = wup_tsk(ID tskid);
2623 ER ercd = iwup_tsk(ID tskid);
2624 ER_UINT wupcnt = can_wup(ID tskid);
2625 ER ercd = rel_wai(ID tskid);
2626 ER ercd = irel_wai(ID tskid);
2627 ER ercd = sus_tsk(ID tskid);
2628 ER ercd = rsm_tsk(ID tskid);
2629 ER ercd = frsm_tsk(ID tskid);
2630 ER ercd = dly_tsk(RELTIM dlytim);
2634 ER ercd = ras_tex(ID tskid, TEXPTN rasptn);
2635 ER ercd = iras_tex(ID tskid, TEXPTN rasptn);
2636 ER ercd = dis_tex();
2637 ER ercd = ena_tex();
2638 BOOL state = sns_tex();
2642 ER ercd = sig_sem(ID semid);
2643 ER ercd = isig_sem(ID semid);
2644 ER ercd = wai_sem(ID semid);
2645 ER ercd = pol_sem(ID semid);
2646 ER ercd = twai_sem(ID semid, TMO tmout);
2648 ER ercd = set_flg(ID flgid, FLGPTN setptn);
2649 ER ercd = iset_flg(ID flgid, FLGPTN setptn);
2650 ER ercd = clr_flg(ID flgid, FLGPTN clrptn);
2651 ER ercd = wai_flg(ID flgid, FLGPTN waiptn,
2652 MODE wfmode, FLGPTN *p_flgptn);
2653 ER ercd = pol_flg(ID flgid, FLGPTN waiptn,
2654 MODE wfmode, FLGPTN *p_flgptn);
2655 ER ercd = twai_flg(ID flgid, FLGPTN waiptn,
2656 MODE wfmode, FLGPTN *p_flgptn, TMO tmout);
2658 ER ercd = snd_dtq(ID dtqid, VP_INT data);
2659 ER ercd = psnd_dtq(ID dtqid, VP_INT data);
2660 ER ercd = ipsnd_dtq(ID dtqid, VP_INT data);
2661 ER ercd = tsnd_dtq(ID dtqid, VP_INT data, TMO tmout);
2662 ER ercd = fsnd_dtq(ID dtqid, VP_INT data);
2663 ER ercd = ifsnd_dtq(ID dtqid, VP_INT data);
2664 ER ercd = rcv_dtq(ID dtqid, VP_INT *p_data);
2665 ER ercd = prcv_dtq(ID dtqid, VP_INT *p_data);
2666 ER ercd = trcv_dtq(ID dtqid, VP_INT *p_data, TMO tmout);
2668 ER ercd = snd_mbx(ID mbxid, T_MSG *pk_msg);
2669 ER ercd = rcv_mbx(ID mbxid, T_MSG **ppk_msg);
2670 ER ercd = prcv_mbx(ID mbxid, T_MSG **ppk_msg);
2671 ER ercd = trcv_mbx(ID mbxid, T_MSG **ppk_msg, TMO tmout);
2675 ER ercd = get_mpf(ID mpfid, VP *p_blk);
2676 ER ercd = pget_mpf(ID mpfid, VP *p_blk);
2677 ER ercd = tget_mpf(ID mpfid, VP *p_blk, TMO tmout);
2678 ER ercd = rel_mpf(ID mpfid, VP blk);
2682 ER ercd = set_tim(const SYSTIM *p_systim);
2683 ER ercd = get_tim(SYSTIM *p_systim);
2684 ER ercd = isig_tim();
2686 ER ercd = sta_cyc(ID cycid);
2687 ER ercd = stp_cyc(ID cycid);
2691 ER ercd = rot_rdq(PRI tskpri);
2692 ER ercd = irot_rdq(PRI tskpri);
2693 ER ercd = get_tid(ID *p_tskid);
2694 ER ercd = iget_tid(ID *p_tskid);
2695 ER ercd = loc_cpu();
2696 ER ercd = iloc_cpu();
2697 ER ercd = unl_cpu();
2698 ER ercd = iunl_cpu();
2699 ER ercd = dis_dsp();
2700 ER ercd = ena_dsp();
2701 BOOL state = sns_ctx();
2702 BOOL state = sns_loc();
2703 BOOL state = sns_dsp();
2704 BOOL state = sns_dpn();
2705 BOOL state = vsns_ini();
2709 ER ercd = dis_int(INTNO intno);
2710 ER ercd = ena_int(INTNO intno);
2711 ER ercd = chg_ixx(IXXXX ixxxx);
2712 ER ercd = get_ixx(IXXXX *p_ixxxx);
2713 ※ xx,xxxx,XXXX はターゲット毎に定められる.
2715 (9) CPU例外発生時のシステム状態参照
2717 BOOL state = vxsns_ctx(VP p_excinf);
2718 BOOL state = vxsns_loc(VP p_excinf);
2719 BOOL state = vxsns_dsp(VP p_excinf);
2720 BOOL state = vxsns_dpn(VP p_excinf);
2721 BOOL state = vxsns_tex(VP p_excinf);
2723 (10) 性能評価用システム時刻参照機能
2725 ER ercd = vxget_tim(SYSUTIM *p_sysutim);
2729 CRE_TSK(tskid, { ATR tskatr, VP_INT exinf, FP task,
2730 PRI itskpri, SIZE stksz, VP stk });
2731 DEF_TEX(ID tskid, { ATR texatr, FP texrtn });
2732 CRE_SEM(ID semid, { ATR sematr, UINT isemcnt, UINT maxsem });
2733 CRE_FLG(ID flgid, { ATR flgatr, FLGPTN iflgptn });
2734 CRE_DTQ(ID dtqid, { ATR dtqatr, UINT dtqcnt, VP dtq });
2735 CRE_MBX(ID mbxid, { ATR mbxatr, PRI maxmpri, VP mprihd });
2736 CRE_MPF (ID mpfid, { ATR mpfatr, UINT blkcnt, UINT blksz, VP mpf } ) ;
2737 CRE_CYC (ID cycid, { ATR cycatr, VP_INT exinf, FP cychdr,
2738 RELTIM cyctim, RELTIM cycphs } ) ;
2739 DEF_INH(INHNO inhno, { ATR inhatr, FP inthdr });
2740 DEF_EXC(EXCNO excno, { ATR excatr, FP exchdr });
2741 ATT_INI({ ATR iniatr, VP_INT exinf, FP inirtn });
2742 VATT_TER({ ATR teratr, VP_INT exinf, FP terrtn });
2744 9.3 メインエラーコード一覧(JSPカーネルが返すもののみ)
2749 E_ILUSE -28 サービスコール不正使用
2750 E_OBJ -41 オブジェクト状態エラー
2751 E_QOVR -43 キューイングオーバーフロー
2752 E_RLWAI -49 待ち状態の強制解除
2753 E_TMOUT -50 ポーリング失敗またはタイムアウト
2757 2000年11月15日 Release 1.0 最初のリリース
2758 2000年11月24日 Release 1.0 (PL=1) 問題点の修正
2759 2001年2月24日 Release 1.1 V850の追加など
2760 2001年5月9日 Release 1.1 (PL=1) SH1の追加など
2761 2001年11月15日 Release 1.2 SH4,H8,ARM7TDMIの追加など
2762 2002年4月15日 Release 1.3 M32R,MicroBlaze,TMS320C54x,
2764 2003年12月25日 Release 1.4 多数の改良
2765 2004年10月14日 Release 1.4 (PL=1) SH2,M16C,SC33,PowerPC32,
2767 2005年11月28日 Release 1.4 (PL=2) M32C-Renesas, H8-Renesas,
2769 2007年6月1日 Release 1.4 (PL=3) 問題点の修正,東芝TLCS900の追加など