source: anotherchoice/tags/jsp-1.4.4-full-UTF8/doc/config.txt@ 26

Last change on this file since 26 was 26, checked in by ykominami, 10 years ago

initial

File size: 88.5 KB
Line 
1
2 = JSPカーネル ターゲット依存部 ポーティングガイド =
3
4 (Release 1.4.3対応,最終更新: 22-Apr-2007)
5
6------------------------------------------------------------------------
7 TOPPERS/JSP Kernel
8 Toyohashi Open Platform for Embedded Real-Time Systems/
9 Just Standard Profile Kernel
10
11 Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
12 Toyohashi Univ. of Technology, JAPAN
13 Copyright (C) 2004-2005 by Embedded and Real-Time Systems Laboratory
14 Graduate School of Information Science, Nagoya Univ., JAPAN
15
16 上記著作権者
17は,以下の (1)〜(4) の条件か,Free Software Foundation
18 によってå…
19¬è¡¨ã•ã‚Œã¦ã„ã‚‹ GNU General Public License の Version 2 に記
20 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア
21 を改変したものを含む.以下同じ)を使用・複製・改変・再é…
22å¸ƒï¼ˆä»¥ä¸‹ï¼Œ
23 利用と呼ぶ)することを無償で許諾する.
24 (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
25 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
26 スコード中に含まれていること.
27 (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
28 用できる形で再é…
29å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é…
30å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨
31 者
32マニュアルなど)に,上記の著作権表示,この利用条件および下記
33 の無保証規定を掲載すること.
34 (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
35 用できない形で再é…
36å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã„ずれかの条件を満たすこ
37 と.
38 (a) 再é…
39å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€…
40マニュアルなど)に,上記の著
41 作権表示,この利用条件および下記の無保証規定を掲載すること.
42 (b) 再é…
43å¸ƒã®å½¢æ…
44‹ã‚’,別に定める方法によって,TOPPERSプロジェクトに
45 報告すること.
46 (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
47 害からも,上記著作権者
48およびTOPPERSプロジェクトをå…
49è²¬ã™ã‚‹ã“と.
50
51 本ソフトウェアは,無保証で提供されているものである.上記著作権者
52お
53 よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も
54 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直
55 接的または間接的に生じたいかなる損害に関しても,その責任を負わない.
56
57 @(#) $Id: config.txt,v 1.40 2007/05/28 02:06:45 honda Exp $
58------------------------------------------------------------------------
59
60
61このドキュメントでは,JSPカーネルのターゲット依存部で提供すべきデータ
62型や関数などについて解説する.
63
64JSPカーネルのターゲット依存部は,依存部の再利用性を考æ…
65®ã—,プロセッサ
66依存部,システム依存部,開発環境依存部に分離している.開発環境依存部に
67関しては,おおよその役割分担
68を決まっているが,プロセッサ依存部とシステ
69ム依存部については,役割分担
70が明確なわけではない.以下のデータ型や関数
71の多くは,どの依存部で定義してもかまわない.シミュレーション環境などの
72極端なケースでは,システム依存部をå…
73¨ãä½¿ã‚ãªã„ことも考えられる.
74
75JSPカーネルのデバイスドライバ等は,トロン協会において検討されているデ
76バイスドライバ設計ガイドラインに沿う形で実装
77している.デバイスドライバ
78設計ガイドラインWGの中間報告は,以下のURLからダウンロードすることがで
79きる.
80 http://www.ertl.jp/ITRON/GUIDE/device-j.html
81
82
831.システム構築環境
84
85JSPカーネルは,GNU開発環境を標準としており,コンフィギュレータや開発支
86援ユーティリティは,主にGNU開発環境と組み合わせて動作するように実装
87さ
88れている.そこで以下では,GNU開発環境を用いる場合を中心に説明する.そ
89れ以外の開発環境を用いる場合には,開発支援ユーティリティの改造が必
90要に
91なったり,一部のユーティリティが使用できないケースがある.
92
93(1) ターゲット略称の決定
94
95新しいターゲット依存部を作成する時は,プロセッサ略称とシステム略称を定
96める.また,GNU以外の開発環境を用いる場合には,開発環境略称を定める.
97これらの略称に用いる文字は,英文字,数字および "_" に限定する.
98
99(2) ターゲット依存部のファイルを置くためのディレクトリ
100
101ターゲット依存部のファイルを置くためのディレクトリを,config の下に作
102成する.ディレクトリ名は,ターゲット略称から以下のように決定する.ただ
103し,ディレクトリ名に含まれる英文字はすべて小文字とする.すなわち,ディ
104レクトリ名には,英小文字,数字および "_" のみを使うことができる.
105
106GNU開発環境を用いる場合には,config の下にプロセッサ略称を用いてプロセッ
107サ依存部のファイルを置くためのディレクトリ(プロセッサ依存部ディレクト
108リ)を,さらにその下にシステム略称を用いてシステム依存部のファイルを置
109くためのディレクトリ(システム依存部ディレクトリ)を作成する.
110
111GNU以外の開発環境を用いる場合には,config の下にプロセッサ略称と開発環
112境略称を "-" で連結した名称(例えば,"sh3-hitachi")で,プロセッサ依存
113部ディレクトリを作成する.さらにその下に,システム略称を用いてシステム
114依存部ディレクトリを作成する.これらのディレクトリには,GNU開発環境用
115のディレクトリに置かれているファイルと異なるファイルのみを置く.ファイ
116ルが置かれていない場合には,GNU開発環境用のディレクトリを参ç…
117§ã™ã‚‹ï¼ŽãŸ
118だし,Makefile.config に関しては,GNU開発環境用のディレクトリを参ç…
119§ã—
120ないため,同じ内
121容であっても用意しなければならない.
122
123(3) システム構築方法の設定
124
125プロセッサ依存部ディレクトリおよびシステム依存部ディレクトリの下に,そ
126れぞれ,システム構築方法を設定するための Makefile.config ファイルを用
127意する.これらのファイルは,Makefile からインクルードされる.
128
129プロセッサ依存部およびシステム依存部の Makefile.config で定義すべき変
130数には,開発環境のコマンド名を設定するもの,コンパイルオプションを設定
131するもの,その他のものがある.ここでは,その他の変数とその定義の方法に
132ついて説明する.
133
134(3-1) TEXT_START_ADDRESS テキストセクションのå…
135ˆé ­ç•ªåœ°
136(3-2) DATA_START_ADDRESS データセクションのå…
137ˆé ­ç•ªåœ°
138
139各セクションのå…
140ˆé ­ç•ªåœ°ã®æŒ‡å®šãŒå¿…
141要な場合には,これらの変数にå…
142ˆé ­ç•ªåœ°ã‚’
143定義する.
144
145(3-3) LDSCRIPT リンカスクリプトのファイル名
146
147専用のリンカスクリプトを用いる場合には,この変数にリンカスクリプトのファ
148イル名を定義する.ファイル名は,config ディレクトリからの相対パスで指
149定する.
150
151(4) 開発環境のコマンド名の設定
152
153(4-1) TARGET ターゲット名
154
155GNU開発環境を configure する場合に指定するターゲット名で,コンパイラ等
156のコマンド名のå…
157ˆé ­ã«ä»˜ä¸Žã•ã‚Œã‚‹æ–‡å­—列(最後の "-" は不要)に定義する.
158例えば,TARGET が m68k-unknown-elf に定義された場合には,コンパイラと
159して m68k-unknown-elf-gcc が使われる.この変数が定義されない場合には,
160単なる gcc が使われる.GNU以外の開発環境を用いる場合には,定義する必
161要
162がない.
163
164(4-2) CC Cコンパイラドライバの名称
165(4-3) CXX C++コンパイラドライバの名称
166(4-4) AS アセンブラの名称
167(4-5) LD リンカの名称
168(4-6) AR アーカイバの名称
169(4-7) NM nmプログラムの名称
170(4-8) RANLIB ranlibプログラムの名称
171(4-9) OBJCOPY objcopyプログラムの名称
172(4-10) OBJDUMP objdumpプログラムの名称
173
174GNU以外の開発環境を用いる場合に,それぞれのコマンドの名称に定義する.
175対応するコマンドがない場合や,コマンドパラメータが異なる場合には,
176Makefile 中のそのコマンドを呼び出している部分を変更する必
177要がある.GNU
178開発環境では,これらは TARGET を用いて定義されるので,定義する必
179要はな
180い.
181
182(5) コンパイルオプションの設定
183
184(5-1) CDEFS マクロ定義オプション(-D)
185(5-2) INCLUDES インクルードファイルのディレクトリ指定オプション(-I)
186(5-3) COPTS コンパイラに対するその他のオプション
187(5-4) LDFLAGS リンカに対するオプション
188(5-5) LIBS ライブラリリンク指定のためのオプション
189
190ターゲットに依存して,すべてのソースファイルにå…
191±é€šã™ã‚‹ã‚³ãƒ³ãƒ‘イルオプショ
192ンの追加が必
193要な場合には,オプションの種類毎に上に示した変数に定義する.
194
195システム依存部の Makefile.config でこれらの変数を定義する時は,":=" を
196用いて,それまでの定義に追加する形で行う.例えば,プロセッサ依存部で
197「-Wall -g -O2 -m68020-40」というオプションを追加したい場合には,以下
198の記述をプロセッサ依存部の Makefile.config に含める.
199
200 COPTS := $(COPTS) -Wall -g -O2 -m68020-40
201
202それに対して,システム依存部の Makefile.config は Makefile の最初でイ
203ンクルードされるため,このようなé…
204æ…
205®ã¯å¿…
206要ないが,変更に強くするために
207同様に扱うことにする.
208
209ほとんどの場合に,プロセッサ依存部の Makefile.config には以下の記述を
210含める必
211要がある.
212
213 GNU開発環境を用いる場合
214 INCLUDES := -I$(CONFIGDIR)/$(CPU)
215
216 その他の開発環境を用いる場合
217 INCLUDES := -I$(CONFIGDIR)/$(CPU)-$(TOOL) -I$(CONFIGDIR)/$(CPU)
218
219また,システム依存部の Makefile.config には以下の記述を含める必
220要があ
221る.
222
223 GNU開発環境を用いる場合
224 INCLUDES := $(INCLUDES) -I$(CONFIGDIR)/$(CPU)/$(SYS)
225
226 その他の開発環境を用いる場合
227 INCLUDES := $(INCLUDES) -I$(CONFIGDIR)/$(CPU)-$(TOOL)/$(SYS) \
228 -I$(CONFIGDIR)/$(CPU)/$(SYS)
229
230また,アセンブリ言語レベルの識別名が,C言語レベルの識別名のå…
231ˆé ­ã« "_"
232が付いたものになる場合には,いずれかの Makefile.config で CDEFS に
233-DLABEL_ASM を追加する.
234
235(5-6) STASK_DIR システムサービスのソースが置かれたディレクトリ
236(5-7) STASK_ASMOBJS アセンブラで記述されたシステムサービスのオブジェクト
237(5-8) STASK_COBJS C言語で記述されたシステムサービスのオブジェクト
238(5-9) STASK_CFLAGS システムサービスに対するコンパイルオプション
239(5-10) STASK_LIBS システムサービスに対するライブラリリンク指定
240
241システムサービス(システムログタスクやデバイスドライバなど)のソースが
242置かれたディレクトリ,それを構成するオブジェクトファイルのリスト,それ
243らをコンパイルする際に適用するコンパイルオプション,その構成に必
244要なラ
245イブラリリンク指定を行う場合には,上に示した変数に定義する.
246
247システム依存部の Makefile.config でこれらの変数を定義する時は,CDEFS
248などと同様の扱いが必
249要である.
250
251(5-11) KERNEL_DIR カーネルのソースが置かれたディレクトリ
252(5-12) KERNEL_ASMOBJS アセンブラで記述されたカーネルのオブジェクト
253(5-13) KERNEL_COBJS C言語で記述されたカーネルのオブジェクト
254(5-14) KERNEL_CFLAGS カーネルに対するコンパイルオプション
255
256カーネルのソースが置かれたディレクトリ,それを構成するオブジェクトファ
257イルのリスト,それらをコンパイルする際に適用するコンパイルオプションを
258指定する場合には,上に示した変数に定義する.
259
260システム依存部の Makefile.config でこれらの変数を定義する時は,CDEFS
261などと同様の扱いが必
262要である.
263
264ほとんどの場合に,プロセッサ依存部の Makefile.config には以下の記述を
265含める必
266要がある.
267
268 GNU開発環境を用いる場合
269 KERNEL_DIR := $(KERNEL_DIR):$(CONFIGDIR)/$(CPU)
270 KERNEL_ASMOBJS := $(KERNEL_ASMOBJS) cpu_support.o
271 KERNEL_COBJS := $(KERNEL_COBJS) cpu_config.o
272
273 その他の開発環境を用いる場合
274 KERNEL_DIR := $(KERNEL_DIR):$(CONFIGDIR)/$(CPU)-$(TOOL)
275 KERNEL_DIR := $(KERNEL_DIR):$(CONFIGDIR)/$(CPU)
276 KERNEL_ASMOBJS := $(KERNEL_ASMOBJS) cpu_support.o
277 KERNEL_COBJS := $(KERNEL_COBJS) cpu_config.o
278
279また,システム依存部ディレクトリの Makefile.config には以下の記述を含
280める必
281要がある.
282
283 GNU開発環境を用いる場合
284 KERNEL_DIR := $(KERNEL_DIR):$(CONFIGDIR)/$(CPU)/$(SYS)
285 KERNEL_ASMOBJS := $(KERNEL_ASMOBJS) sys_support.o
286 KERNEL_COBJS := $(KERNEL_COBJS) sys_config.o
287
288 その他の開発環境を用いる場合
289 KERNEL_DIR := $(KERNEL_DIR):$(CONFIGDIR)/$(CPU)-$(TOOL)/$(SYS)
290 KERNEL_DIR := $(KERNEL_DIR):$(CONFIGDIR)/$(CPU)/$(SYS)
291 KERNEL_ASMOBJS := $(KERNEL_ASMOBJS) sys_support.o
292 KERNEL_COBJS := $(KERNEL_COBJS) sys_config.o
293
294(6) オフセットファイルの生成
295
296アセンブリ言語で記述されるプログラムから,C言語の構造体にアクセスする
297場合には,構造体の各フィールドのオフセットを参ç…
298§ã™ã‚‹ã“とが必
299要である.
300JSPカーネルでは,必
301要なオフセット値をファイル(標準では offset.h)に出
302力するための仕組みとして,makeoffset.c と genoffset を用意している.
303makeoffset.c は,どのオフセット値をファイルに出力するかを指定するもの
304で,ターゲット依存部で用意する必
305要がある.genoffset は,現時点ではGNU
306開発環境にのみ対応している.
307
308makeoffset.c と genoffset を使うことで,例えば,TCB 中の texptn フィー
309ルドのオフセット値を TCB_texptn にマクロ定義することや,TCB 中のタスク
310コンテキストブロック(tskctxb)に含まれる pc フィールドのオフセット値
311を TCB_pc にマクロ定義することができる.また,TCB 中の enatex フィール
312ドのオフセット値,ビット位置,ビットマスクを,それぞれ TCB_enatex,
313TCB_enatex_bit,TCB_enatex_mask にマクロ定義することができる.マクロ定
314義するビット位置やビットマスクは,アクセスするサイズやエンディアンを指
315定することができる.
316
317GNU開発環境以外を用いる場合など,この仕組みでオフセットファイルを生成
318できない時には,offset.h をターゲット依存部で用意し,Makefile.config
319で OMIT_MAKEOFFSET をヌルストリング以外に定義する.
320
321makeoffset.c と genoffset に関するマニュアルは,現時点では用意できてい
322ない.使い方がわからない場合や,機能が足りない場合には,相談されたい.
323
324(7) スタートアップモジュールなど
325
326ターゲットによっては,ロードモジュールのå…
327ˆé ­ã¨æœ€å¾Œã«ãƒªãƒ³ã‚¯ã™ã¹ããƒ—ログ
328ラムを,ターゲット依存部で用意する必
329要がある.多くの場合,スタートアッ
330プモジュールをロードモジュールのå…
331ˆé ­ã«ãƒªãƒ³ã‚¯ã™ã‚‹å¿…
332要がある.
333
334ロードモジュールのå…
335ˆé ­ã«ãƒªãƒ³ã‚¯ã™ã¹ããƒ—ログラムがある場合には,
336Makefile.config において,そのオブジェクトファイル名を START_OBJS に定
337義し,それに対するコンパイルルールと依存関係作成ルールを定義しなければ
338ならない.ロードモジュールの最後にリンクすべきプログラムがある場合には,
339そのオブジェクトファイル名を END_OBJS に定義し,それに対するコンパイル
340ルールと依存関係作成ルールを定義しなければならない.
341
342例えば,スタートアップモジュールのソースファイルが start.S の場合には,
343Makefile.config に次のような記述をå…
344¥ã‚Œã‚‹ã¨ã‚ˆã„.
345
346 # スタートアップモジュールのオブジェクトファイル名
347 START_OBJS = start.o
348
349 # スタートアップモジュールのコンパイルルール
350 $(START_OBJS): %.o: %.S
351 $(CC) -c $(CFLAGS) $(KERNEL_CFLAGS) $<
352
353 # スタートアップモジュールの依存関係作成ルール
354 $(START_OBJS:.o=.d): %.d: %.S
355 @$(PERL) $(SRCDIR)/utils/makedep -C $(CC) \
356 -O "$(CFLAGS) $(KERNEL_CFLAGS)" $< >> Makefile.depend
357
358また,コンパイラに標準の crtbegin.o と crtend.o を用いる場合には,
359Makefile.config に次のような記述をå…
360¥ã‚Œã‚‹ã¨ã‚ˆã„.
361
362 # オブジェクトファイル名
363 START_OBJS = $(shell $(CC) -print-file-name=crtbegin.o)
364 END_OBJS = $(shell $(CC) -print-file-name=crtend.o)
365
366 # 依存関係作成ルール
367 $(START_OBJS:.o=.d): %.d:
368 $(END_OBJS:.o=.d): %.d:
369
370この場合,これらのファイルをコンパイルすることはないため,コンパイルルー
371ルは不要である.また,依存関係作成ルールはダミーでよい(依存関係作成ルー
372ルがないとエラーになる).
373
374なお,カーネル用のスタートアップモジュールからは,main 関数ではなく,
375kernel_start 関数を起動する必
376要がある.
377
378(8) リンカスクリプト
379
380開発環境に標準のリンカスクリプトが使用できない場合には,ターゲット依存
381部で用意する.
382
383
3842.アプリケーション用のインクルードファイル
385
386ターゲット依存部で提供すべきアプリケーション用の定義は次の通りである.
387これらの定義の中で,(1) および (2) は tool_defs.h に含めなければならな
388い.その他の定義は,cpu_defs.h または sys_defs.h(またはそれらからイン
389クルードされるファイル)に含める.
390
391(1) コンパイラ依存のデータ型の定義
392
393コンパイラ依存のデータ型を以下のシンボルに定義する.これらの定義は,
394typedef ではなく,#define によりマクロ定義しなければならない.
395
396(1-1) _int8_ 8ビットの整数型
397(1-2) _int16_ 16ビットの整数型
398(1-3) _int32_ 32ビットの整数型
399(1-4) _int64_ 64ビットの整数型
400
401各サイズの整数型を,これらのシンボルにマクロ定義する._int32_ 以外は,
402コンパイラがサポートしていない場合には定義する必
403要がない._int32_ の定
404義は必
405須である.
406
407(1-5) _bool_ BOOLの型
408
409BOOL は,標準では int に型定義されるが,それで不都合な場合には,適切な
410型を _bool_ にマクロ定義する.
411
412(1-6) _vp_int_ VP_INTの型
413
414VP_INT は,標準では VP に型定義されるが,それで不都合な場合(例えば,
415ポインタが16ビットで,int が32ビットの場合)には,適切な型を _vp_int_
416にマクロ定義する.
417
418(1-7) _intptr_ ポインタを格納できる整数型
419
420_intptr_ は,フォーマット出力において,int型もポインタ型も格納できる整
421数型として使用する.これを定義しない場合,long が使われる.
422
423(2) コンパイラの拡張機能のためのマクロ定義
424
425(2-1) inline インライン指定
426(2-2) Inline ファイル内
427のみに有効なインライン指定
428(2-3) asm インラインアセンブラ(最適化を許す)
429(2-4) Asm インラインアセンブラ(最適化を抑止)
430
431これらの中で,asm と Asm は,ターゲット依存部で用いていなければ定義す
432る必
433要がない.
434
435(3) タイムティックの定義
436
437(3-1) TIC_NUME タイムティックの周期の分子(単位: 1ミリ秒)
438(3-2) TIC_DENO タイムティックの周期の分母(単位: 1ミリ秒)
439
440(4) 割込みハンドラ/CPU例外ハンドラ関連の定義
441
442(4-1) INHNO 割込みハンドラ番号のデータ型
443(4-2) EXCNO CPU例外ハンドラ番号のデータ型
444
445(5) 割込みマスクと割込みマスクの変更/参ç…
446§é–¢é€£ã®å®šç¾©ï¼ˆã‚ªãƒ—ション)
447
448chg_ixx,get_ixx をターゲット依存にサポートする場合には,以下の定義お
449よび宣言をターゲット依存部で提供する.xx,xxxx,XXXX は,ターゲット毎
450に適切な文字列に定める.xxxx および XXXX は,4文字でなくてもよい.
451
452(5-1) IXXXX 割込みマスクのデータ型
453(5-2) ER chg_ixx(IXXXX ixxxx) chg_ixx のプロトタイプ宣言
454(5-3) ER get_ixx(IXXXX *p_ixxxx) get_ixx のプロトタイプ宣言
455
456(6) 割込み番号と割込みの禁止/許可関連の定義(オプション)
457
458dis_int,ena_int をターゲット依存にサポートする場合には,以下の定義お
459よび宣言をターゲット依存部で提供する.
460
461(6-1) INTNO 割込み番号のデータ型
462(6-2) ER dis_int(INTNO intno) dis_int のプロトタイプ宣言
463(6-3) ER ena_int(INTNO intno) ena_int のプロトタイプ宣言
464
465(7) 性能評価用システム時刻関連の定義(オプション)
466
467JSPカーネルは,研究への利用を主目的の一つとしていることから,ターゲッ
468ト依存に,性能評価用のサービスコール vxget_tim をサポート可能としてい
469る.vxget_tim をサポートする場合には,以下の定義および宣言をターゲット
470依存部で提供する.
471
472(7-1) SYSUTIM 性能評価用システム時刻のデータ型
473(7-2) ER vxget_tim(SYSUTIM *p_sysutim) vxget_tim のプロトタイプ宣言
474
475(8) ターゲット識別マクロの定義
476
477cpu_defs.h ではプロセッサ略称(cpu_defs.h の置かれているディレクトリ名
478を大文字にしたもの),sys_defs.h ではシステム略称(sys_defs.h の置かれ
479ているディレクトリ名を大文字にしたもの)をマクロ定義する.
480
481(9) プロセッサのエンディアンの定義
482
483(9-1) SIL_ENDIAN
484
485プロセッサがビッグエンディアンの場合には SIL_ENDIAN_BIG(=1),リトル
486エンディアンの場合には SIL_ENDIAN_LITTLE(=0)にマクロ定義する.
487
488(10) システムの停止処理の定義
489
490(10-1) kernel_abort(void)
491
492assertマクロにおけるアサーションの失敗や,サービスコールが致命的なエラー
493を返した場合に,システムを停止させる関数またはマクロ.kernel_exit を呼
494び出す方法も考えられるが,デバッグを容易にするためには,インライン関数
495かマクロで定義し,その場でシステムを停止させる処理に定義するのが望まし
496い(kernel_exit を呼び出すと,エラーが発生した時点の状æ…
497‹ã‹ã‚‰å¤‰åŒ–してし
498まう).
499
500
5013.カーネル用のデータ型や関数など
502
503ターゲット依存部で提供すべきカーネル用のデータ型や関数などは次の通りで
504ある.これらのデータ型やマクロの定義と関数のプロトタイプ宣言は,別に記
505述がない限り,cpu_config.h または sys_config.h(またはそれらからインク
506ルードされるファイル)に含める.また,関数の実体は,C言語の場合は
507cpu_config.c または sys_config.c に,アセンブリ言語の場合は
508cpu_support.S または sys_support.S に記述する.
509
510(0) インクルード方法に関するルール
511
512ヘッダファイルをインクルードする記述は,以下のルールに従うのを原則とす
513る.
514
515ANSI Cの標準インクルードファイルは,#include <…> でインクルードする.
516また,Makefile または Makefile.config で INCLUDES に -Iオプションで指
517定したディレクトリにあるファイルは,#include <…> でインクルードする.
518カーネルを構成するファイルからのインクルードに対しては,以下のディレク
519トリにあるファイルがこれに該当する(ターゲットにも依存).
520 jsp/include/
521 jsp/config/$(CPU)
522 jsp/config/$(CPU)/$(SYS)
523 jsp/config/$(CPU)-$(TOOL)
524 jsp/config/$(CPU)-$(TOOL)/$(SYS)
525 pdic/simple_sio
526
527その他のインクルードファイルは #include "…" でインクルードする.カー
528ネルを構成するファイルからのインクルードに対しては,以下のディレクトリ
529にあるファイルがこれに該当する(ターゲットにも依存).
530 jsp/kernel
531 jsp/systask
532
533(1) タスクコンテキストブロックのデータ型
534
535(1-1) CTXB
536
537ターゲット依存のタスクコンテキストを保存するために,TCB 中に持つことが
538必
539要なデータ構造の型.
540
541(2) システム状æ…
542‹å‚ç…
543§
544
545(2-1) BOOL sense_context(void)
546
547現在の実行コンテキストが,タスクコンテキストの場合は FALSE,非タスクコ
548ンテキストの場合は TRUE を返す関数.
549
550(2-2) BOOL sense_lock(void)
551
552現在のシステム状æ…
553‹ãŒï¼ŒCPUロック状æ…
554‹ã®å ´åˆã¯ TRUE,CPUロック解除状æ…
555‹ã®
556時は FALSE を返す関数.
557
558(2-3) BOOL t_sense_lock(void)
559
560タスクコンテキストにおいて,現在のシステム状æ…
561‹ãŒï¼ŒCPUロック状æ…
562‹ã®å ´åˆ
563は TRUE,CPUロック解除状æ…
564‹ã®æ™‚は FALSE を返す関数.この関数が,非タス
565クコンテキストから呼ばれることはない.
566
567(2-4) BOOL i_sense_lock(void)
568
569非タスクコンテキストにおいて,現在のシステム状æ…
570‹ãŒï¼ŒCPUロック状æ…
571‹ã®å ´
572合は TRUE,CPUロック解除状æ…
573‹ã®æ™‚は FALSE を返す関数.この関数が,タス
574クコンテキストから呼ばれることはない.
575
576※ 原理的には,sense_lock が提供されていれば t_sense_lock と
577i_sense_lock は必
578要なく,逆に t_sense_lock と i_sense_lock が提供され
579ていれば sense_lock を実現することはできるが,ターゲットに依存せずに高
580い実行効率を実現するために,ターゲット依存部が3つの関数を提供すること
581としている.
582
583(3) CPUロックとその解除
584
585(3-1) void t_lock_cpu(void)
586
587タスクコンテキストにおいて,CPUロック解除状æ…
588‹ã‹ã‚‰ï¼ŒCPUロック状æ…
589‹ã«é·ç§»
590させる関数.この関数が,CPUロック状æ…
591‹ã§å‘¼ã°ã‚Œã‚‹ã“とはない.また,非タ
592スクコンテキストから呼ばれることもない.
593
594(3-2) void t_unlock_cpu(void)
595
596タスクコンテキストにおいて,CPUロック状æ…
597‹ã‹ã‚‰ï¼ŒCPUロック解除状æ…
598‹ã«é·ç§»
599させる関数.この関数が,CPUロック解除状æ…
600‹ã§å‘¼ã°ã‚Œã‚‹ã“とはない.また,
601非タスクコンテキストから呼ばれることもない.
602
603(3-3) void i_lock_cpu(void)
604
605非タスクコンテキストにおいて,CPUロック解除状æ…
606‹ã‹ã‚‰ï¼ŒCPUロック状æ…
607‹ã«é·
608移させる関数.この関数が,CPUロック状æ…
609‹ã§å‘¼ã°ã‚Œã‚‹ã“とはない.また,タ
610スクコンテキストから呼ばれることもない.
611
612(3-4) void i_unlock_cpu(void)
613
614非タスクコンテキストにおいて,CPUロック状æ…
615‹ã‹ã‚‰ï¼ŒCPUロック解除状æ…
616‹ã«é·
617移させる関数.この関数が,CPUロック解除状æ…
618‹ã§å‘¼ã°ã‚Œã‚‹ã“とはない.また,
619タスクコンテキストから呼ばれることもない.
620
621(4) タスクディスパッチャ
622
623(4-1) void dispatch(void)
624
625タスクディスパッチャ(以下,単にディスパッチャと言う)を明示的に呼ぶた
626めの関数.タスクコンテキストから呼ばれたサービスコール処理から,CPUロッ
627ク状æ…
628‹ã§å‘¼ã°ã‚Œã‚‹ï¼Ž
629
630この関数が呼ばれると,関数を呼んだタスクのコンテキストを保存し, 実行
631できるタスクの中で最高優å…
632ˆé †ä½ã®ã‚¿ã‚¹ã‚¯ï¼ˆschedtsk)のコンテキストを復帰
633して実行状æ…
634‹ã¨ã™ã‚‹ï¼Žå®Ÿè¡Œã§ãã‚‹ã‚¿ã‚¹ã‚¯ãŒãªã„場合(schedtsk が NULL の場
635合)には,割込みを許可して,実行できるタスクができるまで待
636つ.ここで,
637実行できるタスクができるのを待
638つ間に起動された割込みハンドラの出口で,
639ディスパッチャが呼ばれないように対策することが必
640要である.å…
641·ä½“的には,
642実行できるタスクができるのを待
643つ間,一時的に非タスクコンテキストに切り
644換えるか,ディスパッチを保留するようにする.
645
646新たに実行状æ…
647‹ã«ãªã£ãŸã‚¿ã‚¹ã‚¯ãŒï¼Œã‚¿ã‚¹ã‚¯ä¾‹å¤–処理ルーチンの起動条件を満た
648していれば,タスク例外処理ルーチンを起動する.また,この関数を呼び出し
649たタスクが次に実行状æ…
650‹ã«ãªã£ãŸæ™‚,タスク例外処理ルーチンの起動条件を満
651たしていれば,タスク例外処理ルーチンの起動を行う.タスク例外処理ルーチ
652ンの起動には,ターゲット非依存部が提供する calltex または call_texrtn
653を用いることができる.
654
655(4-2) void exit_and_dispatch(void)
656
657現在実行中のコンテキストを捨て,ディスパッチャを呼び出すための関数.タ
658スクコンテキストから呼ばれたサービスコール(å…
659·ä½“的には,ext_tsk)処理
660またはカーネルの初期化処理から,CPUロック状æ…
661‹ã§å‘¼ã°ã‚Œã‚‹ï¼Ž
662
663この関数が呼ばれると,関数を呼んだタスクのコンテキストを保存せず,実行
664できるタスクの中で最高優å…
665ˆé †ä½ã®ã‚¿ã‚¹ã‚¯ï¼ˆschedtsk)のコンテキストを復帰
666して実行状æ…
667‹ã¨ã™ã‚‹ï¼Žå®Ÿè¡Œã§ãã‚‹ã‚¿ã‚¹ã‚¯ãŒãªã„場合(schedtsk が NULL の場
668合)の処理は,dispatch と同様である.
669
670新たに実行状æ…
671‹ã«ãªã£ãŸã‚¿ã‚¹ã‚¯ãŒï¼Œã‚¿ã‚¹ã‚¯ä¾‹å¤–処理ルーチンの起動条件を満た
672していれば,タスク例外処理ルーチンを起動する.
673
674この関数は,カーネルの初期化処理からも呼ばれるために,非タスクコンテキ
675ストからも呼ばれても正しく処理できることが必
676要である.なお,この関数か
677らはリターンしない.
678
679(5) 割込みハンドラ/CPU例外ハンドラの出å…
680¥å£å‡¦ç†
681
682(5-1) INTHDR_ENTRY(inthdr)
683(5-2) INT_ENTRY(inthdr)
684
685INTHDR_ENTRY(inthdr) は起動番地が inthdr の割込みハンドラを呼び出す出
686å…
687¥å£å‡¦ç†ãƒ«ãƒ¼ãƒãƒ³ã‚’生成するマクロ,INT_ENTRY(inthdr) は生成する出å…
688¥å£å‡¦
689理ルーチンのå…
690ˆé ­ã®ãƒ©ãƒ™ãƒ«ã‚’得るためのマクロである.INT_ENTRY(inthdr) で
691得られるラベルは,割込みハンドラ初期化ブロックに出å…
692¥å£å‡¦ç†ãƒ«ãƒ¼ãƒãƒ³ã®å…
693ˆ
694頭番地を登録するために使われる.出å…
695¥å£å‡¦ç†ãƒ«ãƒ¼ãƒãƒ³ã‚’生成する必
696要がない
697場合には,INTHDR_ENTRY(inthdr) を単に extern 宣言に展開すればよい.
698
699割込みハンドラの出å…
700¥å£å‡¦ç†ã¯ï¼Œå®Ÿè¡Œã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã‚’非タスクコンテキストに
701切り換え,スクラッチレジスタを保存して,割込みハンドラを呼び出す.割込
702みハンドラから戻ると,å…
703ƒã®å®Ÿè¡Œã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã«æˆ»ã™ã¨ã¨ã‚‚に,必
704要に応じて
705ディスパッチとタスク例外処理ルーチンの起動処理を行う.ディスパッチとタ
706スク例外処理ルーチンの起動処理は,å…
707·ä½“的には次のように行う.
708
709(a) 以下の処理は,割込みハンドラがタスクコンテキスト実行中に起動された
710場合で,reqflg が TRUE の時のみ行う.
711
712(b) enadsp が TRUE で,実行状æ…
713‹ã®ã‚¿ã‚¹ã‚¯ï¼ˆruntsk)と実行できるタスクの
714中で最高優å…
715ˆé †ä½ã®ã‚¿ã‚¹ã‚¯ï¼ˆschedtsk)が一致していない場合には,前者
716のタ
717スクのコンテキストを保存し,後者
718のタスクのコンテキストを復帰して実行状
719æ…
720‹ã¨ã™ã‚‹ï¼Žå®Ÿè¡Œã§ãã‚‹ã‚¿ã‚¹ã‚¯ãŒãªã„場合(schedtsk が NULL の場合)には,
721割込みを許可して,実行できるタスクができるまで待
722つ.ここでも,実行でき
723るタスクができるのを待
724つ間に起動された割込みハンドラの出口で,タスクディ
725スパッチャが呼ばれないようにすることが必
726要であるが,出å…
727¥å£å‡¦ç†ã‚’非タス
728クコンテキストで実行していれば,特に対策する必
729要はない.
730
731(c) 実行状æ…
732‹ã®ã‚¿ã‚¹ã‚¯ï¼ˆ(b) でタスクディスパッチを行った場合は,新たに実
733行状æ…
734‹ã¨ãªã£ãŸã‚¿ã‚¹ã‚¯ï¼‰ãŒã‚¿ã‚¹ã‚¯ä¾‹å¤–処理ルーチンの起動条件を満たしていれ
735ば,タスク例外処理ルーチンを起動する.また,(b) でタスクディスパッチを
736行った場合は,それまで実行状æ…
737‹ã§ã‚ったタスクが次に実行状æ…
738‹ã«ãªã£ãŸæ™‚,
739タスク例外処理ルーチンの起動条件を満たしていれば,タスク例外処理ルーチ
740ンの起動を行う.タスク例外処理ルーチンの起動には,ターゲット非依存部が
741提供する calltex または call_texrtn を用いることができる.
742
743このマクロで生成するルーチンでは,上記の処理の一部のみを行い,残りの処
744理は別に用意したルーチンに任せてもよい.å…
745·ä½“的には,タスクディスパッチ
746とタスク例外処理ルーチンの起動処理は,別にルーチンとして用意するのが適
747当であろう.
748
749(5-3) EXCHDR_ENTRY(exchdr)
750(5-4) EXC_ENTRY(exchdr)
751
752EXCHDR_ENTRY(exchdr) は起動番地が exchdr のCPU例外ハンドラを呼び出す出
753å…
754¥å£å‡¦ç†ãƒ«ãƒ¼ãƒãƒ³ã‚’生成するマクロ,EXC_ENTRY(exchdr) は生成する出å…
755¥å£å‡¦
756理ルーチンのå…
757ˆé ­ã®ãƒ©ãƒ™ãƒ«ã‚’得るためのマクロである.EXC_ENTRY(exchdr) で
758得られるラベルは,CPU例外ハンドラ初期化ブロックに出å…
759¥å£å‡¦ç†ãƒ«ãƒ¼ãƒãƒ³ã®
760å…
761ˆé ­ç•ªåœ°ã‚’登録するために使われる.出å…
762¥å£å‡¦ç†ãƒ«ãƒ¼ãƒãƒ³ã‚’生成する必
763要がな
764い場合には,EXCHDR_ENTRY(exchdr) を単に extern 宣言に展開すればよい.
765
766CPU例外ハンドラの出å…
767¥å£å‡¦ç†ã¯ï¼Œå®Ÿè¡Œã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã‚’非タスクコンテキスト
768に切り換え,スクラッチレジスタを保存して,CPU例外ハンドラを呼び出す.
769CPU例外ハンドラには,VP型のパラメータ p_excinf を渡す.このパラメータ
770は,CPU例外に関する情
771報を保存したスタック領域へのポインタであることを
772想定しているが,å…
773·ä½“的にはターゲット毎に定める.
774
775CPU例外ハンドラから戻ると,å…
776ƒã®å®Ÿè¡Œã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã«æˆ»ã™ã¨ã¨ã‚‚に,必
777要に
778応じてタスクディスパッチとタスク例外処理ルーチンの起動処理を行う.タス
779クディスパッチとタスク例外処理ルーチンの起動処理は,割込みハンドラの出
780å…
781¥å£å‡¦ç†ã®å ´åˆã¨åŒæ§˜ã§ã‚る(上記の (a)〜(c)).
782
783(6) タスクコンテキスト設定処理(cpu_context.h)
784
785ターゲット依存のタスクコンテキストを設定するために create_context と
786activate_context の2つの関数を用意する.2つの関数を呼び出すことで,タ
787スクのコンテキスト(å…
788·ä½“的には,タスクコンテキストブロックの内
789容とタス
790クのスタック領域)をタスクが起動できる状æ…
791‹ã«è¨­å®šã™ã‚‹ï¼Ž2つの関数は呼ば
792れるタイミングが異なるだけで明確な役割分担
793はなく,どのような処理はどち
794らの関数で行わなければならないという制約はない.
795
796これらの関数の宣言およびマクロの定義は,cpu_context.h に含める.これは,
797cpu_config.h を処理する時点では TCB が定義されていないためである.
798
799(6-1) void create_context(TCB *tcb)
800
801タスクが休止状æ…
802‹ã«ç§»è¡Œã™ã‚‹æ™‚に呼ばれる.å…
803·ä½“的には,タスクの生成時
804(JSPカーネルでは,CRE_TSK でタスクを生成するため,タスク管理モジュー
805ルの初期化)とタスクの終了時(ext_tsk,ter_tsk)に呼ばれる.
806
807(6-2) void activate_context(TCB *tcb)
808
809タスクが実行できる状æ…
810‹ã«ç§»è¡Œã™ã‚‹æ™‚に呼ばれる.å…
811·ä½“的には,act_tsk でタ
812スクを起動する時,タスクの終了時(ext_tsk,ter_tsk)に起動要求のキュー
813イングにより再起動する時,TA_ACT 属性を指定してタスクを生成した時(タ
814スク管理モジュールの初期化)に呼ばれる.
815
816(6-3) ACTIVATED_STACK_SIZE(オプション)
817
818ext_tsk がスタック上に確保するダミー領域のサイズを定義するためのマクロ.
819ダミー領域が必
820要ない場合は,このマクロを定義する必
821要はない.
822
823ext_tsk は,自タスクを終了させた後,自タスクに対して create_context を
824呼ぶ.また,タスクの起動要求がキューイングされていた場合には,自タスク
825に対して activate_context も呼ぶ.create_context と activate_context
826は,対象タスクのスタック領域を書き換える場合があるが,これが ext_tsk
827(およびそこから呼ばれる関数)が使用しているスタック領域と重なった場合,
828自分の使用しているスタック領域を自分で破壊する結果になる.
829
830ACTIVATE_STACK_SIZE を,create_context と activate_context が書き換え
831るスタック領域のサイズ(厳密には,スタックの底から何バイトめまでを書き
832換えるか)にマクロ定義しておくと,ext_tsk 内
833でスタック上に定義したサイ
834ズのダミー領域を確保し,自分の使用しているスタック領域を破壊するのを防
835ぐ.
836
837なお,これを実現するために,処理系依存の機能である alloca を用いている.
838gcc は alloca をサポートしているが,他のコンパイラを用いる場合には,
839alloca をサポートしているか確認が必
840要である.また,alloca を用いる場合
841にインクルードファイルが必
842要な場合には,tool_config.h からインクルード
843する必
844要がある.
845
846(7) ターゲット依存の初期化/終了処理
847
848(7-1) void cpu_initialize(void)
849
850プロセッサ依存の初期化処理.カーネルの初期化処理で,カーネル内
851の各モジュ
852ールを初期化する前に呼ばれる.
853
854(7-2) void sys_initialize(void)
855
856システム依存の初期化処理.カーネルの初期化処理で,cpu_initialize に続
857いて呼ばれる.
858
859(7-3) void tool_initialize(void)
860
861開発環境依存の初期化処理.カーネルの初期化処理で,sys_initialize に続
862いて呼ばれる.
863
864上の3つの関数は,カーネル起動処理(kernel_start 関数)の最初でこの順に
865呼び出される.3つの関数を呼び出した後の時点で,CPUロック状æ…
866‹ã«ãªã£ã¦ã„
867なければならない.
868
869(7-4) void cpu_terminate(void);
870
871プロセッサ依存の終了時処理.カーネルの終了処理で呼ばれる.
872
873(7-5) sys_exit(void)
874
875システムの終了処理.カーネルの終了処理で,cpu_terminate に続いて呼ばれ
876る.この関数からはリターンしない.ROMモニタを持つシステムでは,ROMモニ
877タ呼出しで実現することを想定している.
878
879(7-6) call_atexit(void)
880
881開発環境依存の終了処理.必
882要に応じて,atexit によって登録された関数の
883実行や C++ におけるデストラクタの実行を行う.
884
885(8) 割込みハンドラ/CPU例外ハンドラの定義
886
887(8-1) void define_inh(INHNO inhno, FP inthdr)
888
889割込みハンドラ番号 inhno の起動番地を inthdr に設定する.割込み管理機
890能の初期化処理から呼ばれる.
891
892(8-2) void define_exc(EXCNO excno, FP exchdr)
893
894CPU例外ハンドラ番号 excno の起動番地を exchdr に設定する.CPU例外ハン
895ドラ管理機能の初期化処理から呼ばれる.
896
897(9) CPU例外発生時点のシステム状æ…
898‹ã®å‚ç…
899§
900
901(9-1) BOOL exc_sense_context(VP p_excinf)
902
903CPU例外が発生したコンテキストが,タスクコンテキストの場合は FALSE,非
904タスクコンテキストの場合は TRUE を返す関数.CPU例外ハンドラから呼ばれ
905たサービスコール処理から呼ばれる.p_excinf には,CPU例外ハンドラへの引
906数がそのまま渡される.
907
908(9-2) BOOL exc_sense_lock(VP p_excinf)
909
910CPU例外が発生したコンテキストが,CPUロック状æ…
911‹ã®å ´åˆã¯ TRUE,CPUロック
912解除状æ…
913‹ã®æ™‚は FALSE を返す関数.CPU例外ハンドラから呼ばれたサービスコ
914ール処理から呼ばれる.p_excinf には,CPU例外ハンドラへの引数がそのまま
915渡される.
916
917(10) TCB 中のフィールドのビット幅
918の定義(オプション)
919
920TCB 中のフィールドのé…
921ç½®ã¯æ€§èƒ½ã«å¤§ããå½±éŸ¿ã™ã‚‹ã¨æ€ã‚ã‚Œã‚‹ãŸã‚ï¼Œã‚¿ãƒ¼ã‚²ãƒƒ
922ト依存にフィールドのビット幅
923を変更できるようにしている.å…
924·ä½“的には,以
925下の2つのフィールドのビット幅
926を変更できる.これらのマクロを定義しない
927場合,最小ビット幅
928となる.
929
930(10-1) TBIT_TCB_TSTAT tstat(タスク状æ…
931‹ï¼‰ã®ãƒ“ット幅
932
933(10-2) TBIT_TCB_PRIORITY priority(優å…
934ˆåº¦ï¼‰ãƒ•ã‚£ãƒ¼ãƒ«ãƒ‰ã®ãƒ“ット幅
935
936
93732ビットプロセッサの場合には,これらを 8 に定義するのが効率的である.
938
939(11) ビットマップサーチにビットサーチ命令を使うための定義(オプション)
940
941プロセッサがビットサーチ命令を持つ場合,レディキューのビットマップサー
942チにその命令を用いた方が効率がよい.その場合,以下の関数およびマクロを
943ターゲット依存部で定義する.
944
945(11-1) CPU_BITMAP_SEARCH
946
947プロセッサのビットサーチ命令を用いる場合,このマクロを定義する.このマ
948クロを定義することにより,ターゲット非依存部から bitmap_search が取り
949除かれる.
950
951(11-2) UINT bitmap_search(UINT bitmap)
952
953ビットサーチを行う関数.bitmap 内
954の 1 のビットの内
955,最も下位のものをサ
956ーチし,そのビット番号を返す.ビット番号は,最下位ビット(LSB)を 0 と
957する.bitmap の下位16ビットに,必
958ず 1 のビットがある(すなわち,bitmap
959に 0 が指定されることはない)ことを仮定してよい.
960
961標準ライブラリにビットサーチ命令を用いた ffs がある場合,ffs を用いて
962bitmap_search を次のように定義すればよい.
963 #define bitmap_search(bitmap) (ffs(bitmap) - 1)
964
965プロセッサの持つビットサーチ命令が,最も上位の 1 のビットをサーチする
966ものである場合には,次のマクロを定義して,ビットの割付けを変更すること
967ができる.
968
969(11-3) UINT PRIMAP_BIT(pri)
970
971タスク優å…
972ˆåº¦ã®å†…
973部表現(最高優å…
974ˆåº¦ã‚’ 0 とする)を,それに対応するビッ
975トマップに変換する.デフォルトの定義は次の通り.
976 #define PRIMAP_BIT(pri) (1 << (pri))
977
978(12) ターゲット依存のサービスコール(オプション)
979
980以下のサービスコールをターゲット依存にサポートする場合には,その処理ル
981ーチンをターゲット依存部で定義する.
982
983(12-1) chg_ixx
984(12-2) get_ixx
985(12-3) dis_int
986(12-4) ena_int
987
988(13) 性能評価用システム時刻関連の定義(オプション)
989
990(13-1) SUPPORT_VXGET_TIM
991
992ターゲット非依存部の vxget_timサービスコール処理を用いる場合に,このマ
993クロを定義する.
994
995(13-2) hw_timer.h
996
997ターゲット依存のタイマモジュールのインクルードファイル.ターゲット非依
998存部の vxget_timサービスコール処理を用いる場合,ターゲット依存のタイマ
999モジュールが必
1000要になる.そのためのインクルードファイルである
1001hw_timer.h は,システムサービスのシステムクロックドライバで用いるもの
1002とå…
1003±é€šã«ã—ている.
1004
1005(14) カーネルの内
1006部識別名のリネームとその解除(cpu_rename.h,
1007 cpu_unrename.h,sys_rename.h,sys_unrename.h)
1008
1009ターゲット依存部で用いている識別名(モジュール内
1010に閉じた識別名を除く)
1011を,μITRON4.0仕様に従って _kernel_ で始まるものにリネームする必
1012要があ
1013る.
1014
1015å…
1016·ä½“的には,プロセッサ依存部で用いている識別子をリストアップしたファイ
1017ルを cpu_rename.def に,システム依存部で用いている識別子をリストアップ
1018したファイルを sys_rename.def に作成する.genrename 使って,これらのファ
1019イルから,それぞれ cpu_rename.h と cpu_unrename.h,sys_rename.h と
1020sys_unrename.h を生成する.xxx_rename.def から xxx_rename.h と
1021xxx_unrename.h を生成するには,「$(KERNEL_DIR)/utils/genrename xxx」を
1022実行すればよい.
1023
1024また,cpu_config.h のå…
1025ˆé ­ã‹ã‚‰ cpu_rename.h を,sys_config.h のå…
1026ˆé ­ã‹ã‚‰
1027sys_rename.h をインクルードする.
1028
1029genrename が生成するファイルは次のような内
1030容である.xxx_rename.def に
1031xxxx という識別子が含まれている場合,xxx_rename.h には次のようなマクロ
1032定義が生成される.
1033
1034#define xxxx _kernel_xxxx
1035#ifdef LABEL_ASM
1036#define _xxxx __kernel_xxxx
1037#endif /* LABEL_ASM */
1038
1039ここで,LABEL_ASM は,アセンブリ言語レベルの識別名が,C言語レベルの識
1040別名のå…
1041ˆé ­ã« "_" が付いたものになる場合に定義すべきマクロである(定義
1042の方法については「システム構築方法の設定」を参ç…
1043§ï¼‰ï¼Ž
1044
1045また,xxx_unrename.h には次のようなマクロ定義解除が生成される.
1046
1047#undef xxxx
1048#ifdef LABEL_ASM
1049#undef _xxxx
1050#endif /* LABEL_ASM */
1051
1052(15) トレースログのためのマクロ定義(tool_config.h)
1053
1054カーネルのトレースログの取得は,開発環境依存部でトレースログのためのマ
1055クロを定義することによって行う.トレースログのためのマクロは約150種類
1056あり,取得したいログ情
1057報に対応するマクロを定義する.トレースログを取得
1058しない場合には,これらのマクロを空に定義すればよい.
1059
1060(16) その他
1061
1062(16-1) TARGET_NAME
1063
1064起動メッセージのターゲット名.
1065
1066(16-2) void sys_putc(char c)
1067
1068ターゲットシステムの低レベルの文字出力ルーチン.ROMモニタを持つシステ
1069ムでは,ROMモニタ呼び出しで実現することを想定している.
1070
1071(16-3) OMIT_CALLTEX(オプション)
1072
1073ターゲット非依存部が calltex を提供する必
1074要がない場合に,このマクロを
1075定義する.詳しくは,「タスク例外処理ルーチンの起動関数とその中で参ç…
1076§ã™
1077る TCB のフィールド」の節を参ç…
1078§ã®ã“と.
1079
1080(16-4) LABEL_ALIAS(new_label, defined_label)(オプション,tool_config.h)
1081
1082new_label を defined_label と同じアドレスに定義するためのマクロ.この
1083ようなマクロを実現できない場合には,定義を省略することができる.このマ
1084クロ定義は,tool_config.h の中で行うのを標準とする.
1085
1086(16-5) COPYRIGHT_CPU(オプション)
1087(16-6) COPYRIGHT_SYS(オプション)
1088
1089カーネル起動時のメッセージに,それぞれプロセッサ依存部およびシステム依
1090存部の著作権表示を追加するためのマクロ.
1091
1092(16-7) __STK_UNIT(オプション)
1093(16-8) __MPF_UNIT(オプション)
1094
1095標準では,スタック領域と固定長メモリプール領域は,VP型のサイズにアライ
1096ンする.これを,より大きい単位でアラインさせる必
1097要がある場合には,
1098__STK_UNIT と __MPF_UNIT を,それぞれアラインさせる単位のデータ型に定
1099義する.ただし,__STK_UNIT および __MPF_UNIT のサイズは,2の巾乗でなけ
1100ればならない.
1101
1102(16-9) __EMPTY_LABEL(x, y)(オプション,tool_config.h)
1103
1104型 x のサイズ 0 のé…
1105åˆ— y を定義するためのマクロ.サイズ 0 のé…
1106åˆ—を定義
1107できるコンパイラ(GNU開発環境はこれに該当)では定義を省略することがで
1108きる.このマクロ定義は,tool_config.h の中で行うのを標準とする.
1109
1110
11114.ターゲット依存部が用いることができるターゲット非依存部の変数・関数
1112
1113(1) タスク管理関連の変数
1114
1115(1-1) TCB *runtsk
1116
1117実行状æ…
1118‹ã®ã‚¿ã‚¹ã‚¯ï¼ˆï¼ãƒ—ロセッサがコンテキストを持っているタスク)の TCB
1119を指すポインタ.実行状æ…
1120‹ã®ã‚¿ã‚¹ã‚¯ãŒãªã„場合は NULL にする.サービスコー
1121ルの処理中で,自タスク(サービスコールを呼び出したタスク)に関する情
1122å ±
1123を参ç…
1124§ã™ã‚‹å ´åˆã¯ runtsk を使う.カーネルの初期化処理以外で,この変数を
1125書き換えるのは,タスクディスパッチャ(すなわち,ターゲット依存部)のみ
1126である.
1127
1128(1-2) TCB *schedtsk
1129
1130実行できるタスクの中で最高優å…
1131ˆé †ä½ã®ã‚¿ã‚¹ã‚¯ã® TCB を指すポインタ.実行
1132できるタスクがない場合は NULL となる.ディスパッチ禁止状æ…
1133‹ãªã©ï¼Œãƒ‡ã‚£ã‚¹
1134パッチが保留されている間は,runtsk と一致しているとは限らない.この変
1135数を書き換えるのはスケジューラのみで,ターゲット依存部はこの変数を書き
1136換えてはならない.
1137
1138(1-3) BOOL reqflg
1139
1140割込みハンドラ/CPU例外ハンドラの出口処理に,タスクディスパッチまたは
1141タスク例外処理ルーチンの起動を要求することを示すフラグ.この変数はサー
1142ビスコール処理(ターゲット非依存部)でセットし,割込みハンドラ/CPU例
1143外ハンドラの出口処理(ターゲット依存部)で参ç…
1144§ï¼ã‚¯ãƒªã‚¢ã™ã‚‹ï¼Ž
1145
1146(1-4) BOOL enadsp
1147
1148タスクディスパッチ許可状æ…
1149‹ã§ã‚る(すなわち,タスクディスパッチ禁止状æ…
1150‹
1151でない)ことを示すフラグ.この変数はサービスコール(dis_dsp,ena_dsp,
1152ターゲット依存に chg_ixx)処理の中で書き換える.
1153
1154また,タスクディスパッチャ(ターゲット依存部)の中で,実行できるタスク
1155ができるのを待
1156つ間に起動された割込みハンドラの出口でタスクディスパッチャ
1157が呼ばれないようにするために,この変数を一時的に FALSE に設定すること
1158ができる.
1159
1160(2) タスク例外処理ルーチンの起動関数とその中で参ç…
1161§ã™ã‚‹ TCB のフィールド
1162
1163(2-1) void calltex(void)
1164(2-2) void call_texrtn(void)
1165
1166タスク例外処理ルーチンの起動を行う関数.calltex は,実行状æ…
1167‹ã®ã‚¿ã‚¹ã‚¯ãŒ
1168タスク例外処理ルーチンの起動条件を満たしていれば,call_texrtn を呼び出
1169す.call_texrtn は,タスク例外処理ルーチンの呼び出しを行う.タスク例外
1170処理ルーチンを呼び出す時は,一時的にCPUロックを解除する.
1171
1172これらの関数は,ディスパッチャや割込みハンドラ/CPU例外ハンドラの出口
1173処理から,CPUロック状æ…
1174‹ã§å‘¼ã°ã‚Œã‚‹ã“とを想定している.calltex を呼び出
1175すのが最も簡単であるが,実行効率を上げるためには,起動条件のチェックを
1176アセンブリ言語で記述し,call_texrtn を呼び出した方がよい.チェックすべ
1177き起動条件については,ターゲット非依存部の calltex のソースコードを参
1178ç…
1179§ã™ã‚‹ã“と.またその場合には,OMIT_CALLTEX をマクロ定義することで,タ
1180ーゲット非依存部から calltex が取り除かれる.
1181
1182(2-3) BOOL enatex
1183(2-4) TEXPTN texptn
1184
1185call_texrtn を呼び出すために,起動条件のチェックをアセンブリ言語で記述
1186する場合には,TCB 内
1187のこれらのフィールドを参ç…
1188§ã™ã‚‹å¿…
1189要がある.
1190
1191(3) システムログ機能
1192
1193異常事象を通知するために,システムログ機能へのログ出力関数を用いること
1194ができる.システムログ機能については,ユーザズマニュアルを参ç…
1195§ã™ã‚‹ã“と.
1196
1197
11985.システムサービス用のデータ型や関数など
1199
12005.1 システムインタフェースレイヤ(SIL)のための定義
1201
1202ターゲット依存部で提供すべきシステムインタフェースレイヤ(SIL)のため
1203の定義は次の通りである.これらの定義は,cpu_defs.hまたはsys_defs.h(ま
1204たはそれらからインクルードされるファイル)に含める.また,関数の実体が
1205必
1206要な場合,C言語の場合はcpu_config.cまたはsys_config.cに,アセンブリ
1207言語の場合はcpu_support.Sまたはsys_support.Sに記述する.
1208
1209(1) 微少時間待
1210ち関連
1211
1212(1-1) void sil_dly_nse(UINT dlytim)
1213
1214dlytimで指定される時間(単位: 1ナノ秒)待
1215つ関数をターゲット依存部で提
1216供する.
1217
1218実現方法はターゲット依存であるが,以下の関数をアセンブリ言語で記述した
1219ものを,プロセッサ依存部に含めるのを標準的な方法とする.アセンブリ言語
1220で記述するのは,コンパイラの最適化に依存しないようにするためである.ま
1221たこの関数は,できる限りメモリアクセスを行わないように実装
1222すべきである.
1223
1224 void sil_dly_nse(UINT dlytim)
1225 {
1226 if (dlytim > SIL_DLY_TIM1) {
1227 dlytim -= SIL_DLY_TIM1;
1228 while (dlytim > SIL_DLY_TIM2) {
1229 dlytim -= SIL_DLY_TIM2;
1230 }
1231 }
1232 }
1233
1234(1-2) SIL_DLY_TIM1(オプション)
1235(1-3) SIL_DLY_TIM2(オプション)
1236
1237sil_dly_nseを上記の標準的な方法で実現した場合,この2つの定数をシステム
1238依存部でマクロ定義する.なお,この2つの定数の決定を助けるプログラムを
1239用意している.希望される方は,相談されたい.
1240
1241(2) 割込みロック状æ…
1242‹ã®åˆ¶å¾¡é–¢é€£ï¼ˆã‚ªãƒ—ション)
1243
1244(2-1) SIL_PRE_LOC
1245(2-2) SIL_LOC_INT()
1246(2-3) SIL_UNL_INT()
1247
1248ターゲット依存で割込みロック状æ…
1249‹ã®åˆ¶å¾¡æ–¹æ³•ã‚’変更したい場合には,これら
1250のマクロにその方法を定義する.これらマクロを定義しない場合には, ター
1251ゲット非依存部において,カーネルのCPUロックの機能を用いて割込みロック
1252状æ…
1253‹ãŒå®Ÿç¾ã•ã‚Œã‚‹ï¼Ž
1254
1255(3) プロセッサのエンディアンの定義
1256
1257(3-1) SIL_ENDIAN
1258
1259リトルエンディアンプロセッサではSIL_ENDIAN_LITTLE(=0),ビッグエンディ
1260アンプロセッサではSIL_ENDIAN_BIG(=1)にマクロ定義する.
1261
1262(4) エンディアンの反転(オプション)
1263
1264(4-1) VH SIL_REV_ENDIAN_H(VH data)
1265(4-2) VW SIL_REV_ENDIAN_W(VW data)
1266
1267エンディアンの反転を効率よく実現する方法がある場合には,これらのマクロ
1268にその方法を定義する.これらのマクロを定義しない場合には,標準的な方法
1269でエンディアンの反転が行われる.
1270
1271(5) エンディアン反転付きのメモリ空間アクセス(オプション)
1272
1273エンディアンを反転してメモリを読出し/書込みする効率的な方法がある場合,
1274該当するメモリ空間アクセス関数をターゲット依存部で用意し,ターゲット非
1275依存部の標準的な定義を無効にするためのマクロを定義する.
1276
1277(5-1) VH sil_reh_bem(VP mem) OMIT_SIL_REH_BEM
1278(5-2) void sil_wrh_bem(VP mem, VH data) OMIT_SIL_WRH_BEM
1279(5-3) VW sil_rew_bem(VP mem) OMIT_SIL_REW_BEM
1280(5-4) void sil_wrw_bem(VP mem, VW data) OMIT_SIL_WRW_BEM
1281
1282リトルエンディアンプロセッサでは,これらのメモリ空間アクセス関数をター
1283ゲット依存部で用意し,右に示すマクロを定義する.
1284
1285(5-5) VH sil_reh_lem(VP mem) OMIT_SIL_REH_LEM
1286(5-6) void sil_wrh_lem(VP mem, VH data) OMIT_SIL_WRH_LEM
1287(5-7) VW sil_rew_lem(VP mem) OMIT_SIL_REW_LEM
1288(5-8) void sil_wrw_lem(VP mem, VW data) OMIT_SIL_WRW_LEM
1289
1290ビッグエンディアンプロセッサでは,これらのメモリ空間アクセス関数をター
1291ゲット依存部で用意し,右に示すマクロを定義する.
1292
1293(6) 標準のアクセス関数の無効化(オプション)
1294
1295(6-1) OMIT_SIL_ACCESS
1296
1297シミュレーション環境などで,すべてのメモリ空間アクセス関数をターゲット
1298依存部で用意する場合には,ターゲット非依存部の標準的な定義を無効にする
1299ために,このマクロを定義する.
1300
13015.2 システムクロックドライバ用のデータ型や関数など
1302
1303ターゲット依存部で提供すべきシステムクロックドライバ用のデータ型や関数
1304などは次の通りである.これらの定義は,hw_timer.h(またはそれらからイン
1305クルードされるファイル)に含める.関数の実体が必
1306要な場合には,適切なファ
1307イルを用意する.
1308
1309(1) INHNO_TIMER
1310
1311タイマ割込みハンドラのベクタ番号を定義したマクロを,ターゲット依存部で
1312提供する.
1313
1314(2) タイマの制御
1315
1316(2-1) void hw_timer_initialize(void)
1317
1318タイマを初期化し,タイマ割込みを周期的に発生させる関数を,ターゲット依
1319存部で提供する.タイマ割込みの周期は,TIC_NUMEとTIC_DENOで指定された時
1320間と一致させる.
1321
1322(2-2) void hw_timer_int_clear(void)
1323
1324タイマ割込み要求をクリアする関数を,ターゲット依存部で提供する.
1325
1326(2-3) void hw_timer_terminate(void)
1327
1328タイマの動作を停止させ,タイマ割込みを発生しないようにする関数を,ター
1329ゲット依存部で提供する.
1330
1331(3) 性能評価用システム時刻参ç…
1332§æ©Ÿèƒ½é–¢é€£ï¼ˆã‚ªãƒ—ション)
1333
1334ターゲット非依存部のvxget_timサービスコール処理を用いる場合に,以下の
1335データ型や関数などをターゲット依存部で提供する.
1336
1337(3-1) CLOCK
1338
1339タイマ値の内
1340部表現のためのデータ型.
1341
1342(3-2) CLOCK hw_timer_get_current(void)
1343
1344タイマの現在値を読み出し,内
1345部表現で返す関数.
1346
1347(3-3) BOOL hw_timer_fetch_interrupt(void)
1348
1349タイマ割込み要求をチェックする関数.タイマ割込みが要求されている場合に
1350TRUE,要求されていない場合にFALSEを返す.
1351
1352(3-4) UINT TO_USEC(CLOCK clock)
1353
1354タイマ値の内
1355部表現を,1μ秒単位に変換するためのマクロ(または関数).
1356hw_timer_get_currentで読み出した値を,タイマ割込み発生からの経過時間
1357(単位: 1μ秒)に変換するために用いる.
1358
1359(3-5) BOOL BEFORE_IREQ(CLOCK clock)
1360
1361割込みを禁止した状æ…
1362‹ã§ï¼Œã¾ãšhw_timer_get_currentを呼び出し,続いて
1363hw_timer_fetch_interruptを呼び出す場合を考える.hw_timer_get_current
1364を呼び出した直後にタイマが周期に達し,タイマ割込みが要求されると,
1365hw_timer_get_currentは周期に達する直前のタイマ値(これを,clockとする)
1366を返し,hw_timer_fetch_interruptがTRUEを返すことになる.この状況でも正
1367しい現在時刻を得るために,clockがある一定値以上の場合には,
1368hw_timer_fetch_interruptがTRUEを返しても,割込み発生前の値とみなすこと
1369にする.BEFORE_IREQは,clockが割込み発生前の値とみなすべき場合にTRUEを,
1370そうでない場合にFALSEを返すマクロ(または関数)である.
1371
13725.3 シリアルインタフェースドライバ用のデータ型や関数など
1373
1374ターゲット依存部で提供すべきシリアルインタフェースドライバ用のデータ型
1375や関数などは次の通りである.これらの定義は,別に記述がない限り,
1376hw_serial.h(またはそこからインクルードされるファイル)に含め,必
1377要な
1378コンフィギュレーション情
1379報をhw_serial.cfgに記述する.関数の実体が必
1380要
1381な場合には,適切なファイルを用意する.
1382
1383シリアルインタフェースドライバの中で,ターゲットのシリアルI/Oデバイス
1384に依存する部分を,シリアルI/Oデバイスドライバと呼ぶ.シリアルI/Oデバイ
1385スドライバは,おおよそ,ITRONデバイスドライバ設計ガイドラインのPDICに
1386相当する.PDICに相当するファイルで,他のシステムにもå…
1387±é€šã«ä½¿ãˆã‚‹å¯èƒ½æ€§
1388がある場合には,pdic/simple_sioディレクトリに置く.
1389
1390(1) TNUM_PORT
1391
1392シリアルインタフェースドライバがサポートするシリアルポート数を定義する
1393マクロ.このマクロは,cpu_config.hまたはsys_config.h(またはそれらから
1394インクルードされるファイル)で定義する.
1395
1396(2) シリアルI/Oデバイスの割込みハンドラとその登録
1397
1398シリアルI/Oデバイスの割込みハンドラをターゲット依存部で提供し,それを
1399カーネルに登録する静的APIをhw_serial.cfgに含める.シリアルI/Oデバイス
1400の割込ハンドラのベクタ番号は,hw_serial.h(またはそこからインクルード
1401されるファイル)でマクロ定義し,hw_serial.cfgからhw_serial.hをインクル
1402ードする方法を標準とする.
1403
1404(3) void sio_initialize(void)
1405
1406シリアルI/Oデバイスドライバを初期化するルーチン.この関数は,シリアル
1407インタフェースドライバのターゲット非依存部の初期化ルーチンから呼び出さ
1408れる.
1409
1410(4) SIOPCB
1411
1412シリアルI/Oポート管理ブロックのデータ型(hw_serial.hには,型宣言だけ含
1413まれていればよい).
1414
1415(5) SIO_ERDY_SNDとSIO_ERDY_RCV
1416
1417送信可能コールバックの識別番号をSIO_ERDY_SNDに,受信通知コールバックの
1418識別番号をSIO_ERDY_RCVにマクロ定義する.コールバックの禁止/許可を行な
1419うサービスコール(sio_ena_cbrとsio_dis_cbr)で用いる.
1420
1421(6) デバイスサービスルーチン
1422
1423以下のデバイスサービルルーチンは,(少なくとも)シリアルI/Oポートから
1424の割込みが禁止された状æ…
1425‹ã§å‘¼ã³å‡ºã•ã‚Œã‚‹ï¼Žã¾ãŸï¼Œã‚¿ã‚¹ã‚¯ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆï¼Œéžã‚¿
1426スクコンテキストのいずれで呼び出される場合もある(いずれで呼び出されて
1427も動作するようにしなければならない).
1428
1429(6-1) SIOPCB *sio_opn_por(ID siopid, VP_INT exinf)
1430
1431siopidで指定されるシリアルI/Oポートをオープンする関数.exinfはシリアル
1432I/Oポートに対する拡張情
1433報で,コールバックを呼ぶ時にポートを区別するた
1434めに渡す.
1435
1436(6-2) void sio_cls_por(SIOPCB *siopcb)
1437
1438siopcbで指定されるシリアルI/Oポートをクローズする関数.
1439
1440(6-3) BOOL sio_snd_chr(SIOPCB *siopcb, char c)
1441
1442siopcbで指定されるシリアルI/Oポートに,cで示される文字を送信する関数.
1443文字を送信レジスタにå…
1444¥ã‚ŒãŸå ´åˆã«ã¯TRUEを,前に送信した文字の送信が終わっ
1445ていないために,文字を送信レジスタにå…
1446¥ã‚Œã‚‰ã‚Œãªã‹ã£ãŸå ´åˆã«ã¯FALSEを返
1447す.
1448
1449(6-4) INT sio_rcv_chr(SIOPCB *siopcb)
1450
1451siopcbで指定されるシリアルI/Oポートから文字を読む関数.文字を受信して
1452いた場合,読んだ文字のコードは正の値として返し,文字を受信していない場
1453合には-1を返す.
1454
1455(6-5) sio_ena_cbr(SIOPCB *siopcb, UINT cbrtn)
1456
1457siopcbで指定されるシリアルI/Oポートからの,cbrtnで指定されるコールバッ
1458クを許可する.cbrtnには,SIO_ERDY_SNDかSIO_ERDY_RCVを指定できる.
1459
1460(6-6) sio_dis_cbr(SIOPCB *siopcb, UINT cbrtn)
1461
1462siopcbで指定されるシリアルI/Oポートからの,cbrtnで指定されるコールバッ
1463クを禁止する.cbrtnには,SIO_ERDY_SNDかSIO_ERDY_RCVを指定できる.
1464
1465(7) コールバックルーチン
1466
1467ターゲット依存部は,必
1468要なタイミングで,シリアルインタフェースドライバ
1469のターゲット非依存部に含まれる以下のコールバックルーチンを呼び出びださ
1470なければならない.ただし,それぞれのコールバックが禁止されている時は,
1471コールバックルーチンを呼び出してはならない.
1472
1473コールバックルーチンは,(少なくとも)シリアルI/Oポートからの割込みが
1474禁止された状æ…
1475‹ã§ï¼Œéžã‚¿ã‚¹ã‚¯ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã§å‘¼ã³å‡ºã™ï¼Žexinfには,シリアル
1476I/Oポートのオープン時に指定された拡張情
1477報を渡す.
1478
1479(7-1) void sio_ierdy_snd(VP_INT exinf)
1480
1481送信可能コールバックルーチン.シリアルI/Oポートに対して文字が送信でき
1482る状æ…
1483‹ã«ãªã£ãŸå ´åˆã«å‘¼ã³å‡ºã™ï¼Žã‚·ãƒªã‚¢ãƒ«ã‚¤ãƒ³ã‚¿ãƒ•ã‚§ãƒ¼ã‚¹ãƒ‰ãƒ©ã‚¤ãƒã¯ï¼Œã“のコ
1484ールバックルーチンの中で,sio_snd_chrを呼び出して次の文字を送信するか,
1485送信すべき文字がない場合には送信可能コールバックを禁止する.
1486
1487(7-2) void sio_ierdy_rcv(VP_INT exinf)
1488
1489受信通知コールバックルーチン.シリアルI/Oポートから文字を受信した場合
1490に呼び出す.シリアルインタフェースドライバは,このコールバックルーチン
1491の中で,必
1492ずsio_rcv_chrを呼び出して受信した文字を取り出す.
1493
14945.4 システムログタスク用のための定義
1495
1496ターゲット依存部で提供すべきシステムログタスクのための定義は次の通りで
1497ある.これらの定義は,cpu_config.hまたはsys_config.h(またはそれらから
1498インクルードされるファイル)に含める.
1499
1500(1) LOGTASK_PORTID
1501
1502システムログタスクが,システムログを出力するシリアルポートのIDを定義し
1503たマクロをターゲット依存部で提供する.
1504
1505(2) システムログタスク関連の定義(オプション)
1506
1507システムログタスクに関する以下のマクロをターゲット依存部で提供する.こ
1508れらのマクロをターゲット依存部で定義しない場合には,デフォルトの値が使
1509われる.
1510
1511(2-1) LOGTASK_PRIORITY システムログタスクの初期優å…
1512ˆåº¦
1513(2-2) LOGTASK_STACK_SIZE システムログタスクのスタックサイズ
1514(2-3) LOGTASK_INTERVAL システムログタスクの動作間隔(単位: ミリ秒)
1515
1516
15176.ターゲット依存部実装
1518上のヒント
1519
1520(1) タスクディスパッチャの2通りの実装
1521方針
1522
1523タスクディスパッチャの実装
1524方針として,コンテキストの保存・復帰とタスク
1525例外処理ルーチンの起動を一連のルーチンで行う方針(これを方針Aと呼ぶ)
1526と,コンテキストの保存・実行するタスクの選択・コンテキストの復帰とタス
1527ク例外処理ルーチンの起動をばらばらのルーチンで行う方針(これを方針Bと
1528呼ぶ)がある.方針Bは,保存するコンテキスト情
1529報を状況に応じて必
1530要最少
1531限にすることが容易になるという利点がある.ただし,シミュレーション環境
1532の場合,実現方法によっては方針Bが採れない可能性も考えられる.
1533
1534タスク例外処理ルーチンの起動箇所という観点からみた場合,2つの方針には
1535留意すべき違いがある.以下,例により説明する.タスク1とタスク2の2つの
1536タスクがあり,タスク1の方が優å…
1537ˆåº¦ãŒé«˜ã„ものとする.最初,タスク2が実行
1538中に割込みハンドラが起動され,その中からタスク1が起動された結果,タス
1539ク2がタスク1によってプリエンプトされたものとする.ここで,タスク1がタ
1540スク2に対してタスク例外処理ルーチンの起動を要求した後,待
1541ち状æ…
1542‹ã«å…
1543¥ã‚‹
1544サービスコールを発行し,その結果タスク2にディスパッチされる状況を考え
1545る.この時,タスクディスパッチャは,タスク2に対してタスク例外処理ルー
1546チンの起動処理を行う必
1547要があるが,方式Aの場合には,タスク1から明示的に
1548呼ばれたディスパッチャの中でタスク例外処理ルーチンの起動が行われるのに
1549対して,方針Bの場合には,タスク2のコンテキストを復帰するルーチンへ分岐
1550した後,コンテキストを復帰する処理に続く処理としてタスク例外処理ルーチ
1551ンの起動が行われる.
1552
1553JSPカーネルでは,方針Aを採るか方針Bを採るかをターゲット依存部に任せる
1554こととする.そのために,タスク例外処理ルーチンの起動をタスクディスパッ
1555チャに含める仕様としている.
1556
1557(2) 割込みハンドラの出å…
1558¥å£å‡¦ç†
1559
1560割込みハンドラの出å…
1561¥å£å‡¦ç†ã®å†…
1562容は,プロセッサの割込みアーキテクチャに
1563より大きく異なるが,おおよその処理の流れは次の通りである.CPU例外ハン
1564ドラの出å…
1565¥å£å‡¦ç†ã‚‚,引数を渡すことを除いては,おおよその処理の流れは同
1566様である.ただし,プロセッサが割込みとCPU例外で異なる扱いをする場合は,
1567実際の出å…
1568¥å£å‡¦ç†ã¯ã‹ãªã‚Šç•°ãªã£ãŸã‚‚のとなる.
1569
1570 ------------------------------------------------------------
1571 レジスタの保存(主にスクラッチレジスタ)
1572 割込みスタックへ切換え(最も外側のハンドラのみ)
1573
1574 登録された割込みハンドラの呼出し
1575
1576 タスクスタックへ切換え(最も外側のハンドラのみ)
1577 if (最も外側のハンドラ && reqflg) {
1578 if (enadsp && runtsk != schedtsk) {
1579 タスクディスパッチ処理
1580 タスク例外処理ルーチンの起動処理(calltex)
1581 }
1582 else {
1583 タスク例外処理ルーチンの起動処理(calltex)
1584 }
1585 }
1586 レジスタの復帰(主にスクラッチレジスタ)
1587 割込み処理からのリターン
1588
1589 ※「ハンドラ」は,割込みハンドラとCPU例外ハンドラの総称.
1590 ※「最も外側のハンドラ」は「戻りå…
1591ˆãŒã‚¿ã‚¹ã‚¯ã€ã¨è¨€ã„換えることが
1592 できる.
1593 ------------------------------------------------------------
1594
1595この中で,内
1596側のif文がいずれの場合でもタスク例外処理ルーチンの起動処理
1597を行う必
1598要があることから(ただし,タスク例外処理ルーチンの起動を行う対
1599象タスクは異なる),内
1600側のif文は次のように最適化できる場合がある.
1601
1602 ------------------------------------------------------------
1603 if (enadsp && runtsk != schedtsk) {
1604 タスクディスパッチ処理
1605 }
1606 タスク例外処理ルーチンの起動処理(calltex)
1607 ------------------------------------------------------------
1608
1609
16107.M68K(68LC040)用のターゲット依存部
1611
1612(1) 前提
1613
1614すべてのタスクをスーパーバイザモードで実行することとし,ユーザモードは
1615用いない.
1616
1617(2) 実行コンテキストとCPUロック状æ…
1618‹
1619
1620タスクコンテキストはマスタモード,非タスクコンテキストは割込みモードで
1621実行する.sense_context は,SR 中のマスタ/割込みモードビットを参ç…
1622§ã™
1623る方法で実現する.
1624
1625IPM が 7 の時(NMI を除くすべての割込みが禁止される)かつその時に限り,
1626CPUロック状æ…
1627‹ã§ã‚るものとする.sense_lock は,SR 中の IPM を参ç…
1628§ã™ã‚‹æ–¹
1629法で実現する.NMI はカーネルの管理外の割込みなので,CPUロック状æ…
1630‹ã§
1631NMI が受け付けられるのは差し支えない.
1632
1633chg_ipm をサポートするかどうかを,SUPPORT_CHG_IPM を定義するかどうかで
1634変更できる.タスクコンテキストで IPM を変更する場合には,chg_ipm を使
1635わなければならない.chg_ipm をサポートしない場合には,タスクコンテキス
1636トで IPM を変更することはできない.つまり,タスクコンテキストでは,IPM
1637は常に 0 になっている.
1638
1639chg_ipm をサポートする場合でも,chg_ipm を使って IPM を 7 に変更するこ
1640とは許さない.これは,chg_ipm と loc_cpu/unl_cpu の関係が複雑になるた
1641めである.また,IPM が 1〜6 の時にも,タスクディスパッチは保留されない.
1642IPM は,タスクディスパッチによって,新しく実行状æ…
1643‹ã«ãªã£ãŸã‚¿ã‚¹ã‚¯ã¸å¼•ã
1644継がれる.そのため,タスクが実行中に,別のタスクによって IPM が変更さ
1645れる場合がある.これは,ディスパッチャを方針Bで実装
1646する場合には素直に
1647実装
1648できるが,方針Aで実装
1649する場合にはあちこちに IPM の設定処理がå…
1650¥ã‚‹ï¼Ž
1651方針Aで実装
1652する場合には,IPM が 1〜6 の時にもタスクディスパッチは保留
1653されるとする方が楽である.
1654
1655(3) 割込みハンドラ出å…
1656¥å£å‡¦ç†
1657
1658M68K(M68020以上)では,割込みハンドラの起動によって,使用するスタック
1659が自動的に割込みスタックへ切り換わるため,割込みスタックへの切換え処理
1660は必
1661要ない.最も外側のハンドラであるかどうかは,スタック上に積まれた
1662SR 中のマスタ/割込みモードビットを参ç…
1663§ã—て判定している.タスクディス
1664パッチとタスク例外処理ルーチンの起動処理は,ret_int ルーチンに任せてい
1665る.
1666
1667reqflg をチェックする前に割込みを禁止するのは,割込みを禁止しないと,
1668reqflg をチェックした後に起動された割込みハンドラ内
1669でディスパッチが要
1670求された場合に,ディスパッチが行われないためである.
1671
1672interrupt_entry:
1673 movem.l %d0-%d1/%a0-%a1, -(%sp) /* スクラッチレジスタを保存 */
1674 jsr <割込みハンドラ> /* 割込みハンドラを呼び出す */
1675 movem.l (%sp)+, %d0-%d1/%a0-%a1 /* スクラッチレジスタを復帰 */
1676 btst.b #4, (%sp) /* 戻りå…
1677ˆãŒå‰²è¾¼ã¿ãƒ¢ãƒ¼ãƒ‰ãªã‚‰ */
1678 jbeq 1f /* すぐにリターン */
1679 ori.w #0x0700, %sr /* 割込み禁止 */
1680 tst.l reqflg /* reqflg が TRUE であれば */
1681 jbne ret_int /* ret_int へ */
16821: rte
1683
1684(4) CPU例外ハンドラ出å…
1685¥å£å‡¦ç†
1686
1687M68Kでは,CPU例外ハンドラの起動によって割込みモードへの移行はおこらず,
1688使用するスタックは切り換わらない.そのため,CPU例外ハンドラ内
1689で割込み
1690モードに切り換えている.また,最も外側のハンドラであるかどうかを判定す
1691るために,割込みモードに切り換える前の SR をスタック上に保存する.タス
1692クディスパッチとタスク例外処理ルーチンの起動処理は,ret_exc ルーチンに
1693任せている.
1694
1695CPU例外ハンドラへの引数は,例外スタックフレームのå…
1696ˆé ­ç•ªåœ°ï¼ˆã™ãªã‚ã¡ï¼Œ
1697CPU例外ハンドラの出å…
1698¥å£å‡¦ç†ãŒå‘¼ã°ã‚ŒãŸç›´å¾Œã®ã‚¹ã‚¿ãƒƒã‚¯ãƒã‚¤ãƒ³ã‚¿ï¼‰ã¨ã—てい
1699る.
1700
1701reqflg をチェックする前に割込みを禁止するのは,割込みを禁止しないと,
1702reqflg をチェックした後に起動された割込みハンドラ内
1703でディスパッチが要
1704求された場合に,ディスパッチが行われないためである.
1705
1706exception_entry:
1707 movem.l %d0-%d1/%a0-%a1, -(%sp) /* スクラッチレジスタを保存 */
1708 lea.l 16(%sp), %a0 /* 例外フレームのå…
1709ˆé ­ã‚’ A0 に */
1710 move.w %sr, %d0 /* SR を D0 に */
1711 and.w #~0x1000, %sr /* 割込みモード */
1712 move.l %d0, -(%sp) /* å…
1713ƒã® SR をスタックに保存 */
1714 move.l %a0, -(%sp) /* A0 を引数として渡す */
1715 jsr <CPU例外ハンドラ> /* CPU例外ハンドラを呼び出す */
1716 addq.l #4, %sp /* 引数を捨てる */
1717 move.l (%sp)+, %d0
1718 and.w #0x1000, %d0 /* å…
1719ƒãŒå‰²è¾¼ã¿ãƒ¢ãƒ¼ãƒ‰ãªã‚‰ */
1720 jbeq 1f /* すぐにリターン */
1721 or.w #0x1700, %sr /* マスタモード・割込み禁止 */
1722 tst.l reqflg /* reqflg が TRUE であれば */
1723 jbne ret_exc /* ret_exc へ */
17241: movem.l (%sp)+, %d0-%d1/%a0-%a1 /* スクラッチレジスタを復帰 */
1725 rte
1726
1727(5) 方針Aのディスパッチャ
1728
1729以下のコードでは,chg_ipm はサポートしていない.また,採用しなかったコ
1730ートであるため,動作テストをしていない.
1731
1732CTXB は「VP msp」のみを含む構造体とする.タスクのコンテキストは,次の
1733図のようにタスクのスタック上に保存する.スクラッチレジスタ(D0〜D1,A0
1734〜A1)とその他のレジスタを別々
1735に積むのは,タスク例外処理ルーチンの起動
1736に都合がよいためである.
1737
1738 * 小 +-----------------------------------+ ← TCB 中に保存されている MSP
1739 * ↑ | D2 |
1740 * +-----------------------------------+
1741 * . . . . . .
1742 * +-----------------------------------+
1743 * | D7 |
1744 * +-----------------------------------+
1745 * | A2 |
1746 * +-----------------------------------+
1747 * . . . . . .
1748 * +-----------------------------------+
1749 * | A6 |
1750 * +-----------------------------------+
1751 * | D0 |
1752 * +-----------------------------------+
1753 * | D1 |
1754 * +-----------------------------------+
1755 * | A0 |
1756 * +-----------------------------------+
1757 * | A1 |
1758 * +-----------------+-----------------+
1759 * | SR | PC (上16bit) |
1760 * +-----------------+-----------------+
1761 * ↓ | PC (下16bit) | 例外情
1762å ± |
1763 * 大 +-----------------+-----------------+ ← ディスパッチャ起動前の MSP
1764
1765dispatch は,trap_dispatch を TRAP命令で呼ぶ関数とする.
1766
1767exit_and_dispatch:
1768 or.w #0x1000, %sr /* マスタモード */
1769 jbra dispatch_1
1770
1771trap_dispatch:
1772 movem.l %d0-%d1/%a0-%a1, -(%sp) /* スクラッチレジスタを保存 */
1773 movem.l %d2-%d7/%a2-%a6, -(%sp) /* 残りのレジスタを保存 */
1774 move.l runtsk, %a0 /* コンテキストを保存 */
1775 move.l %sp, TCB_msp(%a0)
1776dispatch_1:
1777 move.l schedtsk, %a0
1778 move.l %a0, runtsk /* schedtsk を runtsk に */
1779 jbeq dispatch_3 /* schedtsk があるか? */
1780 move.l TCB_msp(%a0), %sp /* コンテキストを復帰 */
1781 movem.l (%sp)+, %d2-%d7/%a2-%a6 /* レジスタを復帰 */
1782 btst.b #TCB_enatex_bit, TCB_enatex(%a0)
1783 jbeq dispatch_2 /* enatex が FALSE ならリターン */
1784 tst.l TCB_texptn(%a0) /* texptn が 0 ならリターン */
1785 jbeq dispatch_2
1786 jsr call_texrtn /* タスク例外処理ルーチンの呼出し */
1787dispatch_2:
1788 movem.l (%sp)+, %d0-%d1/%a0-%a1 /* スクラッチレジスタを復帰 */
1789 rte
1790
1791dispatch_3:
1792 stop #0x2000 /* 割込み待
1793ち(割込みモード) */
1794 /*
1795 * ここで割込みモードに切り換えるのは,ここで発生する割込み処理
1796 * にどのスタックを使うかという問題の解決と,割込みハンドラ内
1797で
1798 * のタスクディスパッチの防止という2つの意味がある.
1799 */
1800 or.w #0x1700, %sr /* マスタモード・割込み禁止 */
1801 tst.l reqflg /* reqflg が FALSE なら */
1802 jbeq dispatch_3 /* dispatch_3 へ */
1803 clr.l reqflg /* reqflg をクリア */
1804 jbra dispatch_1
1805
1806ret_int:
1807 /*
1808 * ここでは,割込みモード・割込み禁止状æ…
1809‹ï¼Ž
1810 */
1811 move.l %a1, -(%sp) /* A1 を割込みスタックに保存 */
1812 movec.l %msp, %a1 /* タスクスタックを A1 に */
1813 move.l (%sp)+, -(%a1) /* A1 をタスクスタックに積む */
1814 movem.l %d0-%d1/%a0, -(%a1) /* スクラッチレジスタを積む */
1815 clr.l reqflg /* reqflg をクリア */
1816 move.l runtsk, %a0 /* A0 ← runtsk */
1817 tst.l enadsp /* enadsp が FALSE なら */
1818 jbeq ret_int_3 /* ret_int_3 へ */
1819 cmp.l schedtsk, %a0 /* runtsk と schedtsk が同じなら */
1820 jbeq ret_int_3 /* ret_int_3 へ */
1821
1822 /* ディスパッチ処理 */
1823 movem.l %d2-%d7/%a2-%a6, -(%a1) /* レジスタを保存 */
1824 move.l %a1, TCB_msp(%a0) /* タスクスタックを保存 */
1825ret_int_1:
1826 move.l schedtsk, %a0
1827 move.l %a0, runtsk /* schedtsk を runtsk に */
1828 jbne ret_int_2 /* schedtsk があるか? */
1829ret_int_1x:
1830 stop #0x2000 /* 割込み待
1831ち(割込みハンドラ内
1832) */
1833 or.w #0x0700, %sr /* 割込み禁止 */
1834 tst.l reqflg /* reqflg が FALSE なら */
1835 jbeq ret_int_1x /* ret_int_1x へ */
1836 clr.l reqflg /* reqflg をクリア */
1837 jbra ret_int_1
1838ret_int_2:
1839 move.l TCB_msp(%a0), %a1 /* タスクスタックを A1 に */
1840 movem.l (%a1)+, %d2-%d7/%a2-%a6 /* レジスタを復帰 */
1841
1842ret_int_3:
1843 btst.b #TCB_enatex_bit, TCB_enatex(%a0)
1844 jbeq ret_int_4 /* enatex が FALSE ならリターン */
1845 tst.l TCB_texptn(%a0) /* texptn が 0 でなければ */
1846 jbne ret_int_5 /* ret_int_5 へ */
1847ret_int_4
1848 movem.l (%a1)+, %d0-%d1/%a0 /* スクラッチレジスタを復帰 */
1849 move.l (%a1)+, -(%sp) /* A1 を割込みスタックに保存 */
1850 movec.l %a1, %msp /* A1 をタスクスタックに */
1851 move.l (%sp)+, %a1 /* A1 を割込みスタックから復帰 */
1852 rte
1853
1854ret_int_5:
1855 move.w 16(%a1), %d0 /* 戻りå…
1856ˆã® SR を D0 に */
1857 move.l TCB_exinf(%a0), -(%a1) /* exinf をタスクスタックに */
1858 move.l TCB_texptn(%a0), -(%a1) /* texptn をタスクスタックに */
1859 move.l #ret_tex, -(%a1) /* #ret_tex をタスクスタックに */
1860 clr.l TCB_enatex(%a0) /* runtsk->enatex をクリア */
1861 clr.l TCB_texptn(%a0) /* runtsk->texptn をクリア */
1862 move.w #例外情
1863報, -(%a1) /* 例外スタックフレームを作る */
1864 move.l TCB_texrtn(%a0), -(%a1)
1865 move.w %d0, -(%a1)
1866 movec.l %a1, %msp /* A1 をタスクスタックに */
1867 rte
1868
1869タスク例外処理ルーチン呼出し時のスタック
1870
1871 * 小 +-----------------------------------+
1872 * ↑ | ret_tex |
1873 * +-----------------------------------+
1874 * | texptn |
1875 * +-----------------------------------+
1876 * | exinf |
1877 * +-----------------------------------+
1878 * | D0 |
1879 * +-----------------------------------+
1880 * | D1 |
1881 * +-----------------------------------+
1882 * | A0 |
1883 * +-----------------------------------+
1884 * | A1 |
1885 * +-----------------+-----------------+
1886 * | SR | PC (上16bit) |
1887 * +-----------------+-----------------+
1888 * ↓ | PC (下16bit) | 例外情
1889å ± |
1890 * 大 +-----------------+-----------------+
1891
1892ret_tex:
1893 addq.l #8, %sp /* 引数エリアを捨てる */
1894 or.w #0x0700, %sr /* 割込み禁止 */
1895 jsr call_texrtn /* タスク例外処理ルーチンの起動 */
1896 movem.l (%sp)+, %d0-%d1/%a0-%a1 /* スクラッチレジスタを復帰 */
1897 rte
1898
1899(6) 方針B(採用)
1900
1901ソースコードを参ç…
1902§ï¼Ž
1903
1904
19058.ターゲット依存部実装
1906上の注意点
1907
1908以下は,ターゲット依存部を実装
1909する上でミスしがちな点をリストアップした
1910ものである.
1911
1912(1) タスク終了時
1913
1914ext_tsk を呼ばずにタスクのメイン関数からリターンした場合,ext_tsk を呼
1915び出したのと同等の処理を行うようにしなければならない.タスク起動時に,
1916メイン関数からのリターンアドレスを ext_tsk の番地に設定しておく方法を
1917推奨する.
1918
1919(2) タスクコンテキストでの割込みマスクの変更
1920
1921chg_iXX をサポートする場合,タスク切替えの際に,chg_iXX によって設定し
1922た割込みマスクの値(タスクコンテキストにおける割込みマスクの値)を新し
1923いタスクに引き継ぐことを推奨する.特に,割込みの出口でタスク切替えを行
1924う箇所は注意が必
1925要である.å…
1926·ä½“的には,以前に同じタスクが動いていた時の
1927割込みマスクがスタックに積まれている場合に,これをそのまま書き戻しては
1928ならない.
1929
1930(3) タスク例外処理の実行コンテキスト
1931
1932タスク例外処理ルーチンはタスクコンテキストで実行されるため,タスク例外
1933処理ルーチン実行時にはスタックポインタがタスクスタックを指している必
1934要
1935がある(特に割込みの出口処理で注意すること) .
1936
1937(4) CPU例外ハンドラ
1938
1939CPU例外ハンドラ実行時は,割込みマスクの値がCPU例外発生直前と同じになる
1940ようにすること.
1941
1942(5) 実行すべきタスクがない場合の処理
1943
1944実行すべきタスクがない(schedtsk が NULL)場合に,プロセッサを待
1945ちモー
1946ド(スリープモード)に移行させる処理と,割込みを許可する処理とは,不可
1947分に行なう必
1948要がある.これを不可分に行なわない場合,割込みを許可した直
1949後に割込みがå…
1950¥ã‚Šï¼Œãã®ä¸­ã§ã‚¿ã‚¹ã‚¯ãŒå®Ÿè¡Œå¯èƒ½çŠ¶æ…
1951‹ã«ãªã‚‹ã¨ï¼Œå®Ÿè¡Œã™ã¹ãã‚¿ã‚¹
1952クがあるにもかかわらずプロセッサが待
1953ちモードになってしまう.
1954
1955また,実行すべきタスクがなく,割込みを許可して割込みを待
1956つ間は,runtsk
1957を NULL に設定しなければならない.このように設定しないと,割込みハンド
1958ラから iget_tid を呼び出した際の動作が仕様に合致しなくなる(μITRON4.0
1959仕様では,実行状æ…
1960‹ã®ã‚¿ã‚¹ã‚¯ãŒãªã„場合に,iget_tid は TSK_NONE を返すこ
1961とになっており,iget_tid のコードは,runtsk が NULL の時に TSK_NONE を
1962返すようになっている).
1963
1964m68k の実装
1965は(config/m68k/cpu_support.S より),
1966
1967dispatcher:
1968 move.l schedtsk, %a0
1969 move.l %a0, runtsk /* schedtsk を runtsk に */
1970 jbeq dispatcher_1 /* runtsk があるか? */
1971
1972となっており,schedtsk が NULL の時に,runtsk を NULL にしてから,割込
1973み待
1974ちにå…
1975¥ã‚‹ï¼Žã—かしながら,この処理が抜けていると,schedtsk が NULL
1976の時には,runtsk をすぐに更新しない.そのため,実行状æ…
1977‹ã®ã‚¿ã‚¹ã‚¯ãŒãªã„
1978場合に iget_tid を呼ぶと,前に実行されていたタスクのID が返る.
1979
1980以上
Note: See TracBrowser for help on using the repository browser.