source: asp3_wo_tecs/trunk/doc/extension.txt@ 302

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

TECSレスのASP3の開発のため以下のtrunkからコピー
http://dev.toppers.jp/svn/asp3/branches/WO_TECS-3.C.0

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