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

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

initial

File size: 19.8 KB
Line 
1
2 = JSPカーネル 設計メモ =
3
4 (Release 1.4対応,最終更新: 15-Mar-2005)
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
14 上記著作権者
15は,以下の (1)〜(4) の条件か,Free Software Foundation
16 によってå…
17¬è¡¨ã•ã‚Œã¦ã„ã‚‹ GNU General Public License の Version 2 に記
18 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア
19 を改変したものを含む.以下同じ)を使用・複製・改変・再é…
20å¸ƒï¼ˆä»¥ä¸‹ï¼Œ
21 利用と呼ぶ)することを無償で許諾する.
22 (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
23 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
24 スコード中に含まれていること.
25 (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
26 用できる形で再é…
27å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é…
28å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨
29 者
30マニュアルなど)に,上記の著作権表示,この利用条件および下記
31 の無保証規定を掲載すること.
32 (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
33 用できない形で再é…
34å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã„ずれかの条件を満たすこ
35 と.
36 (a) 再é…
37å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€…
38マニュアルなど)に,上記の著
39 作権表示,この利用条件および下記の無保証規定を掲載すること.
40 (b) 再é…
41å¸ƒã®å½¢æ…
42‹ã‚’,別に定める方法によって,TOPPERSプロジェクトに
43 報告すること.
44 (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
45 害からも,上記著作権者
46およびTOPPERSプロジェクトをå…
47è²¬ã™ã‚‹ã“と.
48
49 本ソフトウェアは,無保証で提供されているものである.上記著作権者
50お
51 よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も
52 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直
53 接的または間接的に生じたいかなる損害に関しても,その責任を負わない.
54
55 @(#) $Id: design.txt,v 1.11 2005/08/08 11:20:06 hiro Exp $
56------------------------------------------------------------------------
57
58
591.JSPカーネルにおける制限事項
60
61
62(1) サポートする機能
63
64JSPカーネルは,名前の通りスタンダードプロファイルに含まれる機能のみを
65サポートする.スタンダードプロファイル外の機能は,原則としてサポートし
66ない.
67
68内
69部構造の設計にあたっては,スタンダードプロファイル外の機能をサポート
70するための拡張性は考æ…
71®ã›ãšï¼Œã‚¹ã‚¿ãƒ³ãƒ€ãƒ¼ãƒ‰ãƒ—ロファイルに含まれる機能を効
72率良く実現することを目指す.
73
74(2) サービスコール内
75での割込みの扱い
76
77JSPカーネルでは,サービスコールはすべて割込み禁止で実行する.スタンダー
78ドプロファイルの機能の範囲内
79では,この方法で十分と考えられるが,拡張機
80能を追加する時には設計を見直すべきである.å…
81·ä½“的には,非タスクコンテキ
82ストから呼び出されたサービスコールを遅
83延実行する方法が有力である.
84
85(3) CPU例外ハンドラの実行コンテキスト
86
87JSPカーネルでは,CPU例外ハンドラは非タスクコンテキストで実行する.
88
89参考: μITRON4.0仕様では,タスクコンテキストで発生したCPU例外に対する
90CPU例外ハンドラを,タスクコンテキストで実行するか非タスクコンテキスト
91で実行するかは,実装
92定義としている.
93
94
952.実行コンテキストとシステム状æ…
96‹ã®ä»®æƒ³åŒ–
97
98(1) 実行コンテキスト
99
100実行コンテキストは,タスクコンテキストと非タスクコンテキストのいずれか
101に分類される.
102
103実行コンテキストの管理はターゲット依存部で行う.å…
104·ä½“的には,タスクコン
105テキストと非タスクコンテキストを判別する関数(sense_context)を,ター
106ゲット依存部で用意する.
107
108また,タスクコンテキストと非タスクコンテキストの間の遷移も,ターゲット
109依存部の責任である.å…
110·ä½“的には,割込みハンドラ/CPU例外ハンドラが起動
111されると非タスクコンテキストに切り換わり,割込みハンドラ/CPU例外ハン
112ドラからリターンするとå…
113ƒã®å®Ÿè¡Œã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã«æˆ»ã‚‹ã‚ˆã†ï¼Œã‚¿ãƒ¼ã‚²ãƒƒãƒˆä¾å­˜éƒ¨
114を実装
115する.
116
117(2) CPUロック状æ…
118‹
119
120システムは,CPUロック状æ…
121‹ã‹ï¼ŒCPUロック解除状æ…
122‹ã®ã„ずれかにある.CPUロッ
123ク状æ…
124‹ã§ã¯ï¼Œã™ã¹ã¦ã®å‰²è¾¼ã¿ï¼ˆã‚«ãƒ¼ãƒãƒ«ã®ç®¡ç†å¤–のものを除く.以下同じ)が
125禁止されている.
126
127CPUロック状æ…
128‹ã®ç®¡ç†ã¯ã‚¿ãƒ¼ã‚²ãƒƒãƒˆä¾å­˜éƒ¨ã§è¡Œã†ï¼Žå…
129·ä½“的には,CPUロック状æ…
130‹ï¼
131CPUロック解除状æ…
132‹ã®ã„ずれの状æ…
133‹ã§ã‚るかを判別する関数(sense_lock,
134t_sense_lock,i_sense_lock)と,CPUロック状æ…
135‹ã¨CPUロック解除状æ…
136‹ã®é–“ã‚’
137遷移させる関数(t_lock_cpu,t_unlock_cpu,i_lock_cpu,i_unlock_cpu)を,
138ターゲット依存部で用意する.これらの関数を呼び出す以外の方法で,CPUロッ
139ク状æ…
140‹ã¨CPUロック解除状æ…
141‹ã®é–“を遷移することはない.
142
143
1443.ディスパッチとタスク例外処理ルーチン起動の方法
145
146(1) ディスパッチが必
147要なタイミング
148
149ディスパッチを行う必
150要があるのは,以下のタイミングである.
151
152(a) サービスコール内
153での明示的なタスクディスパッチ要求
154
155タスクコンテキストから呼び出されたサービスコール処理において,明示的に
156タスクディスパッチが要求された場合.å…
157·ä½“的には,実行状æ…
158‹ã®ã‚¿ã‚¹ã‚¯ã‚ˆã‚Šã‚‚
159優å…
160ˆé †ä½ã®é«˜ãå®Ÿè¡Œã§ãã‚‹çŠ¶æ…
161‹ã®ã‚¿ã‚¹ã‚¯ãŒç”Ÿã˜ã‚‹å ´åˆã¨ï¼Œå®Ÿè¡ŒçŠ¶æ…
162‹ã®ã‚¿ã‚¹ã‚¯
163(自タスク)を待
164ち状æ…
165‹ã«ã™ã‚‹å ´åˆãŒã‚る.いずれの場合にも,サービスコー
166ル処理内
167でディスパッチャを明示的に呼び出すことで,ディスパッチを行う.
168
169(b) 割込みハンドラ/CPU例外ハンドラの出口
170
171割込みハンドラ/CPU例外ハンドラ(以下,ハンドラと総称する)から呼び出
172されたサービスコールでタスクディスパッチが要求された場合,ハンドラの出
173口でタスクディスパッチが必
174要かチェックし,必
175要であればタスクディスパッ
176チを行う.ハンドラが多重に起動されている場合,最も外側のハンドラの出口
177でのみ行う(※).
178
179※ プロセッサによっては,CPU例外ハンドラのå…
180¥å£å‡¦ç†ã®å…
181ˆé ­ã§ã¯ï¼Œéžã‚¿ã‚¹ã‚¯
182コンテキストであると認識させられない場合がある.このような場合,å…
183¥å£å‡¦
184理の途中でハンドラが多重に起動されても,内
185側のハンドラでさらに外側のハ
186ンドラがあることを認識できず,内
187側のハンドラでタスクディスパッチを行う
188ことになる.この場合でも,å…
189¥å£å‡¦ç†ã®éžã‚¿ã‚¹ã‚¯ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã§ã‚ると認識さ
190れない部分は,ハンドラの一部ではないと解釈すれば,上記の原則は守られて
191いることになる.この注記は,以下の記述にも同様にあてはまる.
192
193(2) タスク例外処理ルーチンの起動が必
194要なタイミング
195
196タスク例外処理ルーチンを起動するのは,仕様書によると,「タスク例外処理
197許可状æ…
198‹ã€ã€Œä¿ç•™ä¾‹å¤–要因が 0 でない」「タスクが実行状æ…
199‹ã§ã‚る」「非タ
200スクコンテキストまたはCPU例外ハンドラが実行されていない」の四つの条件
201が揃った場合である.このことから,タスク例外処理ルーチンの起動を行う必
202
203要があるのは,以下のタイミングである.
204
205(a) タスクディスパッチの直後
206
207タスクディスパッチにより,実行状æ…
208‹ã®ã‚¿ã‚¹ã‚¯ï¼ˆruntsk)が変化する.新しく
209実行状æ…
210‹ã«ãªã£ãŸã‚¿ã‚¹ã‚¯ãŒèµ·å‹•æ¡ä»¶ã‚’満たしていれば,タスク例外処理ルーチ
211ンを起動する.
212
213(b) 割込みハンドラ/CPU例外ハンドラの出口
214
215割込みハンドラ/CPU例外ハンドラ(以下,ハンドラと総称する)の出口では,
216タスクディスパッチを行う場合がある.その場合には,(a) の理由で必
217要なら,
218タスク例外処理ルーチンを起動する.
219
220ハンドラの出口でタスクディスパッチを行わない場合でも,ハンドラ内
221で実行
222状æ…
223‹ã®ã‚¿ã‚¹ã‚¯ã«å¯¾ã—てタスク例外処理が要求された場合には,ハンドラの出口
224で起動条件をチェックし,起動条件を満たしていればタスク例外処理ルーチン
225を起動する.ハンドラが多重に起動されている場合,最も外側のハンドラの出
226口でのみ行う(※).
227
228(c) 自タスクに対するタスク例外処理の要求
229
230自タスクに対してタスク例外処理を要求した結果,自タスクが起動条件を満た
231すようになれば,タスク例外処理ルーチンを起動する.
232
233(d) タスク例外処理の許可
234
235タスク例外処理許可状æ…
236‹ã«ç§»è¡Œã—た結果,自タスクが起動条件を満たすように
237なれば,タスク例外処理ルーチンを起動する.タスク例外処理許可状æ…
238‹ã¸ã®ç§»
239行は,ena_tex の呼出しによって起こる.
240
241(3) サービスコール処理内
242での明示的なディスパッチャの呼出し
243
244タスクコンテキストから呼び出されたサービスコール処理においてディスパッ
245チが必
246要になった場合,サービスコールの処理を中断すべきタイミングで
247dispatch を呼び出す.dispatch を呼び出すと,その時点で最も優å…
248ˆé †ä½ã®é«˜
249いタスクが実行される.dispatch は,呼び出したタスクが次に実行状æ…
250‹ã«ãª
251るとタスク例外処理ルーチンの起動条件をチェックし,起動条件を満たしてい
252ればタスク例外処理ルーチンを起動する.
253
254そのため,dispatch を呼び出したサービスコールへ処理が戻ってくるのは,
255呼び出したタスクが次に実行状æ…
256‹ã¨ãªã‚Šï¼Œèµ·å‹•ã™ã¹ãã‚¿ã‚¹ã‚¯ä¾‹å¤–処理ルーチン
257がなくなった時点である.
258
259なお,dispatch の処理は,ターゲット依存部で提供される.
260
261(4) 割込みハンドラ/CPU例外ハンドラの出口での処理
262
263割込みハンドラ/CPU例外ハンドラ(以下,ハンドラと総称する)の出口処理
264では,ディスパッチが必
265要か,タスク例外処理ルーチンの起動が必
266要かをチェッ
267クし,必
268要な処理を行う.ハンドラが多重に起動されている場合,最も外側の
269ハンドラの出口でのみこの処理を行う.
270
271å…
272·ä½“的には,ディスパッチとタスク例外処理ルーチンの起動のいずれかの処理
273が必
274要な場合には reqflg を TRUE にすることとし,最も外側のハンドラの出
275口で reqflg が TRUE になっていれば,まずディスパッチが必
276要かチェックし,
277必
278要ならディスパッチを行う.ディスパッチにより新たに実行状æ…
279‹ã«ãªã£ãŸã‚¿
280スクがタスク例外処理ルーチンの起動条件を満たしていれば,タスク例外処理
281ルーチンを起動する.ディスパッチが必
282要なかった場合には,実行中のタスク
283がタスク例外処理ルーチンの起動条件を満たしているかチェックし,満たして
284いればタスク例外処理ルーチンを起動する.二つのタスク例外処理ルーチンの
285起動処理は,意味的には異なるものだが,ルーチン的にはå…
286±é€šåŒ–できる可能性
287がある.
288
289なお,ハンドラの出口処理は,ターゲット依存部で提供される.
290
291(5) タスクの起動と終了時の処理
292
293タスク起動時のレジスタ復帰と,タスク終了時のレジスタ保存は,ターゲット
294依存部の実装
295によっては省略できる.
296
297タスクの起動は,create_context と activate_context によって,次にその
298タスクへのディスパッチが起こった時に,タスクの起動番地から実行するよう
299にタスクコンテキストを設定することで行う.
300
301タスク終了時には,unlock_cpu に代えて,exit_and_dispatch を呼び出す.
302exit_and_dispatch は,現在実行中のコンテキストを保存せずに,ディスパッ
303チを行う関数である.
304
305なお,create_context,activate_context,exit_and_dispatch の処理は,ター
306ゲット依存部で提供される.
307
308(6) 実行できる状æ…
309‹ã®ã‚¿ã‚¹ã‚¯ãŒãªã„場合の扱い
310
311実行できる状æ…
312‹ã®ã‚¿ã‚¹ã‚¯ãŒãªã„場合の対策として,アイドルタスクを導å…
313¥ã™ã‚‹
314方法がある.アイドルタスクを導å…
315¥ã™ã‚‹ã¨ï¼Œãƒ‡ã‚£ã‚¹ãƒ‘ッチャの途中で割込み待
316
317ちをする必
318要がないので,ソフトウェアの構造的にはエレガントになる.また,
319ディスパッチャ中での条件分岐も減る.逆に,RAM の使用量がどうしても増え
320てしまうという問題がある.このことから,アイドルタスクは使わない方針と
321する.
322
323(7) ディスパッチ保留状æ…
324‹ã®ä¿æŒæ–¹æ³•
325
326ディスパッチが保留されるのは,次のいずれかの場合である.
327
328 ・ディスパッチ禁止状æ…
329‹
330 ・非タスクコンテキスト実行中
331
332CPU例外ハンドラは非タスクコンテキストで実行するとしたため,CPU例外ハン
333ドラ実行中は,非タスクコンテキスト実行中に含めて考えることができる.ま
334た,サービスコールはすべて割込み禁止で実行するため,サービスコール実行
335中も考æ…
336®ã™ã‚‹å¿…
337要がない.
338
339この中で,非タスクコンテキスト実行中は,sense_context() で判定できる.
340そこで,ディスパッチ禁止状æ…
341‹ã‚’表すBOOL型の変数を用意すれば,ディスパッ
342チ保留状æ…
343‹ãŒä¿æŒã§ãã‚‹ã“とになる.実際には,ディスパッチ許可状æ…
344‹ã‚’表す
345BOOL型の変数 enatex を導å…
346¥ã—た.
347
348※ サービスコール実行中に割込みを許可する(ディスパッチは許可しない)
349場合には,サービスコール処理の途中で起動された割込みハンドラの出口では,
350ディスパッチもタスク例外処理ルーチンの起動も行ってはならない.参ç…
351§ã™ã‚‹
352場所が違うことから,両者
353の禁止を別々
354の変数にする方法も考えられるが,設
355定する方の効率を考えると,一つの変数で両方禁止できる方が良いと思われる.
356すなわち,ディスパッチ禁止状æ…
357‹ã¨ã‚µãƒ¼ãƒ“スコール実行中状æ…
358‹ã‚’,同じ変数を
359ビットフィールドに分けて記憶するのが妥当と考えられる.さらに,CPU例外
360ハンドラをタスクコンテキストで実行する実装
361では,同じ変数にCPU例外ハン
362ドラのネスト回数も記憶したくなる.例えば,次のような変数 pndflg を導å…
363¥
364する方法が考えられる.
365
366 ・最下位ビット … サービスコール実行中
367 → 1 なら両者
368保留
369 ・下から2ビットめ … ディスパッチ禁止状æ…
370‹
371 → 1 ならタスク切替え保留
372 ・残りのビット … CPU例外ハンドラのネスト回数
373 → 0 以外ならタスク切替え保留
374
375
3764.サービスコールの記述方法
377
378(1) sns_xxx
379
380sns_ctx,sns_loc,sns_dsp,sns_tex は,サービスコール内
381部でクリティカ
382ルセクションを作らなくても実装
383できる.
384
385(2) タスクコンテキスト専用のサービスコール
386
387※ CPUロック状æ…
388‹ã§å‘¼ã°ã‚Œã‚‹ã¨ã‚¨ãƒ©ãƒ¼ã«ãªã‚‹ã“とに注意.
389
390(2-1) タスク切換えを起こさないもの(例: get_pri)
391
392 エラーチェック
393 t_lock_cpu();
394 /*
395 * クリティカルセクション実行
396 */
397 t_unlock_cpu();
398
399(2-2) タスク切換えを起こす可能性のあるもの(例: act_tsk)
400
401 エラーチェック
402 t_lock_cpu();
403 /*
404 * クリティカルセクション実行
405 */
406 if (タスクディスパッチが必
407要 && enadsp) {
408 /* 自タスクを待
409ち状æ…
410‹ã«ã™ã‚‹ã‚µãƒ¼ãƒ“スコールでは,
411 上で enadsp をチェックする必
412要はない.*/
413 dispatch();
414 }
415 t_unlock_cpu();
416
417(2-3) 自タスクを終了するもの(ext_tsk)
418
419 エラーチェック
420 t_lock_cpu();
421 /*
422 * クリティカルセクション実行
423 */
424 exit_and_dispatch();
425
426(2-4) ras_tex
427
428 エラーチェック
429 tcb = get_tcb_self(tskid);
430 t_lock_cpu();
431
432 E_OBJエラーのチェック
433
434 tcb->texptn |= rasptn;
435 if (tcb == runtsk && runtsk->enatex) {
436 texptn = runtsk->texptn;
437 runtsk->enatex = FALSE;
438 runtsk->texptn = 0;
439
440 t_unlock_cpu();
441 (*runtsk->tinib->texrtn)(texptn, runtsk->tinib->exinf);
442
443 /* CPUロック状æ…
444‹ã®ã¾ã¾ãƒªã‚¿ãƒ¼ãƒ³ã—た場合を対策 */
445 if (!t_sense_lock()) {
446 t_lock_cpu();
447 }
448
449 タスク例外処理ルーチンの起動条件を再度チェック&起動
450 (runtsk->texptn が 0 になるまで上の処理を繰り返す)
451
452 runtsk->enatex = TRUE;
453 }
454 t_unlock_cpu();
455
456(2-5) ena_tex
457
458 エラーチェック
459 t_lock_cpu();
460
461 E_OBJエラーのチェック
462
463 runtsk->enatex = TRUE;
464 if (runtsk->texptn != 0) {
465 texptn = runtsk->texptn;
466 runtsk->enatex = FALSE;
467 runtsk->texptn = 0;
468
469 t_unlock_cpu();
470 (*runtsk->tinib->texrtn)(texptn, runtsk->tinib->exinf);
471
472 /* CPUロック状æ…
473‹ã®ã¾ã¾ãƒªã‚¿ãƒ¼ãƒ³ã—た場合を対策 */
474 if (!t_sense_lock()) {
475 t_lock_cpu();
476 }
477
478 タスク例外処理ルーチンの起動条件を再度チェック&起動
479 (runtsk->texptn が 0 になるまで上の処理を繰り返す)
480
481 runtsk->enatex = TRUE;
482 }
483 t_unlock_cpu();
484
485(3) 非タスクコンテキスト専用のサービスコール
486
487※ CPUロック状æ…
488‹ã§å‘¼ã°ã‚Œã‚‹ã¨ã‚¨ãƒ©ãƒ¼ã«ãªã‚‹ã“とに注意.
489
490(3-1) タスク切替えを起こさないもの
491
492 i_lock_cpu();
493 /*
494 * クリティカルセクション実行
495 */
496 i_unlock_cpu();
497
498(3-2) タスク切替えを起こす可能性のあるもの(例: iact_tsk)
499
500 i_lock_cpu();
501 /*
502 * クリティカルセクション実行
503 *
504 * タスクディスパッチが必
505要な場合には,reqflg を TRUE にする.
506 * ただし,enadsp が FALSE の時は,reqflg を TRUE にしない.
507 */
508 i_unlock_cpu();
509
510(3-3) iras_tex
511
512 エラーチェック
513 tcb = get_tcb(tskid);
514 i_lock_cpu();
515
516 E_OBJエラーのチェック
517
518 tcb->texptn |= rasptn;
519 if (tcb == runtsk && runtsk->enatex) {
520 reqflg = TRUE;
521 }
522 i_unlock_cpu();
523
524以上
525
526
Note: See TracBrowser for help on using the repository browser.