source: rtos_arduino/trunk/asp_1.9.2/doc/extension.txt@ 136

Last change on this file since 136 was 136, checked in by ertl-honda, 8 years ago

ライブラリとOS及びベーシックなサンプルの追加.

File size: 22.1 KB
Line 
1
2 TOPPERS/ASPカーネル
3 機能拡張・チューニングガイド
4
5 対応バージョン: Release 1.9.2
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 上記著作権者
20は,以下の(1)~(4)の条件を満たす場合に限り,本ソフトウェ
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およびTOPPERSプロジェクトを
53 å…
54è²¬ã™ã‚‹ã“と.
55
56 本ソフトウェアは,無保証で提供されているものである.上記著作権者
57お
58 よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
59 に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
60 アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
61 の責任を負わない.
62
63 $Id: extension.txt 2676 2015-05-26 15:16:46Z ertl-hiro $
64----------------------------------------------------------------------
65
66○目次
67
68・エラーチェックの省略
69・タイムティックの周期の変更
70・特殊目的のレジスタの扱い
71・拡張パッケージの使い方
72 - ミューテックス機能拡張パッケージ
73 - メッセージバッファ機能拡張パッケージ
74 - オーバランハンドラ機能拡張パッケージ
75 - タスク優å…
76ˆåº¦æ‹¡å¼µãƒ‘ッケージ
77 - 制約タスク拡張パッケージ
78 - 動的生成機能拡張パッケージ
79・CPU例外ハンドラの直接呼出し
80 - TA_DIRECT属性の導å…
81¥
82 - ターゲット依存部の修正箇所
83
84
85○エラーチェックの省略
86
87サービスコールのオーバヘッドを削減するために,静的なエラーのチェックを
88省略する場合がある.ASPカーネルにおいては,静的なエラーのチェックはすべ
89てCHECKマクロを用いて行っているため,kernel/check.h中のCHECKマクロを編
90集することで,静的なエラーのチェックを省略することができる.
91
92例えば,タスクIDのチェックを省略したい場合には,CHECK_TSKIDマクロと
93CHECK_TSKID_SELFマクロを,次のように修正すればよい.
94
95#define CHECK_TSKID(tskid) ((void)(tskid))
96#define CHECK_TSKID_SELF(tskid) ((void)(tskid))
97
98これらのマクロの定義を空にする方法もあるが,パラメータに副作用のある式
99が書かれている可能性を考えると(副作用のある式は書くべきではないが,書
100かれているコードがå…
101¥ã£ã¦ãã‚‹å¯èƒ½æ€§ãŒå…
102¨ããªã„とは言えない),上の定義の
103方が安å…
104¨ã§ã‚る.副作用のない式であれば,最適化によって削除することがで
105きるため,実行時効率には影響がないと期待
106できる.ただし,最適化によって
107削除されない場合には,副作用のある式が書かれていないことを確認した上で,
108マクロの定義を空にしてもよい.
109
110
111○タイムティックの周期の変更
112
113ASPカーネルでは,カーネルへタイムティックを供給する周期は1ミリ秒が標準
114となっているが,低速なプロセッサでは1ミリ秒毎に割込みを処理するオーバヘッ
115ドが問題になる場合がある.そこで,アプリケーションが必
116要とする時間精度
117が粗い場合には,タイムティックの周期を長くすることで,プロセッサの処理
118負荷を低減する方法がある.
119
120タイムティックの周期の与え方はターゲット依存であるため,これが変更でき
121るかどうかは,ターゲット依存部のタイマドライバの実装
122を調べる必
123要がある.
124標準的には,target_kernel.h(またはそこからインクルードされるファイル)
125中に定義されているTIC_NUMEとTIC_DENOを書き換えることで,変更できるよう
126に実装
127されている.
128
129
130○特殊目的のレジスタの扱い
131
132FPUレジスタやDSPレジスタなどの特殊目的のレジスタ(以下,特殊レジスタ)
133を持つプロセッサでは,レジスタの扱いについて大きく次の3つの方法が考えら
134れる.
135
136(1) 特殊レジスタをタスクのコンテキストに含めない
137
1381つのタスクのみが特殊レジスタを使用する場合には,特殊レジスタをタスクの
139コンテキストに含める必
140要がなく,カーネルで管理する必
141要がない.
142
143(2) 特殊レジスタをタスクのコンテキストに含める
144
145複数のタスクが特殊レジスタを使用する場合には,特殊レジスタをタスクのコ
146ンテキストに含める方法が最も単純である.そのためには,タスクディスパッ
147チャと割込みハンドラ/CPU例外ハンドラの出å…
148¥å£ã§ï¼Œç‰¹æ®Šãƒ¬ã‚¸ã‚¹ã‚¿ã‚’保存/復帰
149するコードを追加する必
150要がある.実際の保存/復帰場所は,スクラッチレジス
151タとそれ以外のレジスタで異なるため,注意が必
152要である.
153
154(3) 特殊レジスタをコンテキストに含めるかどうかをタスク毎に指定する
155
156特殊レジスタを使用するタスクと使用しないタスクがある場合で,すべてのタ
157スクのコンテキストに特殊レジスタを含める方法ではオーバヘッドが問題にな
158る場合には,特殊レジスタをコンテキストに含めるかどうかをタスク毎に指定
159する方法が有力である.これを実現する方法は次の通りである.
160
161まず,特殊レジスタをコンテキストに含めるかどうかを指定するタスク属性を
162設ける.例えば,FPUレジスタであれば,タスク属性にTA_FPUを設ける.タスク
163ディスパッチャでは,タスク属性を見て,その属性が設定されていれば特殊レ
164ジスタを保存/復帰する.
165
166ハードウェア的に特殊レジスタがディスエーブルできる場合には,その属性が
167設定されていないタスクに切り換える時に特殊レジスタをディスエーブルする
168と,誤って特殊レジスタを使った場合を検出できる.
169
170さらに,割込みハンドラ(ISR,周期ハンドラ,アラームハンドラを含む)や
171CPU例外ハンドラで特殊レジスタを使用する場合には,これらの処理単位にも
172特殊レジスタを使用するかどうかの属性を設ける方法が考えられる.
173
174ここで,タスク(または他の処理単位)が特殊レジスタを使用するかどうかは,
175コンパイラやライブラリに依存する場合があるため,注意が必
176要である.例え
177ば,浮動小数点演算を含まないプログラムであっても,コンパイラがその方が
178性能が高いと判断すれば,浮動小数点命令を生成する場合がある.
179
180
181○拡張パッケージの使い方
182
183ASPカーネルでは,いくつかの拡張機能を実装
184するために,拡張パッケージをサ
185ポートしている.拡張パッケージは,extensionディレクトリに置いてある.
186
187拡張パッケージを使用する場合には,UNIXであれば,ASPカーネルのソースファ
188イルのトップディレクトリで,
189
190 % cp -r extension/<拡張パッケージのディレクトリ名>/* .
191
192を実行する.この時,å…
193ƒã®ï¼ˆæ‹¡å¼µå‰ã®ï¼‰ã‚½ãƒ¼ã‚¹ãƒ•ã‚¡ã‚¤ãƒ«ã¯ä¸Šæ›¸ãã•ã‚Œã¦ã—まう
194ため,拡張しないカーネルも使用したい場合には,別のディレクトリにソース
195ファイルを展開して,上のコマンドを実行すること.
196
197複数の拡張パッケージを使うことは考æ…
198®ã—ていないが,以下に述べるケースを
199除いては,手作業により複数の拡張パッケージをマージすることは可能である.
200現時点では,ミューテックス機能拡張パッケージと制約タスク拡張パッケージ
201をマージすることはできない.また,動的生成機能拡張パッケージを他の拡張
202パッケージとマージすることは考æ…
203®ã—ていない.
204
205●ミューテックス機能拡張パッケージ
206
207ミューテックス機能拡張パッケージは,ミューテックス機能を追加するための
208拡張パッケージである.ただし,優å…
209ˆåº¦é€†è»¢ã‚’制御するための仕組みとして,
210優å…
211ˆåº¦ä¸Šé™ãƒŸãƒ¥ãƒ¼ãƒ†ãƒƒã‚¯ã‚¹ï¼ˆTA_CEILING属性のミューテックス)のみをサポー
212トし,優å…
213ˆåº¦ç¶™æ‰¿ãƒŸãƒ¥ãƒ¼ãƒ†ãƒƒã‚¯ã‚¹ï¼ˆTA_INHERIT属性のミューテックス)はサポー
214トしていない.ミューテックス機能拡張パッケージは,extension/mutexディレ
215クトリに置いてある.
216
217ミューテックス機能拡張パッケージでは,TOPPERS_SUPPORT_MUTEXがkernel.h中
218で定義されているので,これを用いてミューテックス機能を使用できるかどう
219かを判別することができる.
220
221●メッセージバッファ機能拡張パッケージ
222
223メッセージバッファ機能拡張パッケージは,メッセージバッファ機能を追加す
224るための拡張パッケージである.メッセージバッファ機能拡張パッケージは,
225extension/messagebufディレクトリに置いてある.
226
227メッセージバッファ機能拡張パッケージでは,TOPPERS_SUPPORT_MESSAGEBUFが
228kernel.h中で定義されているので,これを用いてメッセージバッファ機能を使
229用できるかどうかを判別することができる.
230
231●オーバランハンドラ機能拡張パッケージ
232
233オーバランハンドラ機能拡張パッケージは,オーバランハンドラ機能を追加す
234るための拡張パッケージである.ただし,この拡張パッケージを使うためには,
235ターゲット依存部が対応している必
236要がある.オーバランハンドラ機能拡張パッ
237ケージは,extension/ovrhdrディレクトリに置いてある.
238
239オーバランハンドラ機能拡張パッケージで,ターゲット依存部が拡張パッケー
240ジに対応している場合には,TOPPERS_SUPPORT_OVRHDRがkernel.h中で定義され
241るので,これを用いてオーバランタイマ機能が使用できるかどうかを判別する
242ことができる.
243
244●タスク優å…
245ˆåº¦æ‹¡å¼µãƒ‘ッケージ
246
247タスク優å…
248ˆåº¦æ‹¡å¼µãƒ‘ッケージは,タスク優å…
249ˆåº¦ã‚’最大256段階に拡張するための
250拡張パッケージである.この拡張パッケージは,タスク優å…
251ˆåº¦ã«åŠ ãˆã¦ï¼Œãƒ‡ãƒ¼
252タ優å…
253ˆåº¦ï¼Œãƒ¡ãƒƒã‚»ãƒ¼ã‚¸å„ªå…
254ˆåº¦ï¼Œå‰²è¾¼ã¿ã‚µãƒ¼ãƒ“スルーチン優å…
255ˆåº¦ã‚‚256段階に拡張
256する.タスク優å…
257ˆåº¦æ‹¡å¼µãƒ‘ッケージは,extension/pri_levelディレクトリに置
258いてある.
259
260タスク優å…
261ˆåº¦æ‹¡å¼µãƒ‘ッケージでは,TOPPERS_SUPPORT_PRI_LEVELがkernel.h中で
262定義されているので,これを用いてタスク優å…
263ˆåº¦ã®ç¯„囲が拡張されているかど
264うかを判別することができる.
265
266●制約タスク拡張パッケージ
267
268制約タスク拡張パッケージは,制約タスクの機能を追加するための拡張パッケー
269ジである.TOPPERS新世代カーネル統合仕様書に規定された制約タスクの機能に
270加えて,自タスクのベース優å…
271ˆåº¦ã‚’変更するサービスコールras_priを実装
272して
273いる.制約タスク拡張パッケージは,extension/rstr_taskディレクトリに置い
274てある.
275
276制約タスク拡張パッケージでは,TOPPERS_SUPPORT_RSTR_TASKがkernel.h中で定
277義されているので,これを用いて制約タスクの機能が使用できるかどうかを判
278別することができる.
279
280----------------------------------------------------------------------
281ras_pri 自タスクのベース優å…
282ˆåº¦ã®å¼•ãä¸Šã’〔T〕
283
284【C言語API】
285 ER ercd = ras_pri(PRI tskpri)
286
287【パラメータ】
288 PRI tskpri ベース優å…
289ˆåº¦
290
291【リターンパラメータ】
292 ER ercd 正常終了(E_OK)またはエラーコード
293
294【エラーコード】
295 E_CTX コンテキストエラー
296 ・非タスクコンテキストからの呼出し
297 ・CPUロック状æ…
298‹ã‹ã‚‰ã®å‘¼å‡ºã—
299 E_PAR パラメータエラー
300 ・tskpriが有効範囲外
301 E_ILUSE サービスコール不正使用
302 ・条件については機能の項
303を参ç…
304§
305
306【機能】
307
308自タスクのベース優å…
309ˆåº¦ã‚’,tskpriで指定した優å…
310ˆåº¦ã«å¤‰æ›´ã™ã‚‹ï¼Žå…
311·ä½“的な振
312舞いは以下の通り.
313
314自タスクのベース優å…
315ˆåº¦ãŒï¼Œtskpriで指定した優å…
316ˆåº¦ã«å¤‰æ›´ã•ã‚Œã‚‹ï¼Žãã‚Œã«ä¼´ã£
317て,自タスクの現在優å…
318ˆåº¦ã‚‚変更される.同じ優å…
319ˆåº¦ã®ã‚¿ã‚¹ã‚¯ã®ä¸­ã§ã¯ï¼Œè‡ªã‚¿
320スクが最高優å…
321ˆé †ä½ã¨ãªã‚‹ï¼Ž
322
323tskpriにTPRI_INI(=0)を指定すると,自タスクのベース優å…
324ˆåº¦ãŒï¼Œèµ·å‹•æ™‚優
325å…
326ˆåº¦ã«å¤‰æ›´ã•ã‚Œã‚‹ï¼Ž
327
328tskpriは,自タスクの起動時優å…
329ˆåº¦ã¨åŒã˜ã‹ãã‚Œã‚ˆã‚Šã‚‚高くなければならない.
330そうでない場合には,E_ILUSEエラーとなる.
331----------------------------------------------------------------------
332
333●動的生成機能拡張パッケージ
334
335動的生成機能拡張パッケージは,オブジェクトの動的生成機能を追加するため
336の拡張パッケージである.TOPPERS新世代カーネル統合仕様書に規定された以下
337のオブジェクト生成/削除のためのサービスコール,割付け可能なID番号の数
338を指定する静的APIに加えて,カーネルが割り付けるメモリ領域を設定する静的
339API DEF_KMMを実装
340している.動的生成機能拡張パッケージは,extension/dcre
341ディレクトリに置いてある.
342
343ただし,カーネル内
344での動的メモリ管理に関しては,ターゲット非依存部では,
345メモリ領域をå…
346ˆé ­ã‹ã‚‰é †ã«å‰²ã‚Šå½“て,解放されたメモリ領域を再利用しないメ
347モリ管理モジュールのみを実装
348している.本格的な動的メモリ管理を行いたい
349場合には,ターゲット依存部またはユーザ側で,そのための関数を用意する必
350
351要がある.用意する関数等については,「TOPPERS/ASPカーネル ターゲット依
352存部 ポーティングガイド」の「6.15 動的メモリ管理」の節を参ç…
353§ã™ã‚‹ã“と.
354
355動的機能拡張拡張パッケージでは,TOPPERS_SUPPORT_DYNAMIC_CREがkernel.h中
356で定義されているので,これを用いて動的生成機能が使用できるかどうかを判
357別することができる.
358
359動的生成機能拡張パッケージにより追加されるサービスコール
360
361 ER_ID tskid = acre_tsk(const T_CTSK *pk_ctsk)
362 ER ercd = del_tsk(ID tskid)
363 ER ercd = def_tex(ID tskid, const T_DTEX *pk_dtex)
364 ER_ID semid = acre_sem(const T_CSEM *pk_csem)
365 ER ercd = del_sem(ID semid)
366 ER_ID flgid = acre_flg(const T_CFLG *pk_cflg)
367 ER ercd = del_flg(ID flgid)
368 ER_ID dtqid = acre_dtq(const T_CDTQ *pk_cdtq)
369 ER ercd = del_dtq(ID dtqid)
370 ER_ID pdqid = acre_pdq(const T_CPDQ *pk_cpdq)
371 ER ercd = del_pdq(ID pdqid)
372 ER_ID mbxid = acre_mbx(const T_CMBX *pk_cmbx)
373 ER ercd = del_mbx(ID mbxid)
374 ER_ID mpfid = acre_mpf(const T_CMPF *pk_cmpf)
375 ER ercd = del_mpf(ID mpfid)
376 ER_ID cycid = acre_cyc(const T_CCYC *pk_ccyc)
377 ER ercd = del_cyc(ID cycid)
378 ER_ID almid = acre_alm(const T_CALM *pk_calm)
379 ER ercd = del_alm(ID almid)
380 ER_ID isrid = acre_isr(const T_CISR *pk_cisr)
381 ER ercd = del_isr(ID isrid)
382
383動的生成機能拡張パッケージにより追加される静的API
384
385 AID_TSK(uint_t notsk)
386 AID_SEM(uint_t nosem)
387 AID_FLG(uint_t noflg)
388 AID_DTQ(uint_t nodtq)
389 AID_PDQ(uint_t nopdq)
390 AID_MBX(uint_t nombx)
391 AID_MPF(uint_t nompf)
392 AID_CYC(uint_t nocyc)
393 AID_ALM(uint_t noalm)
394 AID_ISR(uint_t noisr)
395 DEF_KMM({ SIZE kmmsz, STK_T *kmm })
396
397----------------------------------------------------------------------
398DEF_KMM カーネルが割り付けるメモリ領域の設定〔SD〕
399
400【静的API】
401 DEF_KMM({ SIZE kmmsz, STK_T *kmm })
402
403【パラメータ】
404 *カーネルが割り付けるメモリ領域の設定情
405å ±
406 SIZE kmmsz カーネルが割り付けるメモリ領域のサイズ(バイト数)
407 STK_T kmm カーネルが割り付けるメモリ領域のå…
408ˆé ­ç•ªåœ°
409
410【エラーコード】
411 E_PAR パラメータエラー
412 ・kmmszが0以下
413 ・その他の条件については機能の項
414を参ç…
415§
416 E_OBJ オブジェクト状æ…
417‹ã‚¨ãƒ©ãƒ¼
418 ・カーネルが割り付けるメモリ領域が設定済み
419
420【機能】
421
422各パラメータで指定したカーネルが割り付けるメモリ領域の設定情
423報に従って,
424カーネルが割り付けるメモリ領域を設定する.
425
426kmmszは整数定数式パラメータ,kmmは一般定数式パラメータである.
427
428kmmをNULLとした場合,kmmszで指定したサイズのメモリ領域を,コンフィギュ
429レータが確保する.kmmszにターゲット定義の制約に合致しないサイズを指定し
430た時には,ターゲット定義の制約に合致するようにサイズを大きい方に丸めて
431確保する.
432
433カーネルが割り付けるメモリ領域をアプリケーションで確保する場合には,
434kmmszで指定したサイズのメモリ領域を確保し,kmmにそのå…
435ˆé ­ç•ªåœ°ã‚’指定する.
436
437DEF_KMMによりカーネルが割り付けるメモリ領域を設定しない場合,カーネルが
438割り付けるメモリ領域は確保されない.
439
440kmmやkmmszにターゲット定義の制約に合致しないå…
441ˆé ­ç•ªåœ°ã‚„サイズを指定した
442時には,E_PARエラーとなる.
443----------------------------------------------------------------------
444
445
446○CPU例外ハンドラの直接呼出し
447
448CPU例外ハンドラの出å…
449¥å£å‡¦ç†ã¯ï¼ŒCPU例外が発生しないように実装
450しなければ
451ならないが,これが防げないターゲットにおいては,CPU例外ハンドラの出å…
452¥å£
453処理を経由せずに,アプリケーションが用意したCPU例外ハンドラを直接実行す
454る方法を用意するのが望ましい.これを,CPU例外ハンドラの直接呼出しと呼ぶ.
455
456ここでは,ハードウェアでベクタテーブルを持つプロセッサにおいて,ターゲッ
457ト依存部のみの修正により,CPU例外ハンドラの直接呼出しの機能を追加する方
458法について説明する.
459
460●TA_DIRECT属性の導å…
461¥
462
463CPU例外ハンドラの直接呼出しを指定するために,CPU例外ハンドラ属性に,
464TA_DIRECT属性を導å…
465¥ã™ã‚‹ï¼Ž
466
467●ターゲット依存部の修正箇所
468
469TA_DIRECTの値を,target_kernel.h(または,そこからインクルードされるファ
470イル)で定義し,その値をコンフィギュレータが取り出せるように,
471target_def.csv(または,それに代わるファイル)に次の行を追加する.
472
473TA_DIRECT,TA_DIRECT
474
475次に,target.tf(または,そこからインクルードされるファイル)で,
476TARGET_EXCATRに設定される値に,TA_DIRECTを追加する.例えば,他のターゲッ
477ト依存のCPU例外ハンドラ属性がない場合には,次のように設定する.
478
479$TARGET_EXCATR = TA_DIRECT$
480
481次に,OMIT_INITILIZE_EXCEPTIONを用いて,CPU例外ハンドラの出å…
482¥å£å‡¦ç†ã‚’生
483成するための記述とCPU例外ハンドラ初期化ブロックの標準の定義が生成される
484のを抑止し,それによって抑止される部分をtarget.tfにコピーした上で,以下
485の修正を加える.
486
487CPU例外ハンドラの出å…
488¥å£å‡¦ç†ã‚’生成するための記述(EXCHDR_ENTRYのリスト)
489を生成する部分は,次のように修正する.
490
491$FOREACH excno EXC.ORDER_LIST$
492 $IF (EXC.EXCATR[excno] & TA_DIRECT) == 0$
493 EXCHDR_ENTRY($EXC.EXCNO[excno]$, $+EXC.EXCNO[excno]$, $EXC.EXCHDR[excno]$)$NL$
494 $END$
495$END$
496
497また,CPU例外ハンドラ初期化ブロックの定義を生成する部分は,次のように修
498正する.
499
500$IF LENGTH(EXC.ORDER_LIST)$
501 const EXCINIB _kernel_excinib_table[TNUM_EXCNO] = {$NL$
502 $JOINEACH excno EXC.ORDER_LIST ",\n"$
503 $IF (EXC.EXCATR[excno] & TA_DIRECT) == 0$
504 $TAB${ ($EXC.EXCNO[excno]$), ($EXC.EXCATR[excno]$), (FP)(EXC_ENTRY($EXC.EXCNO[excno]$, $EXC.EXCHDR[excno]$)) }
505 $ELSE$
506 $TAB${ ($EXC.EXCNO[excno]$), ($EXC.EXCATR[excno]$), (FP)($EXC.EXCHDR[excno]$) }
507 $END$
508 $END$$NL$
509 };$NL$
510$ELSE$
511 TOPPERS_EMPTY_LABEL(const EXCINIB, _kernel_excinib_table);$NL$
512$END$
513
514以上
Note: See TracBrowser for help on using the repository browser.