OSDN Git Service

bbb361457f42ac74cc71a1dd7613202c0bf514dc
[toppersasp4lpc/asp.git] / asp / doc / extension.txt
1
2                 TOPPERS/ASPカーネル
3                 機能拡張・チューニングガイド
4
5                 対応バージョン: Release 1.6.0
6                 最終更新: 2010年2月9日
7
8 このドキュメントは,TOPPERS/ASPカーネルを,機能拡張・チューニングするた
9 めの方法(またはヒント)を説明するものである.
10
11 ----------------------------------------------------------------------
12  TOPPERS/ASP Kernel
13      Toyohashi Open Platform for Embedded Real-Time Systems/
14      Advanced Standard Profile Kernel
15
16  Copyright (C) 2005-2010 by Embedded and Real-Time Systems Laboratory
17              Graduate School of Information Science, Nagoya Univ., JAPAN
18  
19  上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
20  ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
21  変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
22  (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
23      権表示,この利用条件および下記の無保証規定が,そのままの形でソー
24      スコード中に含まれていること.
25  (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
26      用できる形で再配布する場合には,再配布に伴うドキュメント(利用
27      者マニュアルなど)に,上記の著作権表示,この利用条件および下記
28      の無保証規定を掲載すること.
29  (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
30      用できない形で再配布する場合には,次のいずれかの条件を満たすこ
31      と.
32    (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
33        作権表示,この利用条件および下記の無保証規定を掲載すること.
34    (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
35        報告すること.
36  (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
37      害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
38      また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
39      由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
40      免責すること.
41  
42  本ソフトウェアは,無保証で提供されているものである.上記著作権者お
43  よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
44  に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
45  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
46  の責任を負わない.
47  
48  $Id: extension.txt 1862 2010-07-25 11:49:51Z ertl-hiro $
49 ----------------------------------------------------------------------
50
51 ○目次
52
53 ・エラーチェックの省略
54 ・タイムティックの周期の変更
55 ・特殊目的のレジスタの扱い
56 ・ミューテックス機能拡張パッケージ
57 ・オーバランハンドラ機能拡張パッケージ
58 ・タスク優先度拡張パッケージ
59 ・CPU例外ハンドラの直接呼出し
60
61
62 ○エラーチェックの省略
63
64 サービスコールのオーバヘッドを削減するために,静的なエラーのチェックを
65 省略する場合がある.ASPカーネルにおいては,静的なエラーのチェックはすべ
66 てCHECKマクロを用いて行っているため,kernel/check.h中のCHECKマクロを編
67 集することで,静的なエラーのチェックを省略することができる.
68
69 例えば,タスクIDのチェックを省略したい場合には,CHECK_TSKIDマクロと
70 CHECK_TSKID_SELFマクロを,次のように修正すればよい.
71
72 #define CHECK_TSKID(tskid)                      ((void)(tskid))
73 #define CHECK_TSKID_SELF(tskid)         ((void)(tskid))
74
75 これらのマクロの定義を空にする方法もあるが,パラメータに副作用のある式
76 が書かれている可能性を考えると(副作用のある式は書くべきではないが,書
77 かれているコードが入ってくる可能性が全くないとは言えない),上の定義の
78 方が安全である.副作用のない式であれば,最適化によって削除することがで
79 きるため,実行時効率には影響がないと期待できる.ただし,最適化によって
80 削除されない場合には,副作用のある式が書かれていないことを確認した上で,
81 マクロの定義を空にしてもよい.
82
83
84 ○タイムティックの周期の変更
85
86 ASPカーネルでは,カーネルへタイムティックを供給する周期は1ミリ秒が標準
87 となっているが,低速なプロセッサでは1ミリ秒毎に割込みを処理するオーバヘッ
88 ドが問題になる場合がある.そこで,アプリケーションが必要とする時間精度
89 が粗い場合には,タイムティックの周期を長くすることで,プロセッサの処理
90 負荷を低減する方法がある.
91
92 タイムティックの周期の与え方はターゲット依存であるため,これが変更でき
93 るかどうかは,ターゲット依存部のタイマドライバの実装を調べる必要がある.
94 標準的には,target_kernel.h(またはそこからインクルードされるファイル)
95 中に定義されているTIC_NUMEとTIC_DENOを書き換えることで,変更できるよう
96 に実装されている.
97
98
99 ○特殊目的のレジスタの扱い
100
101 FPUレジスタやDSPレジスタなどの特殊目的のレジスタ(以下,特殊レジスタ)
102 を持つプロセッサでは,レジスタの扱いについて大きく次の3つの方法が考えら
103 れる.
104
105 (1) 特殊レジスタをタスクのコンテキストに含めない
106
107 1つのタスクのみが特殊レジスタを使用する場合には,特殊レジスタをタスクの
108 コンテキストに含める必要がなく,カーネルで管理する必要がない.
109
110 (2) 特殊レジスタをタスクのコンテキストに含める
111
112 複数のタスクが特殊レジスタを使用する場合には,特殊レジスタをタスクのコ
113 ンテキストに含める方法が最も単純である.そのためには,タスクディスパッ
114 チャと割込みハンドラ/CPU例外ハンドラの出入口で,特殊レジスタを保存/復帰
115 するコードを追加する必要がある.実際の保存/復帰場所は,スクラッチレジス
116 タとそれ以外のレジスタで異なるため,注意が必要である.
117
118 (3) 特殊レジスタをコンテキストに含めるかどうかをタスク毎に指定する
119
120 特殊レジスタを使用するタスクと使用しないタスクがある場合で,すべてのタ
121 スクのコンテキストに特殊レジスタを含める方法ではオーバヘッドが問題にな
122 る場合には,特殊レジスタをコンテキストに含めるかどうかをタスク毎に指定
123 する方法が有力である.これを実現する方法は次の通りである.
124
125 まず,特殊レジスタをコンテキストに含めるかどうかを指定するタスク属性を
126 設ける.例えば,FPUレジスタであれば,タスク属性にTA_FPUを設ける.タスク
127 ディスパッチャでは,タスク属性を見て,その属性が設定されていれば特殊レ
128 ジスタを保存/復帰する.
129
130 ハードウェア的に特殊レジスタがディスエーブルできる場合には,その属性が
131 設定されていないタスクに切り換える時に特殊レジスタをディスエーブルする
132 と,誤って特殊レジスタを使った場合を検出できる.
133
134 さらに,割込みハンドラ(ISR,周期ハンドラ,アラームハンドラを含む)や
135 CPU例外ハンドラで特殊レジスタを使用する場合には,これらの処理単位にも
136 特殊レジスタを使用するかどうかの属性を設ける方法が考えられる.
137
138 ここで,タスク(または他の処理単位)が特殊レジスタを使用するかどうかは,
139 コンパイラやライブラリに依存する場合があるため,注意が必要である.例え
140 ば,浮動小数点演算を含まないプログラムであっても,コンパイラがその方が
141 性能が高いと判断すれば,浮動小数点命令を生成する場合がある.
142
143
144 ○ミューテックス機能拡張パッケージ
145
146 ASPカーネルに,ミューテックス機能を追加するための拡張パッケージを用意し
147 ている.ただし,優先度逆転を制御するための仕組みとして,優先度上限ミュー
148 テックス(TA_CEILING属性のミューテックス)のみをサポートし,優先度継承
149 ミューテックス(TA_INHERIT属性のミューテックス)はサポートしていない.
150
151 拡張パッケージは,extension/mutexディレクトリに置いてある.拡張パッケー
152 ジを使用する場合には,UNIXであれば,ASPカーネルのソースファイルのトップ
153 ディレクトリで,
154
155         % cp -r extension/mutex/* .
156
157 を実行する.この時,元の(拡張前の)ソースファイルは上書きされてしまう
158 ため,拡張しないカーネルも使用したい場合には,別のディレクトリにソース
159 ファイルを展開して,上のコマンドを実行すること.また,複数の拡張パッケー
160 ジを使う場合には,それらが衝突する可能性があるので,注意が必要である.
161
162 ミューテックス機能拡張パッケージでは,TOPPERS_SUPPORT_MUTEXがkernel.h中
163 で定義されているので,これを用いてミューテックス機能を使用できるかどう
164 かを判別することができる.
165
166
167 ○オーバランハンドラ機能拡張パッケージ
168
169 ASPカーネルに,オーバランハンドラ機能を追加するための拡張パッケージを用
170 意している.ただし,この拡張パッケージを使うためには,ターゲット依存部
171 が対応している必要がある.
172
173 拡張パッケージは,extension/ovrhdrディレクトリに置いてある.拡張パッケー
174 ジの使用方法は,ミューテックス機能と同様である.
175
176 オーバランハンドラ機能拡張パッケージで,ターゲット依存部が拡張パッケー
177 ジに対応している場合には,TOPPERS_SUPPORT_OVRHDRがkernel.h中で定義され
178 るので,これを用いてオーバランタイマ機能が使用できるかどうかを判別する
179 ことができる.
180
181
182 ○タスク優先度拡張パッケージ
183
184 タスク優先度を最大256段階に拡張するための拡張パッケージを用意している.
185 この拡張パッケージは,タスク優先度に加えて,データ優先度,メッセージ優
186 先度,割込みサービスルーチン優先度も256段階に拡張する.
187
188 拡張パッケージは,extension/pri_levelディレクトリに置いてある.拡張パッ
189 ケージの使用方法は,ミューテックス機能と同様である.
190
191 タスク優先度拡張パッケージでは,TOPPERS_SUPPORT_PRI_LEVELがkernel.h中で
192 定義されているので,これを用いてタスク優先度の範囲が拡張されているかど
193 うかを判別することができる.
194
195
196 ○CPU例外ハンドラの直接呼出し
197
198 CPU例外ハンドラの出入口処理は,CPU例外が発生しないように実装しなければ
199 ならないが,これが防げないターゲットにおいては,CPU例外ハンドラの出入口
200 処理を経由せずに,アプリケーションが用意したCPU例外ハンドラを直接実行す
201 る方法を用意するのが望ましい.これを,CPU例外ハンドラの直接呼出しと呼ぶ.
202
203 ここでは,ハードウェアでベクタテーブルを持つプロセッサにおいて,ターゲッ
204 ト依存部のみの修正により,CPU例外ハンドラの直接呼出しの機能を追加する方
205 法について説明する.
206
207 ●TA_DIRECT属性の導入
208
209 CPU例外ハンドラの直接呼出しを指定するために,CPU例外ハンドラ属性に,
210 TA_DIRECT属性を導入する.
211
212 ●ターゲット依存部の修正箇所
213
214 TA_DIRECTの値を,target_kernel.h(または,そこからインクルードされるファ
215 イル)で定義し,その値をコンフィギュレータが取り出せるように,
216 target_def.csv(または,それに代わるファイル)に次の行を追加する.
217
218 TA_DIRECT,TA_DIRECT
219
220 次に,target.tf(または,そこからインクルードされるファイル)で,
221 TARGET_INHATRに設定される値に,TA_DIRECTを追加する.例えば,TARGET_INHATR
222 にTA_NONKERNELのみが設定されていた場合には,次のように修正する.
223
224 $TARGET_INHATR = TA_NONKERNEL | TA_DIRECT$
225
226 次に,OMIT_INITILIZE_EXCEPTIONを用いて,CPU例外ハンドラの出入口処理を生
227 成するための記述とCPU例外ハンドラ初期化ブロックの標準の定義が生成される
228 のを抑止し,それによって抑止される部分をtarget.tfにコピーした上で,以下
229 の修正を加える.
230
231 CPU例外ハンドラの出入口処理を生成するための記述(EXCHDR_ENTRYのリスト)
232 を生成する部分は,次のように修正する.
233
234 $FOREACH excno EXC.ORDER_LIST$
235         $IF (EXC.EXCATR[excno] & TA_DIRECT) == 0$
236                 EXCHDR_ENTRY($EXC.EXCNO[excno]$, $+EXC.EXCNO[excno]$, $EXC.EXCHDR[excno]$)$NL$
237         $END$
238 $END$
239
240 また,CPU例外ハンドラ初期化ブロックの定義を生成する部分は,次のように修
241 正する.
242
243 const EXCINIB _kernel_excinib_table[TNUM_EXCNO] = {$NL$
244 $JOINEACH excno EXC.ORDER_LIST ",\n"$
245         $IF (EXC.EXCATR[excno] & TA_DIRECT) == 0$
246                 $TAB${ ($EXC.EXCNO[excno]$), ($EXC.EXCATR[excno]$), (FP)(EXC_ENTRY($EXC.EXCNO[excno]$, $EXC.EXCHDR[excno]$)) }
247         $ELSE$
248                 $TAB${ ($EXC.EXCNO[excno]$), ($EXC.EXCATR[excno]$), (FP)($EXC.EXCHDR[excno]$) }
249         $END$
250 $END$$NL$
251 };$NL$
252
253 以上