source: rubycfg_asp/trunk/asp_dcre/doc/extension.txt@ 315

Last change on this file since 315 was 315, checked in by coas-nagasima, 7 years ago

SVNプロパティを設定

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
  • Property svn:mime-type set to text/plane; charset=UTF-8
File size: 22.1 KB
Line 
1
2 TOPPERS/ASPカーネル
3 機能拡張・チューニングガイド
4
5 対応バージョン: Release 1.9.3
6 最終更新: 2014年1月2日
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-2014 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 315 2017-07-23 05:29:40Z coas-nagasima $
49----------------------------------------------------------------------
50
51○目次
52
53・エラーチェックの省略
54・タイムティックの周期の変更
55・特殊目的のレジスタの扱い
56・拡張パッケージの使い方
57 - ミューテックス機能拡張パッケージ
58 - メッセージバッファ機能拡張パッケージ
59 - オーバランハンドラ機能拡張パッケージ
60 - タスク優先度拡張パッケージ
61 - 制約タスク拡張パッケージ
62 - 動的生成機能拡張パッケージ
63・CPU例外ハンドラの直接呼出し
64 - TA_DIRECT属性の導入
65 - ターゲット依存部の修正箇所
66
67
68○エラーチェックの省略
69
70サービスコールのオーバヘッドを削減するために,静的なエラーのチェックを
71省略する場合がある.ASPカーネルにおいては,静的なエラーのチェックはすべ
72てCHECKマクロを用いて行っているため,kernel/check.h中のCHECKマクロを編
73集することで,静的なエラーのチェックを省略することができる.
74
75例えば,タスクIDのチェックを省略したい場合には,CHECK_TSKIDマクロと
76CHECK_TSKID_SELFマクロを,次のように修正すればよい.
77
78#define CHECK_TSKID(tskid) ((void)(tskid))
79#define CHECK_TSKID_SELF(tskid) ((void)(tskid))
80
81これらのマクロの定義を空にする方法もあるが,パラメータに副作用のある式
82が書かれている可能性を考えると(副作用のある式は書くべきではないが,書
83かれているコードが入ってくる可能性が全くないとは言えない),上の定義の
84方が安全である.副作用のない式であれば,最適化によって削除することがで
85きるため,実行時効率には影響がないと期待できる.ただし,最適化によって
86削除されない場合には,副作用のある式が書かれていないことを確認した上で,
87マクロの定義を空にしてもよい.
88
89
90○タイムティックの周期の変更
91
92ASPカーネルでは,カーネルへタイムティックを供給する周期は1ミリ秒が標準
93となっているが,低速なプロセッサでは1ミリ秒毎に割込みを処理するオーバヘッ
94ドが問題になる場合がある.そこで,アプリケーションが必要とする時間精度
95が粗い場合には,タイムティックの周期を長くすることで,プロセッサの処理
96負荷を低減する方法がある.
97
98タイムティックの周期の与え方はターゲット依存であるため,これが変更でき
99るかどうかは,ターゲット依存部のタイマドライバの実装を調べる必要がある.
100標準的には,target_kernel.h(またはそこからインクルードされるファイル)
101中に定義されているTIC_NUMEとTIC_DENOを書き換えることで,変更できるよう
102に実装されている.
103
104
105○特殊目的のレジスタの扱い
106
107FPUレジスタやDSPレジスタなどの特殊目的のレジスタ(以下,特殊レジスタ)
108を持つプロセッサでは,レジスタの扱いについて大きく次の3つの方法が考えら
109れる.
110
111(1) 特殊レジスタをタスクのコンテキストに含めない
112
1131つのタスクのみが特殊レジスタを使用する場合には,特殊レジスタをタスクの
114コンテキストに含める必要がなく,カーネルで管理する必要がない.
115
116(2) 特殊レジスタをタスクのコンテキストに含める
117
118複数のタスクが特殊レジスタを使用する場合には,特殊レジスタをタスクのコ
119ンテキストに含める方法が最も単純である.そのためには,タスクディスパッ
120チャと割込みハンドラ/CPU例外ハンドラの出入口で,特殊レジスタを保存/復帰
121するコードを追加する必要がある.実際の保存/復帰場所は,スクラッチレジス
122タとそれ以外のレジスタで異なるため,注意が必要である.
123
124(3) 特殊レジスタをコンテキストに含めるかどうかをタスク毎に指定する
125
126特殊レジスタを使用するタスクと使用しないタスクがある場合で,すべてのタ
127スクのコンテキストに特殊レジスタを含める方法ではオーバヘッドが問題にな
128る場合には,特殊レジスタをコンテキストに含めるかどうかをタスク毎に指定
129する方法が有力である.これを実現する方法は次の通りである.
130
131まず,特殊レジスタをコンテキストに含めるかどうかを指定するタスク属性を
132設ける.例えば,FPUレジスタであれば,タスク属性にTA_FPUを設ける.タスク
133ディスパッチャでは,タスク属性を見て,その属性が設定されていれば特殊レ
134ジスタを保存/復帰する.
135
136ハードウェア的に特殊レジスタがディスエーブルできる場合には,その属性が
137設定されていないタスクに切り換える時に特殊レジスタをディスエーブルする
138と,誤って特殊レジスタを使った場合を検出できる.
139
140さらに,割込みハンドラ(ISR,周期ハンドラ,アラームハンドラを含む)や
141CPU例外ハンドラで特殊レジスタを使用する場合には,これらの処理単位にも
142特殊レジスタを使用するかどうかの属性を設ける方法が考えられる.
143
144ここで,タスク(または他の処理単位)が特殊レジスタを使用するかどうかは,
145コンパイラやライブラリに依存する場合があるため,注意が必要である.例え
146ば,浮動小数点演算を含まないプログラムであっても,コンパイラがその方が
147性能が高いと判断すれば,浮動小数点命令を生成する場合がある.
148
149
150○拡張パッケージの使い方
151
152ASPカーネルでは,いくつかの拡張機能を実装するために,拡張パッケージをサ
153ポートしている.拡張パッケージは,extensionディレクトリに置いてある.
154
155拡張パッケージを使用する場合には,UNIXであれば,ASPカーネルのソースファ
156イルのトップディレクトリで,
157
158 % cp -r extension/<拡張パッケージのディレクトリ名>/* .
159
160を実行する.この時,元の(拡張前の)ソースファイルは上書きされてしまう
161ため,拡張しないカーネルも使用したい場合には,別のディレクトリにソース
162ファイルを展開して,上のコマンドを実行すること.
163
164複数の拡張パッケージを使うことは考慮していないが,以下に述べるケースを
165除いては,手作業により複数の拡張パッケージをマージすることは可能である.
166現時点では,ミューテックス機能拡張パッケージと制約タスク拡張パッケージ
167をマージすることはできない.また,動的生成機能拡張パッケージを他の拡張
168パッケージとマージすることは考慮していない.
169
170●ミューテックス機能拡張パッケージ
171
172ミューテックス機能拡張パッケージは,ミューテックス機能を追加するための
173拡張パッケージである.ただし,優先度逆転を制御するための仕組みとして,
174優先度上限ミューテックス(TA_CEILING属性のミューテックス)のみをサポー
175トし,優先度継承ミューテックス(TA_INHERIT属性のミューテックス)はサポー
176トしていない.ミューテックス機能拡張パッケージは,extension/mutexディレ
177クトリに置いてある.
178
179ミューテックス機能拡張パッケージでは,TOPPERS_SUPPORT_MUTEXがkernel.h中
180で定義されているので,これを用いてミューテックス機能を使用できるかどう
181かを判別することができる.
182
183●メッセージバッファ機能拡張パッケージ
184
185メッセージバッファ機能拡張パッケージは,メッセージバッファ機能を追加す
186るための拡張パッケージである.メッセージバッファ機能拡張パッケージは,
187extension/messagebufディレクトリに置いてある.
188
189メッセージバッファ機能拡張パッケージでは,TOPPERS_SUPPORT_MESSAGEBUFが
190kernel.h中で定義されているので,これを用いてメッセージバッファ機能を使
191用できるかどうかを判別することができる.
192
193●オーバランハンドラ機能拡張パッケージ
194
195オーバランハンドラ機能拡張パッケージは,オーバランハンドラ機能を追加す
196るための拡張パッケージである.ただし,この拡張パッケージを使うためには,
197ターゲット依存部が対応している必要がある.オーバランハンドラ機能拡張パッ
198ケージは,extension/ovrhdrディレクトリに置いてある.
199
200オーバランハンドラ機能拡張パッケージで,ターゲット依存部が拡張パッケー
201ジに対応している場合には,TOPPERS_SUPPORT_OVRHDRがkernel.h中で定義され
202るので,これを用いてオーバランタイマ機能が使用できるかどうかを判別する
203ことができる.
204
205●タスク優先度拡張パッケージ
206
207タスク優先度拡張パッケージは,タスク優先度を最大256段階に拡張するための
208拡張パッケージである.この拡張パッケージは,タスク優先度に加えて,デー
209タ優先度,メッセージ優先度,割込みサービスルーチン優先度も256段階に拡張
210する.タスク優先度拡張パッケージは,extension/pri_levelディレクトリに置
211いてある.
212
213タスク優先度拡張パッケージでは,TOPPERS_SUPPORT_PRI_LEVELがkernel.h中で
214定義されているので,これを用いてタスク優先度の範囲が拡張されているかど
215うかを判別することができる.
216
217●制約タスク拡張パッケージ
218
219制約タスク拡張パッケージは,制約タスクの機能を追加するための拡張パッケー
220ジである.TOPPERS新世代カーネル統合仕様書に規定された制約タスクの機能に
221加えて,自タスクのベース優先度を変更するサービスコールras_priを実装して
222いる.制約タスク拡張パッケージは,extension/rstr_taskディレクトリに置い
223てある.
224
225制約タスク拡張パッケージでは,TOPPERS_SUPPORT_RSTR_TASKがkernel.h中で定
226義されているので,これを用いて制約タスクの機能が使用できるかどうかを判
227別することができる.
228
229----------------------------------------------------------------------
230ras_pri 自タスクのベース優先度の引き上げ〔T〕
231
232【C言語API】
233 ER ercd = ras_pri(PRI tskpri)
234
235【パラメータ】
236 PRI tskpri ベース優先度
237
238【リターンパラメータ】
239 ER ercd 正常終了(E_OK)またはエラーコード
240
241【エラーコード】
242 E_CTX コンテキストエラー
243 ・非タスクコンテキストからの呼出し
244 ・CPUロック状態からの呼出し
245 E_PAR パラメータエラー
246 ・tskpriが有効範囲外
247 E_ILUSE サービスコール不正使用
248 ・条件については機能の項を参照
249
250【機能】
251
252自タスクのベース優先度を,tskpriで指定した優先度に変更する.具体的な振
253舞いは以下の通り.
254
255自タスクのベース優先度が,tskpriで指定した優先度に変更される.それに伴っ
256て,自タスクの現在優先度も変更される.同じ優先度のタスクの中では,自タ
257スクが最高優先順位となる.
258
259tskpriにTPRI_INI(=0)を指定すると,自タスクのベース優先度が,起動時優
260先度に変更される.
261
262tskpriは,自タスクの起動時優先度と同じかそれよりも高くなければならない.
263そうでない場合には,E_ILUSEエラーとなる.
264----------------------------------------------------------------------
265
266●動的生成機能拡張パッケージ
267
268動的生成機能拡張パッケージは,オブジェクトの動的生成機能を追加するため
269の拡張パッケージである.TOPPERS新世代カーネル統合仕様書に規定された以下
270のオブジェクト生成/削除のためのサービスコール,割付け可能なID番号の数
271を指定する静的APIに加えて,カーネルが割り付けるメモリ領域を設定する静的
272API DEF_KMMを実装している.動的生成機能拡張パッケージは,extension/dcre
273ディレクトリに置いてある.
274
275ただし,カーネル内での動的メモリ管理に関しては,ターゲット非依存部では,
276メモリ領域を先頭から順に割り当て,解放されたメモリ領域を再利用しないメ
277モリ管理モジュールのみを実装している.本格的な動的メモリ管理を行いたい
278場合には,ターゲット依存部またはユーザ側で,そのための関数を用意する必
279要がある.用意する関数等については,「TOPPERS/ASPカーネル ターゲット依
280存部 ポーティングガイド」の「6.15 動的メモリ管理」の節を参照すること.
281
282動的機能拡張拡張パッケージでは,TOPPERS_SUPPORT_DYNAMIC_CREがkernel.h中
283で定義されているので,これを用いて動的生成機能が使用できるかどうかを判
284別することができる.
285
286動的生成機能拡張パッケージにより追加されるサービスコール
287
288 ER_ID tskid = acre_tsk(const T_CTSK *pk_ctsk)
289 ER ercd = del_tsk(ID tskid)
290 ER ercd = def_tex(ID tskid, const T_DTEX *pk_dtex)
291 ER_ID semid = acre_sem(const T_CSEM *pk_csem)
292 ER ercd = del_sem(ID semid)
293 ER_ID flgid = acre_flg(const T_CFLG *pk_cflg)
294 ER ercd = del_flg(ID flgid)
295 ER_ID dtqid = acre_dtq(const T_CDTQ *pk_cdtq)
296 ER ercd = del_dtq(ID dtqid)
297 ER_ID pdqid = acre_pdq(const T_CPDQ *pk_cpdq)
298 ER ercd = del_pdq(ID pdqid)
299 ER_ID mbxid = acre_mbx(const T_CMBX *pk_cmbx)
300 ER ercd = del_mbx(ID mbxid)
301 ER_ID mpfid = acre_mpf(const T_CMPF *pk_cmpf)
302 ER ercd = del_mpf(ID mpfid)
303 ER_ID cycid = acre_cyc(const T_CCYC *pk_ccyc)
304 ER ercd = del_cyc(ID cycid)
305 ER_ID almid = acre_alm(const T_CALM *pk_calm)
306 ER ercd = del_alm(ID almid)
307 ER_ID isrid = acre_isr(const T_CISR *pk_cisr)
308 ER ercd = del_isr(ID isrid)
309
310動的生成機能拡張パッケージにより追加される静的API
311
312 AID_TSK(uint_t notsk)
313 AID_SEM(uint_t nosem)
314 AID_FLG(uint_t noflg)
315 AID_DTQ(uint_t nodtq)
316 AID_PDQ(uint_t nopdq)
317 AID_MBX(uint_t nombx)
318 AID_MPF(uint_t nompf)
319 AID_CYC(uint_t nocyc)
320 AID_ALM(uint_t noalm)
321 AID_ISR(uint_t noisr)
322 DEF_KMM({ SIZE kmmsz, STK_T *kmm })
323
324----------------------------------------------------------------------
325DEF_KMM カーネルが割り付けるメモリ領域の設定〔SD〕
326
327【静的API】
328 DEF_KMM({ SIZE kmmsz, STK_T *kmm })
329
330【パラメータ】
331 *カーネルが割り付けるメモリ領域の設定情報
332 SIZE kmmsz カーネルが割り付けるメモリ領域のサイズ(バイト数)
333 STK_T kmm カーネルが割り付けるメモリ領域の先頭番地
334
335【エラーコード】
336 E_PAR パラメータエラー
337 ・kmmszが0以下
338 ・その他の条件については機能の項を参照
339 E_OBJ オブジェクト状態エラー
340 ・カーネルが割り付けるメモリ領域が設定済み
341
342【機能】
343
344各パラメータで指定したカーネルが割り付けるメモリ領域の設定情報に従って,
345カーネルが割り付けるメモリ領域を設定する.
346
347kmmszは整数定数式パラメータ,kmmは一般定数式パラメータである.
348
349kmmをNULLとした場合,kmmszで指定したサイズのメモリ領域を,コンフィギュ
350レータが確保する.kmmszにターゲット定義の制約に合致しないサイズを指定し
351た時には,ターゲット定義の制約に合致するようにサイズを大きい方に丸めて
352確保する.
353
354カーネルが割り付けるメモリ領域をアプリケーションで確保する場合には,
355kmmszで指定したサイズのメモリ領域を確保し,kmmにその先頭番地を指定する.
356
357DEF_KMMによりカーネルが割り付けるメモリ領域を設定しない場合,カーネルが
358割り付けるメモリ領域は確保されない.
359
360kmmやkmmszにターゲット定義の制約に合致しない先頭番地やサイズを指定した
361時には,E_PARエラーとなる.
362----------------------------------------------------------------------
363
364
365○CPU例外ハンドラの直接呼出し
366
367CPU例外ハンドラの出入口処理は,CPU例外が発生しないように実装しなければ
368ならないが,これが防げないターゲットにおいては,CPU例外ハンドラの出入口
369処理を経由せずに,アプリケーションが用意したCPU例外ハンドラを直接実行す
370る方法を用意するのが望ましい.これを,CPU例外ハンドラの直接呼出しと呼ぶ.
371
372ここでは,ハードウェアでベクタテーブルを持つプロセッサにおいて,ターゲッ
373ト依存部のみの修正により,CPU例外ハンドラの直接呼出しの機能を追加する方
374法について説明する.
375
376●TA_DIRECT属性の導入
377
378CPU例外ハンドラの直接呼出しを指定するために,CPU例外ハンドラ属性に,
379TA_DIRECT属性を導入する.
380
381●ターゲット依存部の修正箇所
382
383TA_DIRECTの値を,target_kernel.h(または,そこからインクルードされるファ
384イル)で定義し,その値をコンフィギュレータが取り出せるように,
385target_def.csv(または,それに代わるファイル)に次の行を追加する.
386
387TA_DIRECT,TA_DIRECT
388
389次に,target.tf(または,そこからインクルードされるファイル)で,
390TARGET_EXCATRに設定される値に,TA_DIRECTを追加する.例えば,他のターゲッ
391ト依存のCPU例外ハンドラ属性がない場合には,次のように設定する.
392
393$TARGET_EXCATR = TA_DIRECT$
394
395次に,OMIT_INITILIZE_EXCEPTIONを用いて,CPU例外ハンドラの出入口処理を生
396成するための記述とCPU例外ハンドラ初期化ブロックの標準の定義が生成される
397のを抑止し,それによって抑止される部分をtarget.tfにコピーした上で,以下
398の修正を加える.
399
400CPU例外ハンドラの出入口処理を生成するための記述(EXCHDR_ENTRYのリスト)
401を生成する部分は,次のように修正する.
402
403$FOREACH excno EXC.ORDER_LIST$
404 $IF (EXC.EXCATR[excno] & TA_DIRECT) == 0$
405 EXCHDR_ENTRY($EXC.EXCNO[excno]$, $+EXC.EXCNO[excno]$, $EXC.EXCHDR[excno]$)$NL$
406 $END$
407$END$
408
409また,CPU例外ハンドラ初期化ブロックの定義を生成する部分は,次のように修
410正する.
411
412$IF LENGTH(EXC.ORDER_LIST)$
413 const EXCINIB _kernel_excinib_table[TNUM_EXCNO] = {$NL$
414 $JOINEACH excno EXC.ORDER_LIST ",\n"$
415 $IF (EXC.EXCATR[excno] & TA_DIRECT) == 0$
416 $TAB${ ($EXC.EXCNO[excno]$), ($EXC.EXCATR[excno]$), (FP)(EXC_ENTRY($EXC.EXCNO[excno]$, $EXC.EXCHDR[excno]$)) }
417 $ELSE$
418 $TAB${ ($EXC.EXCNO[excno]$), ($EXC.EXCATR[excno]$), (FP)($EXC.EXCHDR[excno]$) }
419 $END$
420 $END$$NL$
421 };$NL$
422$ELSE$
423 TOPPERS_EMPTY_LABEL(const EXCINIB, _kernel_excinib_table);$NL$
424$END$
425
426以上
Note: See TracBrowser for help on using the repository browser.