OSDN Git Service

Change the directry name to hirado
[trx-305dsp/dsp.git] / hirado / kernel / doc / user.txt
1
2             = TOPPERS/JSPカーネル ユーザズマニュアル =
3
4             (Release 1.4.3対応,最終更新: 23-Apr-2007)
5
6 ※ このユーザズマニュアルは,μITRON4.0仕様書(Ver. 4.02.00)の内容を
7 前提に記述してあります.μITRON4.0仕様書は,以下のURLからダウンロード
8 することができます.
9         http://www.ertl.jp/ITRON/SPEC/mitron4-j.html
10
11 ----------------------------------------------------------------------
12  TOPPERS/JSP Kernel
13      Toyohashi Open Platform for Embedded Real-Time Systems/
14      Just Standard Profile Kernel
15
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
20
21  上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation 
22  によって公表されている GNU General Public License の Version 2 に記
23  述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア
24  を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下,
25  利用と呼ぶ)することを無償で許諾する.
26  (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
27      権表示,この利用条件および下記の無保証規定が,そのままの形でソー
28      スコード中に含まれていること.
29  (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
30      用できる形で再配布する場合には,再配布に伴うドキュメント(利用
31      者マニュアルなど)に,上記の著作権表示,この利用条件および下記
32      の無保証規定を掲載すること.
33  (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
34      用できない形で再配布する場合には,次のいずれかの条件を満たすこ
35      と.
36    (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
37        作権表示,この利用条件および下記の無保証規定を掲載すること.
38    (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
39        報告すること.
40  (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
41      害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
42
43  本ソフトウェアは,無保証で提供されているものである.上記著作権者お
44  よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も
45  含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直
46  接的または間接的に生じたいかなる損害に関しても,その責任を負わない.
47
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は,特定の商品ないしは商品群を指す名称で
58    はありません.
59  * TOPPERS は "Toyohashi OPen Platform for Embedded Real-time Systems" 
60    の略称,JSP は "Just Standard Profile" の略称です.
61  * 本マニュアル中の商品名は,各社の商標または登録商標です.
62 ----------------------------------------------------------------------
63
64
65 1.TOPPERS/JSPカーネルの概要
66
67 TOPPERS/JSPカーネル(以下,単にJSPカーネルと書く)は,TOPPERSプロジェ
68 クトにおいて開発したμITRON4.0仕様に準拠したリアルタイムカーネルである.
69 JSP(Just Standard Profile)の名前が示す通り,μITRON4.0仕様のスタンダ
70 ードプロファイル規定に従って実装されている.
71
72 1.1 ターゲットプロセッサ/ターゲットシステム
73
74 JSPカーネルは,現時点で,以下のターゲットプロセッサ/ターゲットシステ
75 ムをサポートしている.
76
77     ディレクトリ名          開発環境
78         プロセッサ(型番)      システム(メーカ名)
79
80     m68k                    GNU開発環境
81         M68040(MC68LC040)     DVE-68K/40(電産)
82
83     sh1                     GNU開発環境
84         SH1(SH7032)           KZ-SH1-01(京都マイクロコンピュータ)
85                                 ※ RISC評価キットSH-1(CQ出版)でも動作
86         SH1(SH7034)           μITRON搭載SH1CPUボード((株)中央製作所)
87         
88
89     sh2                     GNU開発環境
90         SH2(SH7145)             AP_SH2F_6A(アルファプロジェクト)
91         SH2(SH7615)             HSB7615IT (北斗電子)
92
93     sh3                     GNU開発環境
94         SH3(SH7709A)          MS7709ASE01 (日立超LSIシステムズ)
95         SH3(SH7729R)          MS7729RSE01 (日立超LSIシステムズ)
96         SH3(SH7727)           MS7727CP01  (日立超LSIシステムズ)
97         SH4(SH7750)           MS7750SE01  (日立超LSIシステムズ)
98
99     sh3-ghs                 GHS開発環境
100         SH3(SH7709A)          MS7709ASE01 (日立超LSIシステムズ)
101         SH3(SH7727)           MS7727CP01  (日立超LSIシステムズ)
102
103     h8                      GNU開発環境
104         H8(H8/3052F)          AKI-H8/3052F(秋月電子通商)
105         H8(H8/3069F)          AKI-H8/3069F(秋月電子通商)
106
107     h8-renesas              Renesas社の開発環境
108         H8(HSB8F3048BF25)       H8/3048F-ONEスタータキット((株)北斗電子)
109
110     h8s-renesas              Renesas社の開発環境
111         H8S(H8S/2339F)          MiNET-H8S/2339F(株式会社ミスポ製)
112
113     armv4                   GNU開発環境
114         ARM9(ARM922T)         Integrator/AP+CM922T(ARM)
115         ARM9(ARM926EJ-S)      AZ9360MB(YDK)
116
117     armv4-ghs               GHS開発環境
118         ARM9 (ARM920T)        Integrator/AP+CM920T(ARM)
119         ARM9E(ARM966E-S)      Integrator/AP+CM966E-S(ARM)
120
121     m32r                    GNU開発環境
122         M32R(M32102S6FP)      M3A-2131G50(三菱電機)
123         M32R(M32102S6FP)      M3A-ZA36   (三菱電機)
124
125     m32c-renesas            Renesas社の開発環境
126         M32C                    OAKS32(オークス電子)
127
128     microblaze              GNU開発環境
129         MicroBlaze              MIREF(YDK)
130         MicroBlaze              MIRE_MULTI3000(YDK)
131         MicroBlaze              MultiMedia Board(Xilinx)
132         MicroBlaze              Suzaku(アットマークテクノ)
133
134     tms320c54x              TI社の開発環境
135         TMS320C54x(TSM320C5402)TMS320VC5402 DSK(TI)
136
137     xstormy16               GNU開発環境
138         Xstormy16               三洋マイコン開発ツール(三洋電機)
139
140     m16c-renesas            Renesas社の開発環境
141         M16C(M30620FCAFP-CPU) OASKS16(オークス電子)
142         M16C(M30262F8FG-CPU)  OAKS16-MINI(オークス電子)
143
144     s1c33                   GNU開発環境
145         SC33                    DMT33209(EPSON)
146         SC33                    LUXUN2(EPSON)
147
148     s1c33-gnu33             GNU33開発環境
149         SC33                    DMT33209(EPSON)
150         SC33                    LUXUN2(EPSON)
151
152     nios2                   GNU開発環境
153         Nios2                   NiosII Development Board(アルテラ)
154
155     v850                    GNU開発環境
156         V850                    TK-850/KJ1+ (Application Corp.)
157         V850                    TK-850/SG2  (Application Corp.)
158
159     tlcs900                 東芝セミコンダクタ社製の開発環境
160         TMP91CY22-CPU           Zup-F16拡張ボード(タマデン工業株式会社)
161
162 また,以下のターゲットは,以前のバージョン(1.4.1)のコードからアップデ
163 ートされておらず,動作確認を行っていないため,1.4.2以降では,参考実装
164 扱いとする.
165
166     h8                      GNU開発環境
167         H8(H8/3048F)          AKI-H8/3048F(秋月電子通商)
168         H8 (H8/3069F)           NKEV-010H8   (品川通信計装サービス)
169
170     h8s                     GNU開発環境
171         H8S(2350)             H8S/2350 評価ボード(ミスポ)
172
173     powerpc32               GNU開発環境
174         PowerPC32(MPC860T)    TB6102S(タンバック)
175
176     mips3                   GNU開発環境
177         MIPS3(VR4131)         KZ-Vr4131PCI-01(京都マイクロコンピュータ)
178         MIPS3(VR5500)         RTE-VR5500-CB(64)(マイダス・ラボ)
179
180
181 JSPカーネルは,カーネルのできる限り多くの部分をC言語で記述する,ターゲッ
182 ト非依存部と依存部を明確に分離するなど,他のターゲットプロセッサへのポ
183 ーティングが容易な構造になっている.ただし,ポーティングにどの程度の手
184 間がかかるかは,ターゲットプロセッサのアーキテクチャやシステムの構成な
185 どに依存する.
186
187 このユーザズマニュアルでは,ターゲット(ターゲットプロセッサおよびター
188 ゲットシステム)に依存しない機能についてのみ説明している.ターゲットに
189 依存する機能については,ターゲット毎のマニュアルを参照すること.
190
191 1.2 開発環境
192
193 JSPカーネルは,GCCなどのGNU開発環境を標準のソフトウェア開発環境として
194 いるが,他の種類の開発環境も利用できるように考慮している.利用できる開
195 発環境については,ターゲット毎または開発環境毎のマニュアルで説明する.
196
197 ターゲット非依存部は,大部分は標準的なC言語によって記述されているが,
198 性能と可読性を両立させるために,一部でインライン関数を用いている.イン
199 ライン関数の機能を持たない開発環境の場合でも,改造なしに対応可能ではあ
200 るが,非効率/無駄なコードが生成されるおそれがある.
201
202 カーネル本体は,外部のライブラリ関数に依存しないように記述している.た
203 だし,コンパイラが標準Cライブラリ関数を呼び出すコードを生成する場合が
204 あり,その場合には標準Cライブラリが必要である.また,システムサービス
205 やサポートライブラリ,アプリケーションプログラムで標準Cライブラリが必
206 要になる場合も考えられる.実際,標準配布キットに含まれる中で,システム
207 ログ機能を呼び出すためのライブラリ関数内で,可変数引数を処理するための
208 機能(stdarg.h, va_list, va_start, va_arg)を用いている(実際には,GNU
209 開発環境では,可変数引数を処理するための機能はGCC本体でサポートしてい
210 るため,標準Cライブラリは必要ない).これらの理由により,標準Cライブラ
211 リを用いる構成もとれるようにしている.
212
213 1.3 シミュレーション環境
214
215 JSPカーネルのシミュレーション環境として,Linux上で動作する環境と
216 Windows上で動作する環境を用意している.これらのシミュレーション環境は,
217 LinuxおよびWindowsの一つのプロセスの中で複数のタスクを切り替えて動作さ
218 せるもので,スレッドライブラリとして使うこともできる.
219
220 これらのシミュレーション環境についての詳細は,シミュレーション環境毎の
221 マニュアルを参照すること.
222
223 1.4 カーネルがサポートする機能
224
225 JSPカーネルは,名前が示す通り,μITRON4.0仕様のスタンダードプロファイ
226 ルに含まれる機能をすべてサポートしている.スタンダードプロファイルでは,
227 割込みハンドラと割込みサービスルーチンのいずれかをサポートすればよいが,
228 JSPカーネルは,現状では割込みハンドラのみをサポートしている.
229
230 スタンダードプロファイルに含まれない機能として,ターゲット依存に以下の
231 割込み管理機能およびサービスコールをサポートする場合がある.これらの機
232 能の具体的な内容については,ターゲット毎に異なる.詳しくは,ターゲット
233 毎のマニュアルを参照すること.
234
235     dis_int     割込みの禁止
236     ena_int     割込みの許可
237     chg_ixx     割込みマスクの変更
238     get_ixx     割込みマスクの参照
239     ※ xx はターゲット毎に定められる.
240
241 また,μITRON4.0仕様に定義されている以外に,以下の独自の拡張機能および
242 サービスコールをサポートしている.
243
244 (1) CPU例外発生時のシステム状態の参照
245
246 スタンダードプロファイルでは,CPU例外ハンドラ内で,CPU例外が発生したコ
247 ンテキストや状態を参照できることが必要であるが,そのためのAPIは定めて
248 いない.JSPカーネルでは,CPU例外が発生した処理でsns_yyyを呼び出した場
249 合の結果を,CPU例外ハンドラ内で取り出せるようにするために,以下の五つ
250 のサービスコールを独自にサポートしている.
251
252     vxsns_ctx   CPU例外発生時のコンテキストの参照
253     vxsns_loc   CPU例外発生時のCPUロック状態の参照
254     vxsns_dsp   CPU例外発生時のディスパッチ禁止状態の参照
255     vxsns_dpn   CPU例外発生時のディスパッチ保留状態の参照
256     vxsns_tex   CPU例外発生時のタスク例外処理禁止状態の参照
257
258 (2) 性能評価用システム時刻参照機能
259
260 性能評価用システム時刻参照機能とは,JSPカーネル上で動作するタスクやJSP
261 カーネル自身の性能を計測するための,システム時刻をμ秒単位で読み出す機
262 能である.この機能のために追加したサービスコールは次の通りである.
263
264     vxget_tim   性能評価用システム時刻の参照
265
266 性能評価用システム時刻参照機能をサポートするかどうかは,ターゲット依存
267 部の定義ファイルで指定することができる.また,ターゲットシステムの制限
268 により,この機能をサポートできない場合もある.
269
270 (3) 終了処理ルーチン機能
271
272 JSPカーネルでは,システムの終了時に呼び出される終了処理ルーチンを登録
273 するための機能をサポートしている.この機能のために追加した静的APIは次
274 の通りである.
275
276     VATT_TER    終了処理ルーチンの追加(静的API)
277
278 終了処理ルーチンについては,「2.12 システム終了手順と終了処理ルーチン」
279 を参照のこと.
280
281 (4) カーネル動作状態の参照
282
283 カーネル上で動作するタスクから呼び出される関数が,カーネルの初期化完了
284 前や終了処理開始後にも呼び出される可能性がある場合には,その中でカーネ
285 ルのサービスコールを呼び出せるかを判別することが必要となる.JSPカーネ
286 ルでは,この判別を可能にするために,次のサービスコールを追加している.
287
288     vsns_ini    カーネル動作状態の参照
289
290 1.5 既知の問題点
291
292 現バージョンでは,静的APIの処理中のエラーの検出機能の中で,ターゲット
293 依存のエラーの検出が不十分である.例えば,割込みハンドラ番号が不正な値
294 である場合,カーネルとコンフィギュレータのいずれもエラーを検出せず,カー
295 ネルが正しく動作しない結果となる.
296
297 kernel_cfg.cは,カーネル,システムサービス,アプリケーションのいずれの
298 インクルードファイルもインクルードし,いずれのシンボルも参照する可能性
299 がある.そのため,カーネル,システムサービス,アプリケーションでシンボ
300 ル等が衝突している場合や,コンパイルオプションが食い違っている場合に,
301 kernel_cfg.cが正しくコンパイルできなくなる場合が考えられる.カーネルの
302 シンボルをリネームするなどの方法でかなり軽減されてはいるが,問題がなく
303 なっているわけではない.
304
305 シリアルインタフェースドライバで,シリアルポートをクローズした後にオー
306 プンしなおした場合に,正しく動作しない.これは,シリアルインタフェース
307 ドライバが使用しているセマフォが初期化されないためである.
308
309 1.6 注意事項
310
311 CRE_DTQのパラメータdtqcntは,μITRON4.0仕様のVer. 4.01.00では一般定数
312 式パラメータと規定されているが,JSPカーネルではVer. 4.02.00に準拠して,
313 プリプロセッサ定数式パラメータと扱っている.
314
315
316 2.JSPカーネルの機能
317
318 この節では,μITRON4.0仕様で実装定義となっている事項を中心に,JSPカー
319 ネルの機能について解説する.
320
321 2.1 実装方針とモデル
322
323 μITRON4.0仕様のスタンダードプロファイルは,システム全体を一つのモジュー
324 ルにリンクすることを想定して規定されている.また,サービスコールの呼出
325 しは,単なるサブルーチンコールによって行うことが想定されている.JSPカー
326 ネルは,この想定に従い,アプリケーションとカーネルを一つのモジュールに
327 リンクし,サブルーチンコールによってサービスコールを呼び出す方法のみを
328 サポートしている.
329
330 JSPカーネル上で動作するアプリケーションは,すべてC言語で記述することを
331 原則としている.そのため,タスクや割込みハンドラなどの処理単位をアセン
332 ブリ言語で記述する方法は,特別には用意していない(もちろん,インタフェー
333 スさえC言語の関数にあわせれば,記述にアセンブリ言語を使うことは問題な
334 い).
335
336 JSPカーネルでは,サービスコールの大部分を一つの割込み禁止区間として実
337 装しているため,サービスコールの不可分性は厳密に保証される.逆に欠点と
338 しては,最大割込み禁止時間(最大割込み応答時間も同様)が,待ちキューに
339 つながれるタスクの最大数やタイムイベントの最大数に依存することになるが,
340 スタンダードプロファイルの機能セットの範囲内では,この方法でもそれほど
341 問題にならないと思われる.
342
343 2.2 データ型
344
345 JSPカーネルでは,以下にリストアップするデータ型を,signed int型,
346 unsigned int型,またはsize_t型に定義している.これらの型のサイズは,
347 JSPカーネルがポーティングされているターゲットプロセッサ/コンパイラの
348 多くにおいて 32ビットであるため,そうでない場合にのみターゲット毎のマ
349 ニュアルに明示する.すなわち,ターゲット毎のマニュアルに明示されていな
350 い限り,以下にリストアップするデータ型のサイズは 32ビットである.
351
352     signed int型に定義しているデータ型
353
354         INT             符号付き整数
355         BOOL            真偽値
356         FN              機能コード
357         ER              エラーコード
358         ID              ID番号
359         PRI             優先度
360         TMO             タイムアウト値
361         ER_BOOL         ER または BOOL
362         ER_ID           ER または ID
363         ER_UINT         ER または UINT
364
365     unsigned int型に定義しているデータ型
366
367         UINT            符号無し整数
368         ATR             属性
369         STAT            状態
370         MODE            動作モード
371         RELTIM          相対時間
372         TEXPTN          タスク例外要因のビットパターン
373         FLGPTN          イベントフラグのビットパターン
374
375     size_t型に定義しているデータ型
376         SIZE            サイズ
377
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ビット以上と規定しており,この仕様でスタンダードプロファイ
384 ル規定に準拠している.
385
386 SYSTIM型は,32ビットの符号無し整数型に定義しており,構造体として定義す
387 る方法は用いていない.
388
389 時間をあらわすデータ型(TMO,RELTIM,SYSTIM)の時間単位は,スタンダー
390 ドプロファイルの規定に従い,すべて1ミリ秒としている.
391
392 2.3 オブジェクトのID番号と優先度
393
394 オブジェクトのID番号には,1から連続した正の値を用いる.オブジェクトの
395 ID番号に抜けがある場合(例えば,ID=1とID=3のオブジェクトが登録され,
396 ID=2のオブジェクトが登録されない場合)には,コンフィギュレータがエラー
397 を報告する.負のID番号を用いたシステムオブジェクトとユーザオブジェクト
398 の区別はサポートしていない.
399
400 生成できるオブジェクトの最大数は,カーネルのコード上は,ID番号がID型
401 (signed int型に定義している)で表現できる範囲内であるが,実際にはメモ
402 リ容量によって制限される.なお,JSPカーネルでは,オブジェクトを生成す
403 るためのサービスコールはサポートしていない.
404
405 タスクとメッセージの優先度には,1〜16の正の値を用いる.
406
407 2.4 エラーチェックとエラーコード
408
409 JSPカーネルでは,以下に示すメインエラーコードを返すエラーの検出を省略
410 している.
411
412     E_SYS       システムエラー
413     E_MACV      メモリアクセス違反
414
415 また,ポインタの値が不正な場合のパラメータエラー(E_PAR)の検出も省略
416 している.メモリアクセス違反(E_MACV)の検出も省略しているため,引数に
417 ポインタを渡すサービスコールに対して,存在しないメモリ番地を差すポイン
418 タなど,不正なアクセスを引き起こすポインタを渡した場合,プロセッサがバ
419 スエラーなどのCPU例外を起こす場合がある(具体的な動作はターゲットプロ
420 セッサに依存).
421
422 μITRON4.0仕様書に定義されているメインエラーコードの中で,スタンダード
423 プロファイルの機能では発生しないものや,JSPカーネルの実装上発生しない
424 ものがある.JSPカーネルでサービスコールが返すメインエラーコードについ
425 ては,「9.3 メインエラーコード一覧」を参照のこと.
426
427 JSPカーネルでは,サブエラーコードは用いていない.サブエラーコードには
428 常に-1が返る.
429
430 2.5 割込みハンドラ
431
432 JSPカーネルでは,割込みハンドラの機能とそれを定義する静的API(DEF_INH)
433 をサポートしており,割込みサービスルーチンの機能とそれを追加する静的
434 API(ATT_ISR)はサポートしていない.
435
436 割込みハンドラのC言語による記述形式は次の通りとする.
437
438         void interrupt_handler(void)
439         {
440                 割込みハンドラ本体
441         }
442
443 JSPカーネルでは,C言語で記述された割込みハンドラが呼ばれる時点で,CPU
444 ロック解除状態になっている.また,割込みハンドラからリターンするには,
445 C言語の関数から単にリターンすればよい.
446
447 割込みハンドラをアセンブリ言語で記述する方法は,サポートしていない.
448
449 NMI(マスクできない割込み)以外にカーネルの管理外の割込みがあるかどう
450 かは,ターゲット依存である.具体的な仕様については,ターゲット毎のマニュ
451 アルを参照すること.
452
453 2.6 タイムイベントハンドラ
454
455 JSPカーネルでは,タイムイベントハンドラとして,周期ハンドラのみをサポー
456 トしている.周期ハンドラは,isig_timサービスコールの中から,サブルーチ
457 ンコールで呼び出される.そのため,周期ハンドラの優先順位は,isig_timを
458 呼び出した割込みハンドラよりも一つだけ高い(厳密に言うと,isig_timを呼
459 び出した割込みハンドラよりも高く,その割込みハンドラよりも高い優先順位
460 を持つ他のいずれの処理よりも低い).
461
462 2.7 CPU例外ハンドラ
463
464 JSPカーネルでは,スタンダードプロファイル規定に従って,CPU例外ハンドラ
465 の機能とそれを定義する静的API(DEF_EXC)をサポートしている.
466
467 JSPカーネルでは,CPU例外ハンドラは非タスクコンテキストで実行される.非
468 タスクコンテキストから呼び出せるサービスコールは,CPU例外ハンドラ内か
469 ら呼び出すことができる.ただし,CPU例外がCPUロック状態で発生した場合に
470 は,CPU例外ハンドラ中でCPUロックを解除することはできず,非タスクコンテ
471 キストから呼び出せるサービスコールを呼び出すこともできない.
472
473 μITRON4.0仕様において,CPU例外ハンドラ内で行えるべきものとして規定さ
474 れている各操作は,次のような方法で行うことができる.
475
476  (a) CPU例外が発生したコンテキストや状態の参照は,そのために用意された
477      JSPカーネル独自のサービスコール(vxsns_ctx,vxsns_loc,vxsns_dsp,
478      vxsns_dpn,vxsns_tex)を用いて行うことができる.詳しくは,「3.10 
479      CPU例外発生時のシステム状態参照」を参照すること.
480
481  (b) CPU例外が発生したタスクのID番号の参照は,iget_tidサービスコールを
482      呼び出すことによって行うことができる.
483
484  (c) タスク例外処理の要求は,iras_texサービスコールを呼び出すことによっ
485      て行うことができる.
486
487 CPU例外ハンドラの優先順位は,タスクコンテキストを実行中にCPU例外が発生
488 した場合には,ディスパッチャよりも高く,すべての割込みハンドラおよびタ
489 イマハンドラよりも低い.非タスクコンテキストを実行中にCPU例外が発生し
490 た場合には,CPU例外が発生した処理の優先順位よりも一つだけ高い(厳密に
491 言うと,CPU例外が発生した処理よりも高く,CPU例外が発生した処理よりも高
492 い優先順位を持つ他のいずれの処理よりも低い).
493
494 CPU例外ハンドラのC言語による記述形式は次の通りとする.
495
496         void cpu_exception_handler(VP p_excinf)
497         {
498                 CPU例外ハンドラ本体
499         }
500
501 p_excinf には,CPU例外に関する情報を記憶している領域の先頭番地が渡され
502 る.これは,CPU例外ハンドラ内で,CPU例外が発生したコンテキストや状態を
503 参照する際に必要となる.詳しくは,「3.10 CPU例外発生時のシステム状態参
504 照」参照すること.CPU例外ハンドラからリターンするには,C言語の関数から
505 単にリターンすればよい.
506
507 CPU例外ハンドラをアセンブリ言語で記述する方法は,サポートしていない.
508
509 2.8 非タスクコンテキストからのサービスコール呼出しと割込み禁止区間
510
511 JSPカーネルでは,タスクコンテキスト専用のサービスコールと,非タスクコ
512 ンテキスト専用のサービスコールを厳密に区別している.タスクコンテキスト
513 専用のサービスコールを非タスクコンテキストから呼び出した場合や,非タス
514 クコンテキスト専用のサービスコールをタスクコンテキストから呼び出した場
515 合には,E_CTXエラーを返す.
516
517 また,非タスクコンテキストから呼び出されたサービスコールの遅延実行は行っ
518 ていない.そのため,非タスクコンテキストから呼び出したサービスコールも,
519 操作対象のオブジェクトの状態に依存して発生するエラーを検出することがで
520 きる.
521
522 2.9 システム初期化手順と初期化ルーチン
523
524 カーネルを起動するには,ターゲットに依存して行わなければならない最低限
525 の初期化を行った後,CPUロック状態と同等の状態で,kernel_start関数を呼
526 び出す.JSPカーネルでは,ターゲット毎にスタートアップモジュールを用意
527 して,この処理を行っている.詳しくは,ターゲット毎のマニュアルを参照す
528 ること.
529
530 ATT_INIによって追加された初期化ルーチンは,カーネル内部のデータ構造の
531 初期化や他の静的APIの処理を終えた後に,システムコンフィギュレーション
532 ファイル中でのATT_INIの記述順と同じ順序で呼び出される.初期化ルーチン
533 内では,サービスコールを呼び出してはならない.初期化ルーチン内でサービ
534 スコールを呼び出した場合,システムの動作は保証されない(実際には,ター
535 ゲットによって,呼び出しても差し支えないサービスコールがある).また,
536 初期化ルーチンを実行中にカーネルの管理外の割込みが禁止されているかどう
537 かは,ターゲットおよびkernel_start関数が呼び出された時の状態に依存する.
538 具体的には,ターゲット毎のマニュアルを参照すること.
539
540 2.10 静的APIとコンフィギュレータ
541
542 JSPカーネルは,μITRON4.0仕様に規定されたシステムコンフィギュレーショ
543 ン手順に準拠した手順で,コンフィギュレーションを行う.
544
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 の一部)が検出されれば,カーネルのコンフィギュレータがエラーを報告する.
553
554 kernel_cfg.cは,コンパイルされて,アプリケーションプログラムおよびカー
555 ネルと共にリンクされる.リンクにより生成されたロードモジュールは,カー
556 ネルのパラメータチェックプログラム(chkプログラム)によって,静的APIの
557 パラメータチェックが行われる.パラメータの値のエラーが検出されると,パ
558 ラメータチェックプログラムがエラーを報告するが,「1.5 既知の問題点」で
559 述べた通り,現バージョンではパラメータエラーのチェックは不完全である.
560
561 以上の手順は,Makefile内に記述されている.ソフトウェア部品のコンフィギュ
562 レータを組み込みたい場合には,Makefileを修正する必要がある.
563
564 2.11 インクルードファイル
565
566 アプリケーションが用いることができるインクルードファイルは,includeディ
567 レクトリの下に置かれている.
568
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をインクルードしている.また,アプリケーションに
573 有益と思われる定義をいくつか含んでいる.
574
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 関数などでシステムインタフェースレイヤを用いている場合にも,このファイ
582 ルをインクルードする.
583
584 この2つのファイルからインクルードされるファイル(上に列挙したもの)は,
585 直接インクルードしないのが原則であるが,次の3つのケースは例外である.
586
587 (1) カーネルから呼ばれるデバイスドライバのインクルードファイルで,イン
588     ライン関数などでシステムインタフェースレイヤを用いている場合には,
589     sil.hをインクルードする.
590
591 (2) カーネル上で動作するプログラムで,ターゲット依存情報を参照したい場
592     合には,t_config.hをインクルードする.
593
594 (3) 他のITRON仕様OSからソフトウェアをポーティングする場合などには,
595     kernel.hを直接インクルードしてもよい.
596
597 (4) ITRON仕様共通規定に準拠するソフトウェア部品のインクルードファイル
598     は,itron.hを直接インクルードしてもよい.
599
600 JSPカーネルのRelease 1.3以前のバージョンでは,t_services.hは
601 jsp_services.hというファイル名になっていた.バージョンを問わずに動作す
602 るプログラムを作る際には,t_services.hをインクルードし,古いバージョン
603 でjsp_services.hをt_services.hにシンボリックリンクを貼る方法を推奨する.
604
605 なお,jsp_kernel.hは,カーネルを構成するプログラムのソースファイルでイ
606 ンクルードするべき標準インクルードファイルであり,カーネル上で動作する
607 プログラムのソースファイルからは通常はインクルードしない.
608
609 2.12 システム終了手順と終了処理ルーチン
610
611 アプリケーションから kernel_exit関数を呼び出すことで,カーネルを終了す
612 ることができる.kernel_exit関数が呼び出されると,カーネルは,終了処理
613 ルーチンの実行,開発環境依存の終了処理(atexit によって登録された関数
614 や C++ におけるデストラクタの実行)を行った後,カーネルの終了処理を行
615 う.
616
617 終了処理ルーチンは,アプリケーションで用意し,VATT_TER を使ってカーネ
618 ルに登録する.VATT_TER によって追加された終了処理ルーチンは,カーネル
619 の管理外の割込みを除くすべての割込みを禁止した状態で,システムコンフィ
620 ギュレーションファイル中での VATT_TER の記述順と逆の順序で呼び出される.
621 終了処理ルーチン内では,サービスコールを呼び出してはならない.終了処理
622 ルーチン内でサービスコールを呼び出した場合,システムの動作は保証されな
623 い(実際には,ターゲットによって,呼び出しても差し支えないサービスコー
624 ルがある).
625
626 2.13 その他
627
628 JSPカーネルでは,t_stddef.h の中で,次のマクロを定義している.
629
630 (1) assert(exp)
631
632 JSPカーネルでは,assertマクロを独自に定義している.開発環境の標準の
633 assertマクロは使われない.
634
635 (2) throw()
636
637 C言語とEC++言語では,throw() が空になるように定義している.C++言語から
638 呼び出す可能性のあるC言語で記述された関数のプロトタイプ宣言に,throw() 
639 をつけることを想定している.
640
641 また,t_services.h の中で,次のマクロを定義している.
642
643 (3) syscall(s)
644
645 サービスコール s を呼び出し,返値がエラーであれば,エラーメッセージを
646 出力する.
647
648 (4) _syscall(s)
649
650 サービスコール s を呼び出し,返値がエラーであれば,エラーメッセージを
651 出力し,カーネルを異常終了させる.
652
653
654 3.JSPカーネルのサービスコールと静的API
655
656 この節では,JSPカーネルのサービスコールと静的APIについて,μITRON4.0仕
657 様で実装定義となっている事項とJSPカーネル独自のサービスコールを中心に
658 解説する.
659
660 3.1 タスク管理機能
661
662 タスクの起動要求キューイング数の最大値(TMAX_ACTCNT)は1に固定している.
663
664 (1) CRE_TSK                     タスクの生成(静的API)
665
666 tskatr に TA_ASM が指定された場合の機能(タスクをアセンブリ言語で記述
667 する)はサポートしていない.また,stk に NULL 以外が指定された場合の機
668 能(スタック領域の先頭番地を指定する)もサポートしていない.
669
670 (2) act_tsk, iact_tsk           タスクの起動
671
672 (3) can_act                     タスク起動要求のキャンセル
673
674 (4) ext_tsk                     自タスクの終了
675
676 ext_tsk が非タスクコンテキストから呼ばれた場合,システムログ機能を用い
677 てエラー情報を出力し(LOG_EMERGレベル),そのまま実行を続けるが,動作
678 は保証されない.
679
680 ext_tsk がCPUロック状態(またはディスパッチ禁止状態)で呼ばれた場合,
681 システムログにエラーを記録し(LOG_WARNINGレベル),CPUロック解除状態
682 (またはディスパッチ許可状態)にしてからタスクを終了する.
683
684 (5) ter_tsk                     タスクの強制終了
685
686 (6) chg_pri                     タスク優先度の変更
687
688 (7) get_pri                     タスク優先度の参照
689
690 3.2 タスク付属同期機能
691
692 タスクの起床要求キューイング数の最大値(TMAX_WUPCNT)は 1 に固定してい
693 る.また,タスクの強制待ち要求ネスト数の最大値(TMAX_SUSCNT)も 1 に固
694 定している.
695
696 (1) slp_tsk                     起床待ち
697 (2) tslp_tsk                    起床待ち(タイムアウトあり)
698
699 (3) wup_tsk, iwup_tsk           タスクの起床
700
701 (4) can_wup                     タスク起床要求のキャンセル
702
703 (5) rel_wai, irel_wai           待ち状態の強制解除
704
705 (6) sus_tsk                     強制待ち状態への移行
706
707 (7) rsm_tsk                     強制待ち状態からの再開
708 (8) frsm_tsk                    強制待ち状態からの強制再開
709
710 タスクの強制待ち要求ネスト数の最大値(TMAX_SUSCNT)が 1 であるため,
711 rsm_tsk と frsm_tsk の処理内容は同一である.
712
713 (9) dly_tsk                     自タスクの遅延
714
715 3.3 タスク例外処理機能
716
717 TEXPTN型は,unsigned int型に定義している.よって TBIT_TEXPTN は,
718 unsigned int型が 32ビットの場合は 32,16ビットの場合は 16 になる.
719
720 (1) DEF_TEX                     タスク例外処理ルーチンの定義(静的API)
721
722 texatr に TA_ASM が指定された場合の機能(タスク例外処理ルーチンをアセ
723 ンブリ言語で記述する)はサポートしていない.
724
725 (2) ras_tex, iras_tex           タスク例外処理の要求
726
727 (3) dis_tex                     タスク例外処理の禁止
728
729 (4) ena_tex                     タスク例外処理の許可
730
731 (5) sns_tex                     タスク例外処理禁止状態の参照
732
733 3.4 同期・通信機能
734
735 3.4.1 セマフォ
736
737 セマフォの最大資源数は,UINT型(unsigned int型に定義している)で表現で
738 きる数値の範囲内である.すなわち,unsigned int型が 32ビットの場合は 
739 (2^32 - 1),16ビットの場合は (2^16 - 1) = 65535 である.TMAX_MAXSEM は
740 定義していない.
741
742 (1) CRE_SEM                     セマフォの生成(静的API)
743
744 (2) sig_sem, isig_sem           セマフォ資源の返却
745
746 (3) wai_sem                     セマフォ資源の獲得
747 (4) pol_sem                     セマフォ資源の獲得(ポーリング)
748 (5) twai_sem                    セマフォ資源の獲得(タイムアウトあり)
749
750 3.4.2 イベントフラグ
751
752 一つのイベントフラグで複数のタスクが待ち状態になれる機能はサポートして
753 いない.
754
755 FLGPTN型は,unsigned int型に定義している.よって TBIT_FLGPTN は,
756 unsigned int型が 32ビットの場合は 32,16ビットの場合は 16 になる.
757
758 (1) CRE_FLG                     イベントフラグの生成(静的API)
759
760 flgatr に TA_WMUL が指定された場合の機能(イベントフラグで複数のタスク
761 が待ち状態になれる)はサポートしていない.
762
763 (2) set_flg, iset_flg           イベントフラグのセット
764
765 (3) clr_flg                     イベントフラグのクリア
766
767 (4) wai_flg                     イベントフラグ待ち
768 (5) pol_flg                     イベントフラグ待ち(ポーリング)
769 (6) twai_flg                    イベントフラグ待ち(タイムアウトあり)
770
771 3.4.3 データキュー
772
773 dtqcnt個のデータを格納するのに必要なデータキュー領域のサイズは,
774 sizeof(VP_INT) * dtqcnt バイトである.TSZ_DTQ は定義していない.
775
776 (1) CRE_DTQ                     データキューの生成(静的API)
777
778 dtq に NULL 以外が指定された場合の機能(データキュー領域の先頭番地を指
779 定する)はサポートしていない.
780
781 (2) snd_dtq                     データキューへの送信
782 (3) psnd_dtq, ipsnd_dtq         データキューへの送信(ポーリング)
783 (4) tsnd_dtq                    データキューへの送信(タイムアウトあり)
784
785 (5) fsnd_dtq, ifsnd_dtq         データキューへの強制送信
786
787 (6) rcv_dtq                     データキューからの受信
788 (7) prcv_dtq                    データキューからの受信(ポーリング)
789 (8) trcv_dtq                    データキューからの受信(タイムアウトあり)
790
791 3.4.4 メールボックス
792
793 T_MSG型は下記のように定義されている.T_MSG型のサイズは,ターゲットプロ
794 セッサ/コンパイラのポインタのサイズに一致する.
795
796         typedef struct t_msg {
797                 struct t_msg    *next;
798         } T_MSG;
799
800 JSPカーネルでは,優先度別メッセージキューヘッダ領域は用いていない.
801 TSZ_MPRIHD は定義していないが,定義するとしたら 0 となる.
802
803 (1) CRE_MBX                     メールボックスの生成(静的API)
804
805 mprihd に NULL 以外が指定された場合の機能(優先度別メッセージキューヘッ
806 ダ領域の先頭番地を指定する)はサポートしていない.
807
808 (2) snd_mbx                     メールボックスへの送信
809
810 (3) rcv_mbx                     メールボックスからの受信
811 (4) prcv_mbx                    メールボックスからの受信(ポーリング)
812 (5) trcv_mbx                    メールボックスからの受信(タイムアウトあり)
813
814 3.5 メモリプール管理機能
815
816 3.5.1 固定長メモリプール
817
818 サイズが blkszバイトのメモリブロックを blkcnt個獲得できるのに必要な固
819 定長メモリプール領域のサイズは,TROUND_VP(blksz) * blkcnt バイトである.
820 ここで,TROUND_VP(blksz) は,blksz をターゲットプロセッサ/コンパイラ
821 のポインタのサイズの倍数になるよう切り上げた数を表す.TSZ_MPF は定義し
822 ていない.
823
824 (1) CRE_MPF                     固定長メモリプールの生成(静的API)
825
826 mpf に NULL 以外が指定された場合の機能(固定長メモリプール領域の先頭番
827 地を指定する)はサポートしていない.
828
829 (2) get_mpf                     固定長メモリブロックの獲得
830 (3) pget_mpf                    固定長メモリブロックの獲得(ポーリング)
831 (4) tget_mpf                    固定長メモリブロックの獲得(タイムアウトあり)
832
833 (5) rel_mpf                     固定長メモリブロックの返却
834
835 blkパラメータ(返却するメモリブロックの先頭番地)の値が,返却先のメモ
836 リプール領域の外や,メモリブロックの途中を指す場合には,E_PARエラーを
837 返す.未獲得のメモリブロックを返却した場合や,返却済のメモリブロックを
838 再度返却した場合の動作は保証されない.
839
840 3.6 時間管理機能
841
842 タイムイベントハンドラに関しては,「2.6 タイムイベントハンドラ」を参照
843 すること.
844
845 3.6.1 システム時刻管理
846
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 を変更できるように実装されている場合もある.詳しくは,ターゲット毎のマ
855 ニュアルを参照すること.
856
857 (1) set_tim                     システム時刻の設定
858
859 (2) get_tim                     システム時刻の参照
860
861 (3) isig_tim                    タイムティックの供給
862
863 isig_tim は,ターゲット依存に定義された TIC_NUME と TIC_DENO で指定さ
864 れる時間だけシステム時刻を進め,必要なタイムイベント(タイムアウト,周
865 期ハンドラの起動など)の処理を行う.JSPカーネルでは,システムクロック
866 ドライバがこのサービスコールを周期的に呼び出すため,アプリケーションか
867 ら呼び出す必要はない.
868
869 3.6.2 周期ハンドラ
870
871 周期ハンドラの起動位相を保存する機能はサポートしていない.
872
873 (1) CRE_CYC                     周期ハンドラの生成(静的API)
874
875 cycatr に TA_PHS が指定された場合の機能(周期ハンドラの起動位相を保存
876 する)はサポートしていない.また,TA_ASM が指定された場合の機能(周期
877 ハンドラをアセンブリ言語で記述する)もサポートしていない.
878
879 cycatr に TA_STA を指定し,cycphs に 0 を指定した場合,周期ハンドラの
880 初回の起動は,システム起動後の最初のタイムティックで行われる.すなわち,
881 cycphs に 1 を指定した場合と同じ振る舞いとなる.混乱の原因となるため,
882 cycphs に 0 を指定することは推奨しない.
883
884 (2) sta_cyc                     周期ハンドラの動作開始
885
886 (3) stp_cyc                     周期ハンドラの動作停止
887
888 3.7 システム状態管理機能
889
890 (1) rot_rdq, irot_rdq           タスクの優先順位の回転
891
892 (2) get_tid, iget_tid           実行状態のタスクIDの参照
893
894 (3) loc_cpu, iloc_cpu           CPUロック状態への移行
895
896 (4) unl_cpu, iunl_cpu           CPUロック状態の解除
897
898 (5) dis_dsp                     ディスパッチの禁止
899
900 (6) ena_dsp                     ディスパッチの許可
901
902 (7) sns_ctx                     コンテキストの参照
903
904 (8) sns_loc                     CPUロック状態の参照
905
906 (9) sns_dsp                     ディスパッチ禁止状態の参照
907
908 (10) sns_dpn                    ディスパッチ保留状態の参照
909
910 (11) vsns_ini                   カーネル動作状態の参照
911
912 【C言語API】
913         BOOL state = vsns_ini();
914
915 【パラメータ】
916         なし
917
918 【リターンパラメータ】
919         BOOL    state           カーネル動作状態
920
921 【機能】
922
923 カーネルの初期化完了前または終了処理開始後に呼び出された場合に TRUE,
924 カーネルの動作中に呼び出された場合に FALSE を返す.
925
926 このサービスコールが TRUE を返す時には,他のサービスコールを呼び出して
927 はならない.このサービスコールが TRUE を返す時に他のサービスコールを呼
928 び出した場合,システムの動作は保証されない.
929
930 3.8 割込み管理機能
931
932 割込みハンドラに関しては,「2.5 割込みハンドラ」を参照すること.
933
934 (1) DEF_INH                     割込みハンドラの定義(静的API)
935
936 INHNO型の定義と inhno の意味はターゲット毎に定める.inhatr には,
937 TA_HLNG のみを指定することができる.
938
939 (2) dis_int                     割込みの禁止
940 (3) ena_int                     割込みの許可
941 (4) chg_ixx                     割込みマスクの変更
942 (5) get_ixx                     割込みマスクの参照
943
944 これらのサービスコールがサポートされているかどうか,サポートされている
945 場合の仕様(xx の部分の名称,型とパラメータの名称と意味,CPUロック状態
946 やディスパッチ状態との関連)については,ターゲット依存である.具体的に
947 は,ターゲット毎のマニュアルを参照すること.
948
949 3.9 システム構成管理機能
950
951 CPU例外ハンドラに関しては「2.7 CPU例外ハンドラ」を,初期化ルーチンに関
952 しては「2.9 システム初期化手順と初期化ルーチン」参照すること.
953
954 (1) DEF_EXC                     CPU例外ハンドラの定義(静的API)
955
956 EXCNO型の定義と excno の意味はターゲット毎に定める.excatr には,
957 TA_HLNG のみを指定することができる.
958
959 (2) ATT_INI                     初期化ルーチンの追加(静的API)
960
961 iniatr に TA_ASM が指定された場合の機能(初期化ルーチンをアセンブリ言
962 語で記述する)はサポートしていない.
963
964 (3) VATT_TER                    終了処理ルーチンの追加(静的API)
965
966 【静的API】
967         VATT_TER({ ATR teratr, VP_INT exinf, FP terrtn });
968
969 【パラメータ】
970         ATR     teratr  終了処理ルーチン属性
971         VP_INT  exinf   終了処理ルーチンの拡張情報
972         FP      terrtn  終了処理ルーチンの起動番地
973
974 【機能】
975
976 終了処理ルーチンを,指定される各パラメータに基づいて追加する.teratr 
977 は終了処理ルーチンの属性,exinf は終了処理ルーチンを起動する時にパラメ
978 ータとして渡す拡張情報,terrtn は終了処理ルーチンの起動番地である.
979
980 VATT_TER においては,teratr はプリプロセッサ定数式パラメータである. 
981 teratr には,TA_HLNG の指定ができる.TA_HLNG(=0x00)が指定された場合
982 には高級言語用のインタフェースで終了処理ルーチンを起動する.
983
984 VATT_ATR によって追加された終了処理ルーチンは,システム終了処理時に実
985 行される.詳しくは,「2.12 システム終了手順と終了処理ルーチン」を参照
986 すること.
987
988 3.10 CPU例外発生時のシステム状態参照
989
990 CPU例外ハンドラ内で,CPU例外が発生したコンテキストや状態を参照するため
991 のサービスコールとして,JSPカーネルでは,五つのサービスコールを独自に
992 サポートしている.サービスコール vxsns_yyy は,CPU例外が発生した処理で 
993 sns_yyy を呼び出した場合の結果を取り出すもので,CPU例外ハンドラに渡さ
994 れるパラメータ p_excinf をパラメータとする.
995
996 (1) vxsns_ctx                   CPU例外発生時のコンテキストの参照
997
998 【C言語API】
999         BOOL state = vxsns_ctx(VP p_excinf);
1000
1001 【パラメータ】
1002         VP      p_excinf        CPU例外に関する情報を記憶している領域の
1003                                 先頭番地
1004
1005 【リターンパラメータ】
1006         BOOL    state           コンテキスト
1007
1008 【機能】
1009
1010 CPU例外が発生したコンテキストが,非タスクコンテキストの場合に TRUE,タ
1011 スクコンテキストの場合に FALSE を返す.p_excinf には,CPU例外ハンドラ
1012 に渡される p_excinfパラメータをそのまま渡す.CPU例外ハンドラ以外から呼
1013 び出した場合や,p_excinf を正しく渡さなかった場合の振舞いは保証されな
1014 い.
1015
1016 (2) vxsns_loc                   CPU例外発生時のCPUロック状態の参照
1017
1018 【C言語API】
1019         BOOL state = vxsns_loc(VP p_excinf);
1020
1021 【パラメータ】
1022         VP      p_excinf        CPU例外に関する情報を記憶している領域の
1023                                 先頭番地
1024
1025 【リターンパラメータ】
1026         BOOL    state           CPUロック状態
1027
1028 【機能】
1029
1030 CPU例外が発生した状態が,CPUロック状態の場合に TRUE,CPUロック解除状態
1031 の場合に FALSE を返す.p_excinf には,CPU例外ハンドラに渡される 
1032 p_excinfパラメータをそのまま渡す.CPU例外ハンドラ以外から呼び出した場
1033 合や,p_excinf を正しく渡さなかった場合の振舞いは保証されない.
1034
1035 (3) vxsns_dsp                   CPU例外発生時のディスパッチ禁止状態の参照
1036
1037 【C言語API】
1038         BOOL state = vxsns_dsp(VP p_excinf);
1039
1040 【パラメータ】
1041         VP      p_excinf        CPU例外に関する情報を記憶している領域の
1042                                 先頭番地
1043
1044 【リターンパラメータ】
1045         BOOL    state           ディスパッチ禁止状態
1046
1047 【機能】
1048
1049 CPU例外が発生した状態が,ディスパッチ禁止状態の場合に TRUE,ディスパッ
1050 チ許可状態の場合に FALSE を返す.p_excinf には,CPU例外ハンドラに渡さ
1051 れる p_excinfパラメータをそのまま渡す.CPU例外ハンドラ以外から呼び出し
1052 た場合や,p_excinf を正しく渡さなかった場合の振舞いは保証されない.
1053
1054 【補足説明】
1055
1056 CPU例外ハンドラの起動によってディスパッチ禁止/許可状態は変化せず,CPU
1057 例外ハンドラ中ではディスパッチの禁止や許可は行えないため,vxsns_dsp の
1058 返り値は sns_dsp の返り値に常に一致する.そのため,vxsns_dsp と 
1059 sns_dsp の処理内容は同一となっている.
1060
1061 (4) vxsns_dpn                   CPU例外発生時のディスパッチ保留状態の参照
1062
1063 【C言語API】
1064         BOOL state = vxsns_dpn(VP p_excinf);
1065
1066 【パラメータ】
1067         VP      p_excinf        CPU例外に関する情報を記憶している領域の
1068                                 先頭番地
1069
1070 【リターンパラメータ】
1071         BOOL    state           ディスパッチ保留状態
1072
1073 【機能】
1074
1075 CPU例外が発生した状態が,ディスパッチ保留状態の場合に TRUE,そうでない
1076 場合に FALSE を返す.すなわち,ディスパッチャよりも優先順位が高い処理
1077 が実行されていた時,CPUロック状態であった時およびディスパッチ禁止状態
1078 であった時は,TRUE を返す.p_excinf には,CPU例外ハンドラに渡される 
1079 p_excinfパラメータをそのまま渡す.CPU例外ハンドラ以外から呼び出した場
1080 合や, p_excinf を正しく渡さなかった場合の振舞いは保証されない.
1081
1082 (5) vxsns_tex                   CPU例外発生時のタスク例外処理禁止状態の参照
1083
1084 【C言語API】
1085         BOOL state = vxsns_tex(VP p_excinf);
1086
1087 【パラメータ】
1088         VP      p_excinf        CPU例外に関する情報を記憶している領域の
1089                                 先頭番地
1090
1091 【リターンパラメータ】
1092         BOOL    state           タスク例外処理禁止状態
1093
1094 【機能】
1095
1096 CPU例外が発生した時に実行状態であったタスクが,タスク例外処理禁止状態
1097 の場合に TRUE,タスク例外処理許可状態の場合に FALSE を返す.CPU例外が
1098 非タスクコンテキストで発生し,その時に実行状態のタスクがなかった場合に
1099 も,FALSE を返す.p_excinf には,CPU例外ハンドラに渡される p_excinfパ
1100 ラメータをそのまま渡す.CPU例外ハンドラ以外から呼び出した場合や,
1101 p_excinf を正しく渡さなかった場合の振舞いは保証されない.
1102
1103 【補足説明】
1104
1105 CPU例外ハンドラの起動によってタスク例外処理禁止/許可状態は変化せず, 
1106 CPU例外ハンドラ中ではタスク例外処理の禁止や許可は行えないため, 
1107 vxsns_tex の返り値は sns_tex の返り値に常に一致する.そのため,
1108 vxsns_tex と sns_tex の処理内容は同一となっている.
1109
1110 3.11 性能評価用システム時刻参照機能
1111
1112 JSPカーネルでは,JSPカーネル上で動作するタスクやJSPカーネル自身の性能
1113 を計測するために,システム時刻より精度の高い性能評価用システム時刻を読
1114 み出す機能を,ターゲット依存にサポートしている.性能評価用システム時刻
1115 は,μ秒単位で表現されるが,実際の精度はターゲット依存である.具体的に
1116 は,ターゲット毎のマニュアルを参照すること.
1117
1118 性能評価用システム時刻参照機能では,次のデータ型を用いる.
1119
1120         SYSUTIM         性能評価用システム時刻(符号無し整数)
1121
1122 SYSUTIM型のサイズ数はターゲット依存である.具体的には,ターゲット毎の
1123 マニュアルを参照すること.
1124
1125 (1) vxget_tim                   性能評価用システム時刻の参照
1126
1127 【C言語API】
1128         ER ercd = vxget_tim(SYSUTIM *p_sysutim);
1129
1130 【パラメータ】
1131         なし
1132
1133 【リターンパラメータ】
1134         ER      ercd            エラーコード
1135         SYSUTIM sysutim         現在の性能評価用システム時刻
1136
1137 【エラーコード】
1138         E_CTX           コンテキストエラー
1139
1140 【機能】
1141
1142 現在の性能評価用システム時刻を読み出し,sysutim に返す.
1143
1144 このサービスコールは,タスクコンテキストからのみ呼び出すことができる.
1145 非タスクコンテキストから呼び出した場合には,E_CTXエラーとなる.
1146
1147 タスクコンテキストであれば,CPUロック状態であっても呼び出せるが,CPUロッ
1148 ク状態が長時間継続すると,タイマ割込みが入らないためにシステム時刻が更
1149 新されず,このサービスコールも正しい性能評価用システム時刻を返せなくな
1150 る.時間測定区間が短い場合を除いては,時間測定区間全体をCPUロック状態
1151 とするのは適切ではない.
1152
1153
1154 4.システムログ機能
1155
1156 システムログ機能は,カーネル内で発生した異常事象(アサーションの失敗,
1157 エラーコードを返せないエラー)を,システムの外部に通知するための機能で
1158 ある.カーネルのトレースログ,システムサービスやアプリケーション内で発
1159 生した異常事象やトレースログにも,同じ機能を利用することができる.
1160
1161 4.1 システムログ機能の位置付け
1162
1163 カーネル内で発生した異常事象をシステムの外部に通知するための方法として,
1164 シリアルインタフェースに出力する,ディスクに書き出すなどの方法が考えら
1165 れる.
1166
1167 システムログ機能は,カーネル内部から呼び出されるという観点からは,カー
1168 ネルの一部と考えるのが自然である.一方,シリアルインタフェースやディス
1169 クにアクセスするためのサービス(デバイスドライバなど)はカーネル上で動
1170 作するため,それらを用いるシステムログ機能は,カーネル上に実装されたシ
1171 ステムサービスと考える方が自然で,位置づけが微妙である.
1172
1173 そこでJSPカーネルでは,カーネルの拡張機能として,異常事象に関する情報
1174 やトレースログ情報(これを,ログ情報と総称する)を,カーネル内のバッファ
1175 (これをログバッファと呼ぶ)に記録する機能と,ログバッファからログ情報
1176 を読み出す機能を用意する.これを,システムログ機能と呼ぶ.ログ情報をロ
1177 グバッファから読み出し,デバイスにアクセスするサービスを用いて外部に出
1178 力する機能は,システムログタスクとしてカーネル上に実現する.
1179
1180 4.2 ログバッファへの記録と低レベル出力
1181
1182 上述したように,ログ情報をシステムの外部に出力するために,デバイスにア
1183 クセスするサービスが必要になるが,これらのサービスはカーネル上で動作し
1184 ているため,カーネルの動作を継続できないような重大な異常事象が起こった
1185 場合には,これらのサービスを使うことができない.また,これらのサービス
1186 自身をデバッグする場合にも,デバイスにアクセスするサービスを使うことが
1187 できない.
1188
1189 そこで,カーネル上で動作するサービスが使えない場合にでもログ情報を出力
1190 するために,低レベル出力機能を用意する.低レベル出力機能は,ターゲット
1191 依存に用意する低レベルの文字出力関数(sys_putc)を用いてログ情報を出力
1192 する機能である.低レベルの文字出力関数は,ターゲット依存部で用意するこ
1193 ととしているが,最終製品に組み込まれる場合などでは,文字を出力する方法
1194 がない状況も考えられる.そのような場合,低レベルの文字出力関数に送られ
1195 た文字は,メモリ上に残しておくか,捨ててしまうしかない.
1196
1197 ログ情報を,ログバッファへ記録するか低レベル出力機能を用いて出力するか
1198 の設定は,カーネルの拡張サービスコール(vmsk_log)によって行うことがで
1199 きる.vmsk_log の使い方については後述する.
1200
1201 低レベル出力機能を用いると,ログメッセージの作成処理(printf 相当の処
1202 理)と低レベルの文字出力処理をカーネル内で行うために,カーネルの応答性
1203 が悪くなることに注意しなければならない.特に,低レベルの文字出力処理は
1204 デバイスをポーリングする形で実装するのが通常で,その場合には,カーネル
1205 の応答性は実用的と言えない程に悪くなる.
1206
1207 一方,カーネルの動作を継続できるような(あまり重大でない)事象について
1208 は,ログ情報をカーネル内のログバッファに記録し,記録したログ情報の出力
1209 は,デバイスにアクセスするサービスを用いて動作するシステムログタスクに
1210 任せる.システムログタスクはカーネル上で動作するタスクであり,カーネル
1211 の拡張サービスコール(vrea_log)を用いて,ログバッファからログ情報を読
1212 み出す.JSPカーネルの標準配布キットには,システムログタスクの一例とし
1213 て,シリアルインタフェースにログ情報を文字列の形で出力するシステムログ
1214 タスクを含めている.
1215
1216 4.3 ログ情報の種別
1217
1218 JSPカーネルのシステムログ機能は,ログ情報に以下の種別を設けている.
1219
1220         LOG_TYPE_INH            割込みハンドラ
1221         LOG_TYPE_ISR            割込みサービスルーチン
1222         LOG_TYPE_CYC            周期ハンドラ
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         アサーションの失敗
1230
1231 これらの種別は,ITRONデバッギングインタフェース仕様を参考に定めている.
1232 ただし,ITRONデバッギングインタフェース仕様におけるトレースログ形式は,
1233 RIM(RTOS Interface Module)がデバッグツールに渡す場合の形式を定めたも
1234 のであり,カーネルが出力する形式と一致している必要はない(RIM が変換す
1235 ればよいため).実際,上の種別の中で,LOG_TYPE_CYC と LOG_TYPE_ASSERT 
1236 は,デバッギングインタフェース仕様と一致していない.
1237
1238 ログ情報の種別の中で,LOG_TYPE_COMMENT と LOG_TYPE_ASSERT 以外はカーネ
1239 ルのトレースログのためのもので,どのように用いるかはターゲット依存部に
1240 任されている(4.5節参照).
1241
1242 4.4 ログ情報の重要度
1243
1244 JSPカーネルのシステムログ機能は,ログ情報を出力する際に指定する重要度
1245 に基づいて,実際に出力するログ情報を動的に設定することができる.これは, 
1246 UNIX のシステムログ機能をまねたもので,ログの重要度の種類や指定方法も
1247 UNIX の API を参考にしている.また,低レベル出力機能を用いて出力するロ
1248 グ情報も,重要度に基づいて動的に設定することができる.
1249
1250 具体的には,ログの重要度として次の8段階を用意している.
1251
1252         LOG_EMERG       システムをシャットダウンすべきエラー
1253         LOG_ALERT
1254         LOG_CRIT
1255         LOG_ERROR       重要性の低いシステムエラー
1256         LOG_WARNING     警告メッセージ.システムは安全に継続動作できる
1257         LOG_NOTICE
1258         LOG_INFO
1259         LOG_DEBUG       デバッグのためのメッセージ
1260
1261 なお,アサーションの失敗は,LOG_EMERG で出力する.カーネルのトレースロ
1262 グは,LOG_DEBUG で出力するのを標準とする(ターゲット依存).
1263
1264 どの重要度のログ情報をログバッファに記録するかと,どの重要度のログ情報
1265 を低レベル出力機能を用いて出力するかは,カーネルの拡張サービスコール
1266 (vmsk_log)によって設定することができる.vmsk_log の各パラメータは,
1267 指定するログ情報の集合を表すビットマップである.また,ビットマップを作
1268 るためのマクロとして,LOG_MASK と LOG_UPTO を用意している.
1269
1270 4.5 トレースログ機能
1271
1272 JSPカーネルは,カーネルのトレースログを取得するための基本的な仕組みを
1273 持っているが,トレースログの実際の取得方法はターゲット依存となる.カー
1274 ネルのトレースログの取得に,システムログ機能を使うのも選択肢の1つであ
1275 る.ただし,カーネルのトレースログをシステムログタスクを用いて取り出す
1276 方法は考えていない(システムログタスクが動作することによりトレースログ
1277 が生成され,取り出すより多くのログ情報が生成される可能性があるため).
1278
1279 4.6 システムログ機能の拡張サービスコール
1280
1281 システムログ機能の提供する拡張サービスコールは次の通りである.
1282
1283 (1) ER vwri_log(UINT prio, SYSLOG *p_log)
1284
1285 システムログ機能に,重要度 prio でログ情報を出力する(ログバッファへ記
1286 録するか低レベル出力機能を用いて出力する).SYSLOG は,ログ情報を格納
1287 するためのデータ型(構造体)で,この拡張サービスコールには,それへのポ
1288 インタを渡す.
1289
1290 (2) ER_UINT vrea_log(SYSLOG *p_log)
1291
1292 ログバッファからログ情報を1つ取り出す.ログバッファが空の時は E_OBJ,
1293 そうでない場合は,失われたログ情報の数(ログ情報が失われていない場合は 
1294 0)を返す.システムログタスクが用いることを想定している.
1295
1296 (3) ER vmsk_log(UINT logmask, UINT lowmask)
1297
1298 ログバッファに記録すべきログ情報の重要度のビットマスク(logmask)と,
1299 低レベル出力機能を用いて出力すべきログ情報の重要度のビットマスク
1300 (lowmask)を設定する.
1301
1302 4.7 システムログ機能のためのライブラリ関数とマクロ
1303
1304 システムログ機能は,上記のサービスコールに加えて,次のライブラリ関数と
1305 マクロを提供する.
1306
1307 (1) void _syslog_n(UINT prio, UINT type, VP_INT arg1, ..., VP_INT argn)
1308     ※ n は 0〜6 のいずれか.
1309
1310 ログ種別が type,パラメータが arg1〜argn のログ情報を,重要度 prio で
1311 出力するためのライブラリ関数.
1312
1313 (2) void syslog_n(UINT prio, const char *format, arg1, ..., argn)
1314     ※ n は 0〜5 のいずれか.
1315
1316 format 文字列およびそれに続く引数から作成されるコメント(ログ種別が 
1317 LOG_TYPE_COMMENT のログ情報)を,重要度 prio で出力するためのマクロ.
1318
1319 format はメッセージのフォーマット記述,arg1〜argn はフォーマット記述中
1320 で参照される値で,printf のフォーマット記述のサブセットとなっている.
1321 arg1〜argn は VP_INT型にキャストされるため,VP_INT型に型変換できる任意
1322 の型を渡すことができ,型チェックはされない.format および arg1〜argn 
1323 には,次の制限がある.
1324
1325 ・format のフォーマット記述は,このマクロから戻った後も変化してはなら
1326 ない.定数文字列を渡すことを想定している.
1327
1328 ・format 中に使えるフォーマット指定は次の通り.
1329
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    引数を文字列を示すポインタとみなし,文字列を表示
1337     %%    '%' を表示(引数は取らない)
1338
1339 %d, %u, %x, %X においては,'%' の直後に表示桁数を指定する10進数値を記述
1340 することができる.その場合,表示すべき文字列が指定した桁数に満たない場
1341 合には,指定した桁数内に右詰めで表示する.10進数値が '0' で始まる場合
1342 には,その間に '0' を埋める.
1343
1344 また,VP_INT型のサイズが long型のサイズ以上である環境においては,次の
1345 フォーマット指定も使用することができる.この他のフォーマット指定に 'l' 
1346 を付加した場合には無視する(%lcと%lsには対応していない).
1347
1348     %ld   引数をsigned long型とみなし,10進数で表示
1349     %lu   引数をunsigned long型とみなし,10進数で表示
1350     %lx   引数をunsigned long型とみなし,16進数(英文字は小文字)で表示
1351     %lX   引数をunsigned long型とみなし,16進数(英文字は大文字)で表示
1352
1353 ・arg1〜argn にポインタを渡す場合(%s に対応する引数の場合)に,ポイン
1354 タの指すデータは,このマクロから戻った後も変化してはならない.定数文字
1355 列を渡すことを想定している.
1356
1357 (3) void syslog(UINT prio, const char *format, ...)
1358
1359 format 文字列およびそれに続く引数から作成されるメッセージを,重要度 
1360 prio でログ情報として出力するためのライブラリ関数で,引数の数を可変に
1361 したもの.format に続く引数は最大5個まで.format およびそれに続く引数
1362 には,syslog_n と同様の制限がある.
1363
1364 このライブラリ関数は,可変数引数を処理するために内部で文字列をスキャン
1365 する.そのため,実行時間が長くなる可能性があり,割込み禁止状態で呼び出
1366 すべきではない.主にアプリケーションプログラムが用いることを想定してい
1367 る.そのため,このライブラリ関数のソースファイルは,サポートライブラリ
1368 のディレクトリに置いている.
1369
1370 (4) UINT LOG_MASK(UINT prio)
1371
1372 重要度 prio のみセットされたビットマップを作るマクロ.vmsk_log に渡す
1373 引数を作るために用いる.
1374
1375 (5) UINT LOG_UPTO(UINT prio)
1376
1377 重要度 prio 以上の重要度がすべてセットされたビットマップを作るマクロ. 
1378 vmsk_log に渡す引数を作るために用いる.
1379
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))
1383
1384 ログ情報をフォーマット出力するためのライブラリ関数.syslog_printf は渡
1385 されたフォーマット文字列と引数を,syslog_print は渡されたログ情報を,
1386 syslog_output はログバッファに格納されたログ情報をフォーマット出力する.
1387
1388 システムログタスクが用いることを想定しているため,このライブラリ関数の
1389 ソースファイルはサポートライブラリのディレクトリに置いている.ただし,
1390 低レベル出力を行うために,システムログ機能内部でも用いている.
1391
1392 4.8 システムログ機能の設定方法
1393
1394 JSPカーネルのシステムログ機能の想定されている設定方法は,以下の通りで
1395 ある.
1396
1397 (a) 重大な異常事象を示すログ情報は低レベル出力機能を用いて出力し,そう
1398 でないログ情報の出力はシステムログタスクに任せる.
1399
1400 ログバッファに記録するログ情報の重要度と,低レベル出力を用いて出力する
1401 ログ情報の重要度を適切に設定する.また,ログバッファからログ情報を読み
1402 出して外部へ通知するシステムログタスクと,低レベルの文字出力関数を用意
1403 する.
1404
1405 (b) すべてのログ情報を,低レベル出力機能を用いて出力する.
1406
1407 必要なログ情報はすべて低レベル出力機能を用いて出力するよう設定
1408 (vmsk_log の第1パラメータを 0 に設定)する.また,低レベルの文字出力
1409 関数を用意する.システムログタスクは不要.
1410
1411 (c) ログ情報はメモリ上に記録するだけで,システム外部には出力しない.
1412
1413 必要なログ情報はすべてログバッファへ記録するように設定(vmsk_log の第2
1414 パラメータを 0 に設定)する.システムログタスクは不要.
1415
1416 (d) ログ情報は記録も出力もしない.
1417
1418 いずれのログ情報も記録/出力しないように設定(vmsk_log の両パラメータ
1419 ともに 0 に設定)する.
1420
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 は,アプリケーションから呼び出す必要がある.
1430
1431 なお,(b)〜(c) の設定に固定して使用する場合にも,カーネル内の一部のコー
1432 ドが不要になり,コードサイズを小さくできる余地があるが,簡易な方法は用
1433 意していない.
1434
1435
1436 5.システムサービス
1437
1438 この節では,JSPカーネルがサポートしているシステムインタフェースレイヤ
1439 (SIL)と,JSPカーネルが標準的に動作させるドライバおよびシステムタスク
1440 について説明する.
1441
1442 5.1 システムインタフェースレイヤ(SIL)
1443
1444 JSPカーネルは,ITRONデバイスドライバ設計ガイドラインの一部分として検討
1445 されているシステムインタフェースレイヤ(SIL)の中で,以下に挙げる機能
1446 をサポートしている.SILを用いるプログラムからは,t_services.hに代えて,
1447 s_services.hをインクルードする.
1448
1449 ITRONデバイスドライバ設計ガイドラインでは,デバイスドライバの中で,SIL
1450 を通して直接デバイスにアクセスするモジュール(PDIC)と,カーネルの機能
1451 を用いるモジュール(GDIC)を分離することにしている.すなわち,PDICは
1452 SILを用いるがカーネルの機能は用いず,GDICはカーネルの機能は用いるがSIL
1453 を用いてはならない.そのため,s_services.hには,カーネルを用いるための
1454 宣言や定義は含まれていない.
1455
1456 5.1.1 割込みロック状態の制御
1457
1458 デバイスを扱うプログラムの中では,すべての割込み(NMIを除く,以下同じ)
1459 を禁止したい場合がある.μITRON4.0仕様のCPUロック状態は,カーネルの管
1460 理外の割込み(NMI以外にカーネルの管理外の割込みがあるかは,JSPカーネル
1461 ではターゲット依存)を禁止するとは限らず,このような場合に用いるのは適
1462 切でない.
1463
1464 そこで,すべての割込みを禁止した状態を割込みロック状態と呼び,SILでは
1465 割込みロック状態を制御するための以下の機能を用意している.
1466
1467 (1) SIL_PRE_LOC
1468
1469 割込みロック状態の制御に必要な変数を宣言し,それを初期化するマクロ.こ
1470 のマクロを記述した時点で,割込みの禁止状態を記録する.SIL_LOC_INT,
1471 SIL_UNL_INTを用いる関数(ブロック)の先頭の変数宣言部に記述しなければ
1472 ならない.
1473
1474 (2) SIL_LOC_INT()
1475
1476 すべての割込みを禁止し,割込みロック状態に移行する.
1477
1478 (3) SIL_UNL_INT()
1479
1480 SIL_PRE_LOCを記述した時点の状態に戻す.
1481
1482 割込みロック状態の制御機能の使用例は次の通り.
1483
1484         {
1485                 SIL_PRE_LOC;
1486
1487                 SIL_LOC_INT();
1488                 この間はすべての割込みが禁止される
1489                 この間にサービスコールを呼び出してはならない
1490                 SIL_UNL_INT();
1491         }
1492
1493 なお,JSPカーネル自身は割込みロック状態は管理していないため,割込ロッ
1494 ク状態ではサービスコールを呼び出してはならない(呼び出した場合の動作は
1495 保証されない).
1496
1497 5.1.2 微少時間待ち
1498
1499 デバイスをアクセスする際に,微少な時間待ちを入れなければならない場合が
1500 ある.そのような場合に,nopをいくつか入れるなどの方法で対応すると,ポ
1501 ータビリティが悪くなる.そこでSILでは,微少な時間待ちを行うための機能
1502 を用意している.
1503
1504 (1) void sil_dly_nse(UINT dlytim)
1505
1506 dlytimで指定された以上の時間(単位はナノ秒),ループなどによって待つ.
1507 指定した値によっては,指定した時間よりもかなり長く待つ場合があるので注
1508 意すること.
1509
1510 5.1.3 エンディアン
1511
1512 プロセッサのエンディアンを知るためのマクロとして,以下のマクロを定義し
1513 ている.
1514
1515 (1) SIL_ENDIAN
1516
1517 リトルエンディアンプロセッサではSIL_ENDIAN_LITTLE(=0),ビッグエンディ
1518 アンプロセッサではSIL_ENDIAN_BIG(=1)にマクロ定義される.
1519
1520 5.1.4 メモリ空間アクセス関数
1521
1522 メモリ空間にマッピングされたデバイスレジスタや,デバイスとの共有メモリ
1523 をアクセスするために,以下の関数を用意している.
1524
1525 (1) VB sil_reb_mem(VP mem)
1526
1527 memで指定されるアドレスから,8ビット単位で読んだ値を返す.
1528
1529 (2) void sil_wrb_mem(VP mem, VB data)
1530
1531 memで指定されるアドレスに,dataで指定される値を8ビット単位で書き込む.
1532
1533 (3) VH sil_reh_mem(VP mem)
1534
1535 memで指定されるアドレスから,16ビット単位で読んだ値を返す.
1536
1537 (4) void sil_wrh_mem(VP mem, VH data)
1538
1539 memで指定されるアドレスに,dataで指定される値を16ビット単位で書き込む.
1540
1541 (5) VH sil_reh_lem(VP mem)
1542
1543 memで指定されるアドレスから,16ビット単位でリトルエンディアンで読んだ
1544 値を返す.リトルエンディアンプロセッサでは,sil_reh_memと一致する.
1545
1546 (6) void sil_wrh_lem(VP mem, VH data)
1547
1548 memで指定されるアドレスに,dataで指定される値を16ビット単位でリトルエ
1549 ンディアンで書き込む.リトルエンディアンプロセッサでは,sil_wrh_memと
1550 一致する.
1551
1552 (7) VH sil_reh_bem(VP mem)
1553
1554 memで指定されるアドレスから,16ビット単位でビッグエンディアンで読んだ
1555 値を返す.ビッグエンディアンプロセッサでは,sil_reh_memと一致する.
1556
1557 (8) void sil_wrh_bem(VP mem, VH data)
1558
1559 memで指定されるアドレスに,dataで指定される値を16ビット単位でビッグエ
1560 ンディアンで書き込む.ビッグエンディアンプロセッサでは,sil_wrh_memと
1561 一致する.
1562
1563 (9) VW sil_rew_mem(VP mem)
1564
1565 memで指定されるアドレスから,32ビット単位で読んだ値を返す.
1566
1567 (10) void sil_wrw_mem(VP mem, VW data)
1568
1569 memで指定されるアドレスに,dataで指定される値を32ビット単位で書き込む.
1570
1571 (11) VW sil_rew_lem(VP mem)
1572
1573 memで指定されるアドレスから,32ビット単位でリトルエンディアンで読んだ
1574 値を返す.リトルエンディアンプロセッサでは,sil_rew_memと一致する.
1575
1576 (12) void sil_wrw_lem(VP mem, VW data)
1577
1578 memで指定されるアドレスに,dataで指定される値を32ビット単位でリトルエ
1579 ンディアンで書き込む.リトルエンディアンプロセッサでは,sil_wrw_memと
1580 一致する.
1581
1582 (13) VW sil_rew_bem(VP mem)
1583
1584 memで指定されるアドレスから,32ビット単位でビッグエンディアンで読んだ
1585 値を返す.ビッグエンディアンプロセッサでは,sil_rew_memと一致する.
1586
1587 (14) void sil_wrw_bem(VP mem, VW data)
1588
1589 memで指定されるアドレスに,dataで指定される値を32ビット単位でビッグエ
1590 ンディアンで書き込む.ビッグエンディアンプロセッサでは,sil_wrw_memと
1591 一致する.
1592
1593 なお,JSPカーネルのターゲット非依存部では,I/O空間にアクセスするための
1594 関数を用意していないが,ターゲット依存部でサポートすることは可能である.
1595 詳しくは,ターゲット毎のマニュアルを参照すること.
1596
1597 5.2 システムクロックドライバ
1598
1599 システムクロックドライバは,ハードウェアタイマを用いて周期的に割込みを
1600 発生させ,isig_timを呼び出してカーネルにタイムティックを供給する.シス
1601 テムクロックドライバは,システムコンフィギュレーションファイルに
1602 timer.cfgをインクルードすることで,システムに組み込むことができる.
1603
1604 5.2.1 システムクロックドライバの内部構成
1605
1606 システムクロックドライバは,タイマの起動処理,タイマ割込みハンドラ,タ
1607 イマの停止処理で構成される.
1608
1609 (1) void timer_initialize(VP_INT exinf)
1610
1611 タイマの起動処理.タイマを初期化し,周期的なタイマ割込み要求を発生させ
1612 る.カーネルに初期化ルーチンとして登録する.exinfは無視する.
1613
1614 (2) void timer_handler()
1615
1616 タイマ割込みハンドラ.タイマ割込み要求をクリアした後,isig_timを呼び出
1617 してタイムティックを供給する.カーネルに割込みハンドラとして登録する.
1618
1619 (3) void timer_terminate(VP_INT exinf)
1620
1621 タイマの停止処理.周期的なタイマ割込み要求を停止させる.カーネルに終了
1622 処理ルーチンとして登録する.exinf は無視する.
1623
1624 5.3 シリアルインタフェースドライバ
1625
1626 シリアルインタフェースドライバは,シリアルポートを扱うためのドライバで
1627 ある.シリアルインタフェースドライバは,システムコンフィギュレーション
1628 ファイルにserial.cfgをインクルードすることで,システムに組み込むことが
1629 できる.
1630
1631 シリアルインタフェースドライバは,ポート毎にセマフォを2個ずつ使用する.
1632 セマフォを生成する静的APIは,serial.cfgに含まれている.
1633
1634 NEWLIBやGLIBCなどの標準Cライブラリを使用する場合には,標準Cライブラリ
1635 の低レベル入出力ルーチンをシリアルインタフェースドライバを呼び出すもの
1636 にすることで,タスクの標準入出力をシリアルインタフェースドライバ経由に
1637 切り替えることができる.具体的な方法は,用いる標準Cライブラリに依存す
1638 る.
1639
1640 5.3.1 シリアルインタフェースドライバのサービスコール
1641
1642 シリアルインタフェースドライバを呼び出すサービスコールの仕様は下記の通
1643 りである.この中で,シリアルポートのID番号(portid)の解釈はターゲット
1644 依存となる.
1645
1646 これらのサービスコールは,非タスクコンテキストから呼び出すことはできな
1647 い.また,serial_rea_datとserial_wri_datは,ディスパッチ保留状態で呼び
1648 出すことはできない.いずれも,呼び出した場合にはE_CTXエラーとなる.
1649
1650 (1) ER serial_opn_por(ID portid)
1651
1652 portidで示されるシリアルポートをオープンし,受信/送信が可能な状態にす
1653 る.
1654
1655 (2) ER serial_cls_por(ID portid)
1656
1657 portidで示されるシリアルポートをクローズする.
1658
1659 (3) ER_UINT serial_rea_dat(ID portid, char *buf, UINT len)
1660
1661 portidで示されるシリアルポートから,lenバイトの文字列を受信し,bufから
1662 の領域に入れる.lenバイト受信するまで,待ち状態となる.受信した文字数
1663 またはエラーコードを返す.
1664
1665 (4) ER_UINT serial_wri_dat(ID portid, char *buf, UINT len)
1666
1667 portidで示されるシリアルポートに,bufからのlenバイトの文字列を送信する.
1668 lenバイト送信バッファに入れるまで,待ち状態となる.送信した文字数また
1669 はエラーコードを返す.
1670
1671 (5) ER serial_ctl_por(ID portid, UINT ioctl)
1672
1673 portidで示されるシリアルポートの制御情報を,ioctlで示される値に設定す
1674 る.
1675
1676 ioctlには,以下の制御情報を表す定数を,ビット毎に論理和をとったものを
1677 指定する.
1678
1679     IOCTL_ECHO(エコーバックモード)
1680         このビットを設定すると,シリアルインタフェースドライバがエコー
1681         バックを行う.具体的には,バッファから文字を取り出す度に,その
1682         文字を書き出す.
1683
1684     IOCTL_CRLF(改行モード)
1685         LF(line feed)を書き出すと,CR(carriage return)+ LFに変換し
1686         て書き出す.
1687
1688     IOCTL_FCSND(出力フロー制御)
1689         文字を送信する処理に対して,XON/XOFFによるフロー制御を行う.
1690         すなわち,STOP(コントロール-S)を受信すると送信を停止し,
1691         START(コントロール-Q)を受信すると送信を再開する.
1692
1693     IOCTL_FCANY(送信フロー制御で任意の文字で送信再開)
1694         IOCTL_FCOUTを指定している時に,送信停止中に受信した任意の文字
1695         で送信を再開する.
1696
1697     IOCTL_FCRCV(受信フロー制御)
1698         文字を受信する処理に対して,XON/XOFFによるフロー制御を行う.
1699         すなわち,受信バッファの残り領域が少なくなるとSTOP(コントロー
1700         ル-S)を送出し,残り領域が増えればSTART(コントロール-Q)を送
1701         出する.
1702
1703 なお,オープン直後のデフォルトの設定値は(IOCTL_ECHO | IOCTL_CRLF |
1704 IOCTL_FCOUT | IOCTL_FCIN)である.
1705
1706 (6) ER serial_ref_por(ID portid, T_SERIAL_RPOR *pk_rpor)
1707
1708 portidで示されるシリアルポートの状態を参照し,pk_rporで指定されるパケッ
1709 トに返す.パケット中のreacntには受信バッファ中の文字数を,wricntには送
1710 信バッファ中の文字数を返す.
1711
1712 5.3.2 シリアルインタフェースドライバの内部構成
1713
1714 シリアルインタフェースドライバは,前記のサービスコールに加えて,初期化
1715 処理と割込みハンドラで構成される.初期化処理は,カーネルに初期化ルーチ
1716 ンとして登録する.割込みハンドラは,カーネルに割込みハンドラとして登録
1717 する.これらの登録処理はserial.cfgに含まれる.
1718
1719 (1) void serial_initialize(VP_INT exinf)
1720
1721 シリアルインタフェースドライバを初期化する.カーネルに初期化ルーチンと
1722 して登録する.exinfは無視する.
1723
1724 (2) 割込みハンドラ
1725
1726 シリアルI/Oデバイスの種類によって,割込みハンドラの種類や数は異なる.
1727 具体的には,送信割込みと受信割込みが別れているものと別れていないものや,
1728 ポートを複数持つシリアルI/Oデバイスでポート毎に割込みハンドラが別れて
1729 いるものと別れていないものがある.シリアルインタフェースドライバの割込
1730 みハンドラは,カーネルに割込みハンドラとして登録する.
1731
1732 5.4 システムログタスク
1733
1734 システムログタスクは,カーネル内のログバッファからログ情報を取り出し,
1735 デバイスにアクセスするサービスを用いて外部に出力するタスクである.
1736
1737 JSPカーネルの標準配布キットに含まれるシステムログタスクは,シリアルイ
1738 ンタフェースにログ情報を文字列の形で出力するもので,システムログタスク
1739 の一例という位置付けで提供している.このシステムログタスクは,システム
1740 コンフィギュレーションファイルにlogtask.cfgをインクルードすることで,
1741 システムに組み込むことができる.
1742
1743
1744 6.サポートライブラリ
1745
1746 サポートライブラリは,アプリケーションやシステムサービスを作成するため
1747 に利用できるライブラリ関数群である.現バージョンでは,システムサービス
1748 やサンプルプログラムで使う最低限の関数しか用意していない.
1749
1750 (1) const char *itron_strerror(ER ercd)
1751
1752 ercd で示されるメインエラーコードに対応するエラーコードの文字列を返す.
1753 返された文字列を書き換えてはならない.
1754
1755 (2) void t_perror(const char *file, int line, const char *expr, ER ercd)
1756     
1757 エラーメッセージをシステムログサービスに出力する.assertマクロなどで利
1758 用することを想定している.
1759
1760
1761 7.開発環境・インストール・ポーティング
1762
1763 7.1 ディレクトリ・ファイル構成
1764
1765 ソースファイルのディレクトリ構成は次の通り.
1766
1767     include/    共通ヘッダファイル
1768     kernel/     カーネルソースファイル
1769     systask/    システムサービスソースファイル
1770     library/     サポートライブラリソースファイル
1771     config/     ターゲット依存部
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 システム依存ファイル
1786         h8/             H8 プロセッサ依存ファイル
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上のシミュレーション環境依存ファイル
1843     tools/      開発環境依存ディレクトリ
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ドライバ(シリアルドライバが使用するもの)
1852     cfg/        カーネルコンフィギュレータ
1853     utils/      ユーティリティ
1854         h8/             H8用ベクターテーブル生成ユーティリティ
1855         h8-renesas/     H8-RENESAS用ベクターテーブル生成ユーティリティ
1856         m16c-renesas/   M16C-RENESAS用ベクターテーブル生成ユーティリティ 
1857     sample/     サンプルプログラムと Makefile
1858     doc/        ドキュメント
1859     windev/     Windowsデバイスマネージャ
1860
1861 ターゲット非依存部(カーネルコンフィギュレータは除く)の各ファイルの概
1862 要は次の通り.
1863
1864     README              TOPPERS/JSPカーネルの簡単な紹介
1865     configure           コンフィギュレーションスクリプト
1866
1867     include/
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サポート
1882
1883     kernel/
1884         Makefile.kernel カーネルのファイル構成の定義
1885         jsp_kernel.h    JSPカーネル用 標準インクルードファイル
1886         jsp_rename.def  カーネルの内部識別名のリネーム定義
1887         jsp_rename.h    カーネルの内部識別名のリネーム
1888         jsp_unrename.h  カーネルの内部識別名のリネーム解除
1889         check.h         エラーチェック用マクロ
1890         queue.h         ダブルリンクキューの構造と操作
1891         startup.c       カーネルの初期化処理
1892         banner.c        カーネルの起動メッセージの出力
1893         task.h          タスク操作ルーチン関連の定義
1894         task.c          タスク操作ルーチン
1895         wait.h          待ち状態操作ルーチン関連の定義
1896         wait.c          待ち状態操作ルーチン
1897         time_event.h    タイムイベント管理関連の定義
1898         time_event.c    タイムイベント管理
1899         syslog.h        システムログ機能関連の定義
1900         syslog.c        システムログ機能
1901         task_manage.c   タスク管理機能
1902         task_sync.c     タスク付属同期機能
1903         task_except.c   タスク例外処理機能
1904         semaphore.h     セマフォ機能関連の定義
1905         semaphore.c     セマフォ機能
1906         eventflag.h     イベントフラグ機能関連の定義
1907         eventflag.c     イベントフラグ機能
1908         dataqueue.h     データキュー機能関連の定義
1909         dataqueue.c     データキュー機能
1910         mailbox.h       メールボックス機能関連の定義
1911         mailbox.c       メールボックス機能
1912         mempfix.h       固定長メモリプール関連の定義
1913         mempfix.c       固定長メモリプール
1914         time_manage.c   システム時刻管理機能
1915         cyclic.h        周期ハンドラ機能関連の定義
1916         cyclic.c        周期ハンドラ機能
1917         sys_manage.c    システム管理機能
1918         interrupt.h     割込み管理機能関連の定義
1919         interrupt.c     割込み管理機能
1920         exception.h     CPU例外管理機能関連の定義
1921         exception.c     CPU例外管理機能
1922
1923     systask/
1924         timer.c         システムクロックドライバ
1925         timer.cfg       システムクロックドライバの設定記述
1926         serial.c        シリアルインタフェースドライバ
1927         serial.cfg      シリアルインタフェースドライバの設定記述
1928         logtask.c       システムログタスク
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対応ランタイム
1937
1938     library/
1939         log_output.c    システムログ機能用ライブラリ関数(syslog_outputなど)
1940         strerror.c      itron_strerror関数
1941         t_perror.c      t_perror関数
1942         vasyslog.c      syslog関数
1943
1944     utils/
1945         makedep         依存関係定義の生成
1946         genoffset       offset.h 生成プログラム
1947         gencheck        パラメータチェック用ファイルの生成
1948         genrename       内部シンボルリネーム定義の生成
1949         rename          内部シンボルのリネーム処理
1950
1951     sample/
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)の本体
1964
1965     doc/
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カーネル 設計メモ
1992
1993 7.2 開発環境
1994
1995 JSPカーネルを用いたシステム構築には,以下のツールが必要である.
1996
1997     ホスト環境用のツール
1998         標準規格に準拠したCコンパイラ,Cライブラリ
1999         C++コンパイラ,C++ライブラリ,STL
2000                 動作確認: GNU C++ 2.95.3,3.2,3.3(Linux環境)
2001                           GNU C++ 3.2(Cygwin環境)
2002                           Visual C++ 6.0,.NET
2003         perl(動作確認は 5.6.1)
2004         GNU Make(動作確認は 3.79.1)
2005
2006     クロス環境用のツール
2007         GNU開発環境
2008             BINUTILS(アセンブラ,リンカなど)
2009             GCC または GCC-CORE(Cコンパイラ)
2010             GDB(デバッガ)
2011         NEWLIB(標準Cライブラリ)
2012
2013 GNU開発環境をインストール方法については,「GNU開発環境構築マニュアル」
2014 を用意しているので,それを参照するとよい.また,動作確認バージョンにつ
2015 いては,ターゲット毎のマニュアルを参照すること.
2016
2017 ホスト環境用のCコンパイラとCライブラリは,クロス環境用のツールのインス
2018 トールに必要になる.また,C++コンパイラ,C++ライブラリと STL(Standard
2019 Template Library)は,カーネルのコンフィギュレーションツールのコンパイ
2020 ルに必要である.クロス環境用のツールとコンフィギュレーションツールをバ
2021 イナリで入手した場合には,これらのツールは必要ない.
2022
2023 クロス環境用の標準Cライブラリは,アプリケーションが標準Cライブラリを使
2024 用しない場合には,必要ない.ただし,コンパイラが標準Cライブラリ関数
2025 (memcpy,memsetなど)を呼び出すコードを生成する場合があり,その場合に
2026 は標準Cライブラリが必要である.ないしは,生成したコードが呼び出す関数
2027 のみを自分で用意してもよい.
2028
2029 以下では,これらのツールが用意できていることを前提に,UNIXマシン(動作
2030 確認は Linux)上で構築手順を説明する.また以下の説明では,makeコマンド
2031 が GNU Make であるものとする(JSPカーネルの Makefile は,GNU Make の拡
2032 張機能を用いている).
2033
2034 7.3 コンフィギュレーションツールの構築
2035
2036 カーネルを構築する前に,まず,コンフィギュレーションツールをコンパイル
2037 する必要がある(コンフィギュレーションツールをバイナリで入手した場合に
2038 は,このステップは必要ない).
2039
2040 JSPカーネルのコンフィギュレーションツールは,コンフィギュレータ(cfgプ
2041 ログラム)とパラメータチェックプログラム(chkプログラム)から構成され
2042 る.コンフィギュレーションツールの使い方については,「7.9 コンフィギュ
2043 レーションツールの使い方」を参照すること.
2044
2045 コンフィギュレーションツール(cfgプログラムとchkプログラム)は,cfgディ
2046 レクトリに移動し,make dependで依存関係ファイル(Makefile.depend)を生
2047 成した後,makeコマンドにより生成される.
2048
2049     % cd cfg
2050     % make depend
2051     % make
2052
2053 7.4 サンプルプログラムの構築
2054
2055 次に,サンプルプログラムを構築する方法を説明する.
2056
2057 まず,サンプルプログラムのオブジェクトファイルを置くディレクトリを作成
2058 し,コンフィギュレーションスクリプトを実行する.例えば,オブジェクトファ
2059 イルを置くディレクトリを,JSPカーネルのソースファイルを展開したディレ
2060 クトリの下のOBJという名称のディレクトリにする場合には,次のコマンドを
2061 実行する(ディレクトリの場所は名称は任意に決めてよい).
2062
2063     % mkdir OBJ
2064     % cd OBJ
2065     % perl ../configure -C m68k -S dve68k
2066
2067 ここで,m68kはターゲットプロセッサ名,dve68kはターゲットシステム名であ
2068 る.これらのコンフィギュレーションスクリプトのオプションについては,次
2069 の節で説明する.
2070
2071 コンフィギュレーションスクリプトの実行により,カレントディレクトリには,
2072 サンプルプログラムを構築するためのMakefile,サンプルプログラム用のコン
2073 フィギュレーションファイル(sample1.cfg),サンプルプログラム本体
2074 (sample1.hおよびsample1.c)が生成される.
2075
2076 コンフィギュレーションスクリプトの実行後,必要であればMakefileを修正す
2077 る.Makefileの修正方法については,「7.7 Makefileの修正」を参照すること.
2078
2079 その後,make dependで依存関係ファイル(Makefile.depend)を生成した後,
2080 makeコマンドによりサンプルプログラムのロードモジュール(jspまたは
2081 jsp.exe)が生成できる.依存関係ファイルの生成には若干時間がかかる.
2082
2083     % make depend
2084     % make
2085
2086 ここで構築したサンプルプログラム(sample1.h,sample1.c,sample1.cfg)
2087 は,JSPカーネルの基本的な動作を確認するためのものである.このプログラ
2088 ムの概要説明は,sample1.cの先頭のコメントにある.
2089
2090 7.5 アプリケーションとカーネルを別々に構築する方法
2091
2092 前節で説明した方法では,アプリケーションとカーネルを同時に生成するため,
2093 オブジェクトファイルを置くディレクトリに非常に多くのファイルが作成され
2094 て,扱いにくくなる.そこで,カーネルを修正する頻度が低い場合には,カー
2095 ネルは事前に構築しておき,後でアプリケーションだけを構築する方法を用意
2096 している.以下では,サンプルプログラムを構築を例に,その手順について説
2097 明する.
2098
2099 まず,カーネルを構築するディレクトリを作成し,コンフィギュレーションス
2100 クリプトを実行する.例えば,カーネルを構築するディレクトリを,JSPカー
2101 ネルのソースファイルを展開したディレクトリの下のkernel_libという名称の
2102 ディレクトリにする場合には,次のコマンドを実行する(ディレクトリの場所
2103 は名称は任意に決めてよい).
2104
2105     % mkdir kernel_lib
2106     % cd kernel_lib
2107     % perl ../configure -C m68k -S dve68k
2108
2109 これにより,カーネルを構築するディレクトリに,Makefile,sample1.cfg,
2110 sample1.h,sample1.cが生成されるが,Makefile以外は使用しない.
2111
2112 make dependで依存関係ファイル(Makefile.depend)を生成した後,make
2113 libkernel.aによりカーネルライブラリ(libkernel.a)が生成できる.
2114
2115     % make depend
2116     % make libkernel.a
2117
2118 次に,アプリケーションを構築するディレクトリを作成し,コンフィギュレー
2119 ションスクリプトを実行する.例えば,アプリケーションを構築するディレク
2120 トリを,JSPカーネルのソースファイルを展開したディレクトリの下のAPLとい
2121 う名称のディレクトリにする場合には,次のコマンドを実行する(ディレクト
2122 リの場所は名称は任意に決めてよい).
2123
2124    % cd ..
2125    % mkdir APL
2126    % cd APL
2127    % perl ../configure -C m68k -S dve68k -L ../kernel_lib
2128
2129 ここで-Lオプションには,カーネルを構築したディレクトリのパスを指定する.
2130
2131 最後に,make dependで依存関係ファイル(Makefile.depend)を生成した後,
2132 makeコマンドによりサンプルプログラムのロードモジュール(jspまたは
2133 jsp.exe)が生成できる.
2134
2135     % make depend
2136     % make
2137
2138 この手順では,アプリケーション構築時にはカーネルの再構築が必要かチェッ
2139 クしないため,カーネルのソースコードを修正した場合には,カーネルを構築
2140 したディレクトリでmake libkernel.aを再実行する必要がある.また,アプリ
2141 ケーション構築時にカーネルライブラリが更新されたかチェックしないため,
2142 アプリケーションを構築したディレクトリで,ロードモジュールを削除した後
2143 にmakeを再実行する必要がある.
2144
2145 以上では,カーネルとアプリケーションを別々のディレクトリで構築したが,
2146 -Lオプションにカレントディレクトリ(".")を指定することで,同じディレ
2147 クトリで(別々に)構築することもできる.具体的には,次の手順となる.
2148
2149     % mkdir OBJ
2150     % cd OBJ
2151     % perl ../configure -C m68k -S dve68k -L .
2152     % make depend
2153     % make libkernel.a
2154     % make cleankernel
2155     % make
2156
2157 ここで,make cleankernelは,カーネルライブラリを生成するための中間ファ
2158 イルを削除するものである.この手順では,make dependによりカーネルライ
2159 ブラリに関する依存関係を生成しないため,カーネルのソースコードを修正し
2160 た場合には,必ずmake cleankernel(または,make clean)してから,make
2161 libkernel.aする必要があるので注意すること.さらに,ロードモジュールを
2162 削除した後にmakeを再実行する必要があるのは,前の場合と同様である.
2163
2164 7.6 コンフィギュレーションスクリプトの使い方
2165
2166 コンフィギュレーションスクリプトは,JSPカーネルおよびアプリケーション
2167 プログラムを構築するために必要な基本的なコンフィギュレーションを行うた
2168 めのプログラムである.JSPカーネルを用いてアプリケーションを作成する場
2169 合には,まずオブジェクトファイルを置くディレクトリを作成し,そのディレ
2170 クトリでコンフィギュレーションスクリプトを実行する.オブジェクトファイ
2171 ルを置くディレクトリの場所や名称は,任意に決めてよい.
2172
2173 コンフィギュレーションスクリプトに対するオプションは次の通り.
2174
2175     -C <プロセッサ名>
2176         ターゲットプロセッサ名またはシミュレーション環境名を,configディ
2177         レクトリの下のディレクトリ名称で指定する(必須).
2178
2179     -S <システム名>
2180         ターゲットシステム名を,configの下のプロセッサのディレクトリの
2181         下のディレクトリ名称で指定する.シミュレーション環境の場合には,
2182         指定する必要がない.
2183
2184     -T <開発環境名>
2185         開発環境名を,configの下のディレクトリ名称の後半の名称で指定す
2186         る.GNU開発環境を用いる場合には,指定する必要がない.
2187
2188     -A <アプリケーションプログラム名>
2189         アプリケーションプログラムの名称を指定する.省略した場合には,
2190         標準のサンプルプログラム(sample1)となる.
2191
2192     -U <オブジェクトファイル名>
2193         アプリケーションプログラムのメインのオブジェクトファイル(-A 
2194         で指定したアプリケーションプログラム名に".o"を付加したもの)以
2195         外に,リンクすべきオブジェクトファイルの名称を,".o"を付加した
2196         形で指定する.""で囲むことによって,複数のファイルを指定するこ
2197         とも可能である(-U オプションを複数使ってはならない).
2198
2199     -L <カーネルライブラリのディレクトリ名>
2200         事前に構築したカーネルを用いて,アプリケーションのみを構築する
2201         場合には,このオプションにカーネルライブラリ(libkernel.a)の
2202         置かれたディレクトリ名を指定する.このオプションの使用方法につ
2203         いては,「7.5 アプリケーションとカーネルを別々に構築する方法」
2204         を参照すること.
2205
2206     -D <JSPカーネルソースディレクトリ名>
2207         JSPカーネルのソースコードを置いたディレクトリ名を指定する.省
2208         略した場合には,configureの置かれているディレクトリとなる.
2209
2210 コンフィギュレーションスクリプトが行う処理は次の通りである.
2211
2212 (1) Makefileの生成
2213
2214 sampleディレクトリから適切なMakefileを選択し,必要な箇所を書き換えて,
2215 Makefileを生成する.
2216
2217 (2) サンプルプログラムの生成
2218
2219 指定したアプリケーションプログラムがsampleディレクトリにある場合,適切
2220 なサンプルプログラムのソースファイルを選択し,必要な箇所を書き換えて,
2221 サンプルプログラムのソースファイル(例えば,sample1.h,sample1.c,
2222 sample1.cfg)を生成する.
2223
2224 7.7 Makefileの修正
2225
2226 JSPカーネルの実行環境によっては,コンフィギュレーションスクリプトが生
2227 成したMakefileを修正することが必要になる.ここでは,Makefileの中で,修
2228 正が必要となる可能性の高い箇所について説明する.
2229
2230 なお,Makefileを修正した後にコンフィギュレーションスクリプトを再実行す
2231 ると,修正したMakefileが上書きされてしまうので注意すること(古いものが
2232 Makefile.bakに保存される).
2233
2234 (A) ターゲット名の定義
2235
2236 CPUはターゲットプロセッサ名,SYSはターゲットシステム名,TOOLは開発環境
2237 名に定義する.これらの定義は,コンフィギュレーションスクリプトが行う.
2238
2239 (B) オブジェクトファイルの拡張子の設定
2240
2241 Cygwin環境でコンパイルする時には,OBJEXTを"exe"に定義する必要がある.
2242 これは,Cygwin環境では,オブジェクトプログラムに拡張子"exe"が付加され
2243 るのに対応するためのものである.Cygwin環境であることを判定できれば,コ
2244 ンフィギュレーションスクリプトがこの定義を行う.
2245
2246 (C) 実行環境の定義(ターゲット依存)
2247
2248 ターゲットによっては,実行環境に対応してターゲット依存部のコードを差し
2249 換える場合がある.これを可能にするために,実行環境の名称をDBGENVに定義
2250 している.標準では,GDBスタブを用いることを想定して,これをGNU_STUBに
2251 定義しているが,ターゲット依存の定義を入れたMakefile.configで上書きさ
2252 れる場合もある.どのターゲットがどの実行環境に対応しているかは,ターゲッ
2253 ト毎のマニュアルを参照すること.
2254
2255 (D) カーネルライブラリのディレクトリ名の定義
2256
2257 KERNEL_LIBには,カーネルライブラリの置かれたディレクトリ名を定義する.
2258 この定義は,通常はコンフィギュレーションスクリプトが行うが,事後に
2259 KERNEL_LIBの定義を変更してもかまわない.
2260
2261 (E) 共通コンパイルオプションの定義
2262
2263 全体に共通するコンパイルオプションの追加が必要な場合には,下の変数の定
2264 義を変更する.そのコンパイルオプションが,特定のターゲットで常に必要な
2265 場合には,ターゲット依存の定義を入れたMakefile.configを修正すべきであ
2266 る.追加の可能性のあるコンパイルオプションについては,「7.8 コンパイル
2267 オプション」を参照のこと.
2268
2269     CDEFS       -D オプションを記述する.
2270     INCLUDES    -I オプションを記述する.
2271     COPTS       コンパイラに対するその他のオプションを記述する.
2272     LDFLAGS     リンカに対するオプションを記述する.
2273     LIBS        ライブラリリンクのためのオプションを記述する.
2274
2275 (F) アプリケーションプログラムに関する定義
2276
2277 アプリケーションプログラムが一つのCソースファイル(*.c)のみで構成され
2278 ている場合には,UNAMEにそのファイル名を定義すればよい.アプリケーショ
2279 ンプログラムが複数のソースファイルで構成される場合には,UNAMEにそのア
2280 プリケーション名を定義し,オブジェクトファイル名をUTASK_ASMOBJSおよび
2281 UTASK_COBJSに列挙する.いずれの場合にも,コンフィギュレーションファイ
2282 ルは,UNAMEに定義した名前に拡張子"cfg"を付加した名前とする.
2283
2284 ソースファイルをコンパイルするのとは別のディレクトリに置く場合には,
2285 UTASK_DIRSにそのディレクトリを追加する.また,アプリケーションのコンパ
2286 イルに必要なコンパイルオプションや,アプリケーションがライブラリを必要
2287 とする場合には,UTASK_CFLAGSおよびUTASK_LIBS に定義する.
2288
2289 (G) オブジェクトファイル名の定義
2290
2291 オブジェクトファイル名をOBJNAMEに定義する.デフォルトはjspである.
2292
2293 (H) ターゲットファイルの定義
2294
2295 ロードモジュールの形式を指定する.具体的には,ELF形式の時は$(OBJFILE) 
2296 または$(OBJNAME).out(PARTNER-J環境の時),バイナリ形式の時は
2297 $(OBJNAME).bin,モトローラ S形式の時は$(OBJNAME).srecを指定する.
2298 $(OBJFILE) は,Cygwin環境でOBJEXTを"exe"に定義した時には$(OBJNAME).exe,
2299 そうでない場合には$(OBJNAME)となる.
2300
2301 (I) カーネルのコンフィギュレーションファイルの生成
2302
2303 ソフトウェア部品のコンフィギュレータを追加する場合には,この規則を修正
2304 することが必要である.
2305
2306 7.8 コンパイルオプション
2307
2308 JSPカーネルのコード中には,assertマクロが使われている.assertマクロは,
2309 NDEBUGを定義することで,オブジェクトコード中から消すことができる.カー
2310 ネルのデバッグが終了すれば,CDEFSに-DNDEBUGを指定してコンパイルした方
2311 が効率がよくなる.
2312
2313 また,システムログ機能を取り外すためのOMIT_SYSLOGを用意している.詳し
2314 くは,「4.8 システムログ機能の設定方法」を参照すること.
2315
2316 7.9 コンフィギュレーションツールの使い方
2317
2318 以下では,cfgプログラムとchkプログラムのオプションについて説明する.こ
2319 れらのプログラムによるコンフィギュレーション手順については,「2.10 静
2320 的APIとコンフィギュレータ」を参照すること.
2321
2322 cfgプログラムとchkプログラムに共通のオプションは次の通り.
2323
2324     -cpu <プロセッサ名>
2325         ターゲットプロセッサ名を指定する.
2326
2327     -system <システム名>
2328         ターゲットシステム名を指定する.
2329
2330     -h, --help
2331         ヘルプメッセージを表示する.
2332
2333     -v
2334         処理の途中結果を表示する.
2335
2336     -le, --english
2337         メッセージを英語で表示する(デフォルト).
2338
2339     -lj, --japanese
2340         メッセージを日本語で表示する.
2341
2342 cfgプログラムに対するオプションは次の通り.
2343
2344     -s, --source <ファイル名>
2345         <ファイル名>で指定されたシステムコンフィギュレーションファイル
2346         (C言語のプリプロセッサで処理したもの)を読み込む.<ファイル名>
2347         を省略した場合は,システムコンフィギュレーションファイルを標準
2348         入力から読み込む(オプション自身を省略してはならない).
2349
2350     -c, --check
2351         静的APIのパラメータチェックに用いるファイルをkernel_chk.cに生
2352         成する(デフォルトでは生成しない).
2353
2354     -obj, --dump-object <ファイル名>
2355         静的APIの解析内容を含むオブジェクト定義ファイルを,<ファイル名>
2356         で指定されたファイルに生成する.<ファイル名>を省略した場合は,
2357         kernel_obj.datに生成する.
2358
2359     -z, --nonzero
2360         __EMTPY_LABELマクロの使用を抑止する.
2361
2362     -ao=xxx
2363         IDの割付順序を指定する.xxxに指定できる内容は次の通り.
2364
2365         alphabetic          名称の昇順(Aに近いものほど小さな値)
2366         fcfs                定義順の昇順 (先に宣言したものほど小さな値)
2367         alphabetic,reverse  名称の降順
2368         fcfs,reverse        定義順の降順
2369
2370     -id=<ファイル名>
2371         自動ID割付け結果ヘッダファイル(kernel_id.h)の名称を変更する.
2372
2373     -cfg=<ファイル名>
2374         カーネル構成ファイル(kernel_cfg.c)の名称を変更する.
2375
2376     -oproto
2377         ハンドラやタスク本体などの関数のプロトタイプ宣言をカーネル構成
2378         ファイル(kernel_cfg.c)に出力する.
2379
2380     -il
2381         カーネル関連のヘッダをインクルードする際に,"ファイル名" ではなく
2382         <ファイル名> を使用する.
2383
2384     -1.3
2385         TOPPERS/JSPカーネル Release 1.3互換の形式で生成する.
2386         (注意: -1.3で生成したファイルは1.4以降では使用できない)
2387
2388     -iapi
2389         カーネルコンフィギュレータが処理できない静的APIを無視する.
2390
2391     -t
2392         カーネルコンフィギュレータが処理できない静的APIを標準出力に出力
2393         する.
2394
2395     -ext
2396         標準外の拡張機能の使用を許可する.
2397
2398 chkプログラムに対するオプションは次の通り.
2399
2400     -m, --module <モジュール記述>
2401         チェックするロードモジュールを指定する.標準のchkプログラムは,
2402         ロードモジュールのシンボルファイル(GNU BINUTILSのnmが出力する
2403         形式)とモトローラSレコードファイルを読み込んでパラメータチェッ
2404         クを行なう.この場合,<モジュール記述>には,シンボルファイルと
2405         Sレコードファイルの2つを","で区切って指定する.
2406
2407     -cs, --script <ファイル名>
2408         <ファイル名>で指定されたチェックファイルを用いてチェックする.
2409         チェックファイルとは,cfgプログラムが生成したkernel_chk.cを,
2410         コンパイラおよび utils/gencheck により加工したファイルのことで
2411         ある.このオプションを省略した場合,いくつかのチェックが行われ
2412         なくなる.オプションを指定した場合には,<ファイル名>は省略でき
2413         ない.
2414
2415     -obj, --load-object <ファイル名>
2416         静的APIの解析内容を含むオブジェクト定義ファイルを,<ファイル名>
2417         で指定されたファイルから読み込む.<ファイル名>を省略した場合は,
2418         kernel_obj.datから読み込む.
2419
2420     -cl <エラーレベル>
2421         エラー検出レベルを変更する.レベルはLAZY(重大なエラーのみ検
2422         出),STANDARD(ITRON仕様の範囲のみで検出),TOPPERS(JSPカー
2423         ネルの制限違反まで検出),RESTRICTED(すべてのエラーを検出)の
2424         4種類のうちから選択する(デフォルトはRESTRICTED).
2425
2426 7.10 リンカスクリプトとメモリ領域
2427
2428 JSPカーネルのリンク方法は,ターゲット依存のリンカスクリプト(*.ld)に
2429 記述されている.サンプルプログラムの Makefile では,ターゲット依存の定
2430 義を入れた Makefile.config の中で LDSCRIPT を定義すると,定義した名前
2431 のファイルをリンカスクリプトに用いる.
2432
2433 JSPカーネル動作時には,以下のメモリ領域が必要になる.
2434
2435 (a) コード領域
2436
2437 カーネルおよびアプリケーションのプログラムおよび定数データが置かれる領
2438 域.ROM上に置くことも可能である.先頭アドレスを,カーネルをリンクする
2439 際の -Ttext オプションで指定する.サンプルプログラムの Makefile では,
2440 ターゲット依存の定義を入れた Makefile.config の中で TEXT_START_ADDRESS 
2441 を定義すると,リンク時に -Ttext オプションが付加される.
2442
2443 (b) データ領域
2444
2445 カーネルおよびアプリケーションの使用するデータ領域.固定的なデータ領域
2446 と,sbrk関数によって取られるヒープ領域からなる.カーネルはヒープ領域を
2447 使用しない.先頭アドレスを,カーネルをリンクする際の -Tdata オプション
2448 で指定する.サンプルプログラムの Makefile では,ターゲット依存の定義を
2449 入れた Makefile.config の中で DATA_START_ADDRESS を定義すると,リンク
2450 時に -Tdata オプションが付加される.
2451
2452 (c) 非タスクコンテキスト用のスタック領域
2453
2454 割込みハンドラなどの非タスクコンテキストが使用するスタック領域.領域の
2455 設定方法はターゲット依存であるが,通常は,ターゲットシステム依存のイン
2456 クルードファイル(sys_config.h)でスタックの初期値を定義し,ターゲット
2457 プロセッサ依存のスタートアップモジュール(start.S)中で初期化される.
2458
2459 7.11 他のターゲットへのポーティング
2460
2461 JSPカーネルを他のターゲットへポーティングするために必要な作業は,カー
2462 ネル自身のポーティング,システムサービスのポーティング,開発環境の構築
2463 と標準の開発環境との差異の吸収などからなる.詳しくは,「JSPカーネル タ
2464 ーゲット依存部 ポーティングガイド」(config.txt)を参照すること.
2465
2466 7.12 カーネルの内部識別子のリネーム
2467
2468 μITRON4.0仕様は,カーネルの内部識別子を_kernel_または_KERNEL_で始める
2469 ことを要求している.ところが,カーネルのソースコード中で直接このような
2470 識別子を用いると,識別子の長さが長くなり,可読性を損なう.そこでJSPカー
2471 ネルでは,xxxxxというカーネルの内部識別子を_kernel_xxxxxにリネームする
2472 仕組みを入れている.
2473
2474 ところが,この仕組みにより,デバッグ作業が非効率になるケースが考えられ
2475 る.具体的には,ソースコード中の識別子がオブジェクトコード中の識別子と
2476 一致しないために,ソースコード中の変数を指定してその値を読んだり,関数
2477 を指定してそこにブレークポイントを置くといったことができない.
2478
2479 この問題を解決するために,JSPカーネルでは,ソースコード中の必要な識別
2480 子をリネームするためのユーティリティ(utils/rename)を用意している.
2481 renameユーティリティに,リネーム定義ファイル(xxx_rename.def)のプリ
2482 フィックス(xxxの部分)と,リネームしたいファイルリストを与えると,リ
2483 ネーム処理を行なう.例えば,kernelディレクトリのすべてのファイルに対し
2484 て,カーネルの内部識別名をリネームするには,次のコマンドを用いればよい.
2485
2486     % cd kernel
2487     % ../utils/rename jsp *
2488
2489
2490 8.その他
2491
2492 8.1 ウェブサイト
2493
2494 TOPPERSプロジェクトおよびJSPカーネルのためのウェブサイトを,以下のURL
2495 に用意している.
2496
2497         http://www.toppers.jp/
2498
2499 配付キットの最新版は,このウェブサイトからダウンロードすることができる.
2500 また,後述のメーリングリストのアーカイブなども,このウェブサイトで閲覧
2501 することができる.
2502
2503 8.2 利用条件・著作権
2504
2505 JSPカーネルの利用条件は,各ファイルの先頭に明示されている(このドキュ
2506 メントの先頭にもついている).著作権は,各ファイルの先頭に表示されてい
2507 る著作権者が保有している.
2508
2509 利用条件の (3) の (b) において,利用の形態をTOPPERSプロジェクトに報告
2510 する方法としては,JSPカーネルを利用した製品の名称と応用分野,製品化し
2511 た会社名と業種等の情報を,以下のURLのページから報告するものとする.
2512
2513         http://www.toppers.jp/report.html
2514
2515 またその際に,JSPカーネルを使用してのコメントやご意見もいただけると幸
2516 いである.
2517
2518 8.3 保証・サポート・適用性
2519
2520 JSPカーネルは無保証で提供されているものである.開発者は,その適用可能
2521 性も含めて,いかなる保証も行わない.また,サポートの約束もしていない.
2522 質問がある場合は,後述のメーリングリストを利用していただけると幸いであ
2523 る.
2524
2525 8.4 メーリングリスト
2526
2527 JSPカーネルのユーザに対する情報提供およびユーザ相互間の情報交換を容易
2528 にするために,TOPPERSユーザズメーリングリストを用意している.このメー
2529 リングリストには,誰でも自由にメールを送付することができる.また,送付
2530 されたメールは,誰でも自由にウェブサイトで読むことができる.JSPカーネ
2531 ルにバグや問題点を発見した場合には,このメーリングリストに報告して欲し
2532 い.
2533
2534 メーリングリストへのメールの送付先は次の通り.
2535
2536         users@toppers.jp
2537
2538 メーリングリストにバグや問題点などを報告する場合には,必要に応じて,次
2539 の情報を知らせて欲しい.
2540
2541     ターゲットに関する情報
2542         ・ターゲットプロセッサの種類
2543         ・ターゲットボードの種類
2544
2545     ホストに関する情報
2546         ・OSのバージョン(サービスパックの適用状況も)
2547         ・コンパイラなどの開発環境のバージョン(Cygwinのバージョンも)
2548
2549 このメーリングリストへの登録を希望する場合は,まず,
2550 users-ctl@toppers.jp 宛てに,本文に
2551
2552         subscribe あなたの名前
2553         例: subscribe Hiroaki Takada
2554
2555 と書いたメールを送付する(上記のコマンド中には半角英文字のみを使うこと).
2556 折り返し,登録確認のためのメールが送られてくるので,その指示に従って登
2557 録する.
2558
2559 8.5 TOPPERSプロジェクトへの参加
2560
2561 TOPPERSプロジェクトでは,何からの形でプロジェクトに貢献されたい方,プ
2562 ロジェクトで開発したソフトウェアをお使いの方,プロジェクトに興味をお持
2563 ちの方の参加を求めている.TOPPERSプロジェクトへの参加方法については,
2564 TOPPERSプロジェクトのウェブサイトを参照すること.
2565
2566 8.6 ミドルウェア用の Makefile
2567
2568 サンプルディレクトリにある Makefilew.mware はJSPカーネルにミドルウェア
2569 を組み合わせてコンパイルするための Makefile である.この Makefile から
2570 インクルードするミドルウェア用の Makefile では,以下の変数を定義するこ
2571 と.
2572
2573 (1) MTASK_CFG
2574 ミドルウェアのコンフィギュレーションファイル(ソース)を追加する.
2575
2576 (2) MTASK_KERNEL_CFG
2577 ミドルウェアのコンフィギュレータから出力され,JSPカーネル のシステムコ
2578 ンフィギュレーションファイルにインクルードされるファイルを追加する.
2579
2580 (3) MTASK_DIR
2581 ミドルウェアのディレクトリを追加する.
2582
2583 (4) MTASK_LCSRCS
2584 ミドルウェアをライブラリ化するソースファイルを追加する.
2585
2586 (5) MTASK_ASMOBJS
2587 ミドルウェアのアセンブリ言語のオブジェクトファイルを追加する.
2588
2589 (6) MTASK_CXXOBJS
2590 ミドルウェアの C++ 言語のオブジェクトファイルを追加する.
2591
2592 (7) MTASK_COBJS
2593 ミドルウェアの C 言語のオブジェクトファイルを追加する.
2594
2595 (8) MTASK_CFLAGS
2596 ミドルウェアをコンパイルするときのオプションを指定する.
2597
2598 (9) MTASK_LIBS
2599 ミドルウェアのライブラリを追加する.
2600
2601 (10) MAKE_MTASK
2602 ライブラリ化したミドルウェアを指定する.
2603
2604 9.リファレンス
2605
2606 9.1 サービスコール一覧
2607
2608 (1) タスク管理機能
2609
2610         ER ercd = act_tsk(ID tskid);
2611         ER ercd = iact_tsk(ID tskid);
2612  ER_UINT actcnt = can_act(ID tskid);
2613              void ext_tsk();
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);
2617
2618 (2) タスク付属同期機能
2619
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);
2631
2632 (3) タスク例外処理機能
2633
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();
2639
2640 (4) 同期・通信機能
2641
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);
2647
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);
2657
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);
2667
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);
2672
2673 (5) メモリプール管理機能
2674
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);
2679
2680 (6) 時間管理機能
2681
2682         ER ercd = set_tim(const SYSTIM *p_systim);
2683         ER ercd = get_tim(SYSTIM *p_systim);
2684         ER ercd = isig_tim();
2685
2686         ER ercd = sta_cyc(ID cycid);
2687         ER ercd = stp_cyc(ID cycid);
2688
2689 (7) システム状態管理機能
2690
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();
2706
2707 (8) 割込み管理機能
2708
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 はターゲット毎に定められる.
2714
2715 (9) CPU例外発生時のシステム状態参照
2716
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);
2722
2723 (10) 性能評価用システム時刻参照機能
2724
2725         ER ercd = vxget_tim(SYSUTIM *p_sysutim);
2726
2727 9.2 静的API一覧
2728
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 });
2743
2744 9.3 メインエラーコード一覧(JSPカーネルが返すもののみ)
2745
2746     E_PAR       -17             パラメターエラー
2747     E_ID        -18             不正ID番号
2748     E_CTX       -25             コンテキストエラー
2749     E_ILUSE     -28             サービスコール不正使用
2750     E_OBJ       -41             オブジェクト状態エラー
2751     E_QOVR      -43             キューイングオーバーフロー
2752     E_RLWAI     -49             待ち状態の強制解除
2753     E_TMOUT     -50             ポーリング失敗またはタイムアウト
2754
2755 9.4 バージョン履歴
2756
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,
2763                                                 i386,H8Sの追加など
2764     2003年12月25日      Release 1.4             多数の改良
2765     2004年10月14日      Release 1.4 (PL=1)      SH2,M16C,SC33,PowerPC32,
2766                                                 Nios2の追加など
2767     2005年11月28日      Release 1.4 (PL=2)      M32C-Renesas, H8-Renesas,
2768                                                 H8S-Renesas, V850
2769     2007年6月1日        Release 1.4 (PL=3)      問題点の修正,東芝TLCS900の追加など
2770
2771 以上