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

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

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

  • Property svn:mime-type set to application/octet-stream
File size: 17.2 KB
Line 
1 TOPPERS Confidential
2 TOPPERSプロジェクト ディスカッションメモ
3 処理単位の実行開始/リターン時のシステム状æ…
4‹
5
6 作成者
7: 高田広章(名古屋大学)
8 最終更新: 2007年7月17日
9
10○メモの位置付け
11
12このメモは,TOPPERS新世代カーネルにおける処理単位の実行開始/リターン時
13のシステム状æ…
14‹ã«é–¢ã™ã‚‹ä»•æ§˜ã¨ï¼ŒTOPPERS/ASPカーネルにおいてそれがどのよう
15に実現されているかを記述したものである.
16
17○処理単位の実行開始/リターン時のシステム状æ…
18‹
19
20TOPPERS新世代カーネルにおける処理単位の実行開始/リターン時のシステム状
21æ…
22‹ã«ã¤ã„て,μITRON4.0仕様より強く規定する.規定の内
23容については,
24TOPPERS新世代カーネル仕様書「2.5.12 処理単位とシステム状æ…
25‹ã€ã‚’参ç…
26§ã™ã‚‹
27こと.
28
29●参考:μITRON4.0/PX仕様
30
31 CPUロック/ 割込み優å…
32ˆåº¦ ディスパッチ タスク例外
33 ロック解除状æ…
34‹ マスク 禁止/許可状æ…
35‹ 禁止/許可状æ…
36‹
37------------------------------------------------------------------------------
38【タスク】
39実行開始条件 解除 - 許可 -
40実行開始時処理 そのまま - そのまま 禁止する
41終了前 解除 - 許可 任意
42終了時処理 未規定(*1) - 未規定(*1)   -
43------------------------------------------------------------------------------
44【タスク例外処理ルーチン】
45実行開始条件 解除 - 任意 許可
46実行開始時処理 そのまま - そのまま 禁止する
47リターン前 解除 - 任意(*3) 任意
48リターン時処理 未規定(*1) - そのまま 許可する
49------------------------------------------------------------------------------
50【割込みハンドラ】
51実行開始条件 解除 - 任意 任意
52実行開始時処理 実装
53依存 - そのまま そのまま
54リターン前 実装
55定義(*2) - å…
56ƒã«æˆ»ã™(*4) 変更不可
57リターン時処理 未規定(*2) - 未規定(*1) そのまま
58------------------------------------------------------------------------------
59【ISR,タイムイベントハンドラ】
60実行開始条件 解除 - 任意 任意
61実行開始時処理 そのまま - そのまま そのまま
62リターン前 解除 - å…
63ƒã«æˆ»ã™(*4) 変更不可
64リターン時処理 未規定(*1) - 未規定(*1) そのまま
65------------------------------------------------------------------------------
66【CPU例外ハンドラ】
67実行開始条件 任意 - 任意 任意
68実行開始時処理 そのまま - そのまま そのまま
69リターン前 å…
70ƒã«æˆ»ã™ - å…
71ƒã«æˆ»ã™(*4) 変更不可
72リターン時処理 未規定(*1) - 未規定(*1) そのまま
73------------------------------------------------------------------------------
74【拡張サービスコールルーチン】
75実行開始条件 任意 - 任意 任意
76実行開始時処理 そのまま - そのまま そのまま
77リターン前 任意 - 任意 任意
78リターン時処理 そのまま - そのまま そのまま
79------------------------------------------------------------------------------
80
81(*1) リターン前の条件に従わずにリターンした場合の振舞いは未定義.リタ
82ーン前の条件に従えば,リターン直後はそのままとなる.
83
84(*2) 実装
85定義の方法に従わずリターンした場合の振舞いは未定義.実装
86定義
87の方法に従えば,リターン直後はCPUロック解除状æ…
88‹ã¨ãªã‚‹ï¼Ž
89
90(*3)「任意」は次の理由で不都合である.dis_dspとena_dspの対をネストさせ
91たい場合の対処法として,μITRON4.0仕様では,sns_dspを用いる方法を提示し
92ている.ところが,非同期に実行されるタスク例外処理ルーチン中でディスパッ
93チ禁止/許可状æ…
94‹ãŒå¤‰æ›´ã•ã‚Œã‚‹ã¨ï¼Œã“の方法では対応できない.また,これに
95代わる良い方法も用意されていない.μITRON4.0仕様策定時の考æ…
96®ä¸è¶³ã¨è€ƒãˆ
97られる.
98
99(*4) 変更するためのAPIは標準では規定されていないため,「変更不可」と見
100ることもできる.
101
102○TOPPERS/ASPカーネルにおける実現(擬似コードベース)
103
104●タスクの実行開始時処理
105
106タスクの実行開始時は,CPUロック解除状æ…
107‹ãƒ»å‰²è¾¼ã¿å„ªå…
108ˆåº¦ãƒžã‚¹ã‚¯å…
109¨è§£é™¤çŠ¶æ…
110‹ãƒ»
111ディスパッチ許可状æ…
112‹ãƒ»ã‚¿ã‚¹ã‚¯ä¾‹å¤–禁止状æ…
113‹ã¨ã—なければならない.以下,こ
114れが実現されていることを確認する.
115
116タスクの実行開始時は,ディスパッチャ本体(dispatcher)から,タスクを実
117行開始する処理(start_r)に分岐し,そこからタスクの起動番地が呼び出され
118る.
119
120CPUロック解除状æ…
121‹ã«ã¤ã„ては,start_rにおいて,CPUロック解除状æ…
122‹ã«ã™ã‚‹å‡¦
123理が行われる.
124
125dispatcherは,タスクコンテキスト・CPUロック状æ…
126‹ãƒ»å‰²è¾¼ã¿å„ªå…
127ˆåº¦ãƒžã‚¹ã‚¯å…
128¨è§£
129除状æ…
130‹ãƒ»ãƒ‡ã‚£ã‚¹ãƒ‘ッチ許可状æ…
131‹ã§å‘¼ã³å‡ºã•ã‚Œï¼ŒåŒã˜çŠ¶æ…
132‹ã§start_rへ分岐する.
133start_rでは,割込み優å…
134ˆåº¦ãƒžã‚¹ã‚¯ã¨ãƒ‡ã‚£ã‚¹ãƒ‘ッチ禁止フラグを変更しないため,
135タスクの実行開始時には,割込み優å…
136ˆåº¦ãƒžã‚¹ã‚¯å…
137¨è§£é™¤çŠ¶æ…
138‹ãƒ»ãƒ‡ã‚£ã‚¹ãƒ‘ッチ許可
139状æ…
140‹ã¨ãªã£ã¦ã„る.
141
142★
143dispatcherが上記条件で呼び出されることの確認が必
144要.
145
146タスク例外禁止状æ…
147‹ã«ã¤ã„ては,make_dormantにおいて,TCBのenatexフィール
148ドをFALSEにしており,タスクが休止状æ…
149‹ã®é–“はこれが保たれる.そのため,タ
150スクの実行開始時には,特別な処理は必
151要ない.
152
153●タスクの終了時処理
154
155タスクの終了時には,CPUロック解除状æ…
156‹ãƒ»å‰²è¾¼ã¿å„ªå…
157ˆåº¦ãƒžã‚¹ã‚¯å…
158¨è§£é™¤çŠ¶æ…
159‹ãƒ»ãƒ‡ã‚£
160スパッチ許可状æ…
161‹ã¨ã—なければならない.以下,これが実現されていることを
162確認する.
163
164タスクの終了時にはext_tskが呼び出されるが,その中で,CPUロック状æ…
165‹ã§å‘¼
166ばれた場合にはその解除(コード上は,ext_tsk中でCPUロック状æ…
167‹ã«ç§»è¡Œã™ã‚‹
168際に,CPUロック状æ…
169‹ã§å‘¼ã°ã‚ŒãŸå ´åˆã«ã¯ï¼Œç§»è¡Œå‡¦ç†ã‚’省略しているだけ),割
170込み優å…
171ˆåº¦ãƒžã‚¹ã‚¯å…
172¨è§£é™¤ä»¥å¤–で呼ばれた場合にはそのå…
173¨è§£é™¤ï¼Œãƒ‡ã‚£ã‚¹ãƒ‘ッチ禁
174止状æ…
175‹ã§å‘¼ã°ã‚ŒãŸå ´åˆã«ã¯ãƒ‡ã‚£ã‚¹ãƒ‘ッチの許可を行っている.
176
177<未完成>
178
179○TOPPERS/ASPカーネルにおける実現(M68040依存)
180
181●タスクの実行開始
182
183ディスパッチャ(dispatcher)は,タスクコンテキスト,CPUロック状æ…
184‹ï¼Œãƒ‡ã‚£
185スパッチ許可状æ…
186‹ï¼Œå‰²è¾¼ã¿å„ªå…
187ˆåº¦ãƒžã‚¹ã‚¯å…
188¨è§£é™¤çŠ¶æ…
189‹ã§å‘¼ã³å‡ºã•ã‚Œã‚‹ï¼Ž
190
191M68040においては,★
192上の条件が満たされていることを確認する必
193要がある★
194.
195
196タスク実行開始時は,CPUロック解除状æ…
197‹ï¼Œãƒ‡ã‚£ã‚¹ãƒ‘ッチ許可状æ…
198‹ï¼Œå‰²è¾¼ã¿å„ªå…
199ˆ
200度マスクå…
201¨è§£é™¤çŠ¶æ…
202‹ã¨ã—なければならないため,ディスパッチャからタスク実
203行開始する処理(start_r)において,CPUロックを解除する.
204
205M68040においては,start_r中の次の処理でこれを実現している.
206
207----------------------------------------
208 clr.l lock_flag /* CPUロック解除状æ…
209‹ã« */
210 and.w #~0x0700, %sr
211----------------------------------------
212
213start_rが実行される時には,(モデル上の)割込み優å…
214ˆåº¦ãƒžã‚¹ã‚¯å…
215¨è§£é™¤çŠ¶æ…
216‹ã¨
217なっているため,ステータスレジスタ(SR)中のIPMを0としてよい(saved_iipm
218に保存した値に戻す必
219要はない).
220
221make_dormantにおいて,TCBのenatexフィールドをfalseにしており,タスクが
222休止状æ…
223‹ã®é–“はこれが保たれる.そのため,タスクの実行開始時にタスク例外
224禁止状æ…
225‹ã¨ã™ã‚‹ãŸã‚ã«ï¼Œç‰¹åˆ¥ãªå‡¦ç†ã¯å¿…
226要ない.
227
228●タスクの終了
229
230ext_tskにおいて,CPUロック状æ…
231‹ã§å‘¼ã°ã‚ŒãŸå ´åˆã«ã¯ãã®è§£é™¤ï¼ˆã‚³ãƒ¼ãƒ‰ä¸Šã¯ï¼Œ
232ext_tsk中でCPUロック状æ…
233‹ã«ç§»è¡Œã™ã‚‹éš›ã«ï¼ŒCPUロック状æ…
234‹ã§å‘¼ã°ã‚ŒãŸå ´åˆã«ã¯ï¼Œ
235移行処理を省略しているだけ),ディスパッチ禁止状æ…
236‹ã§å‘¼ã°ã‚ŒãŸå ´åˆã«ã¯ãƒ‡ã‚£
237スパッチの許可,割込み優å…
238ˆåº¦ãƒžã‚¹ã‚¯å…
239¨è§£é™¤ä»¥å¤–で呼ばれた場合にはそのå…
240¨è§£
241除を行っている.
242
243●タスク例外処理ルーチンの実行開始
244
245タスク例外処理ルーチンの呼出し処理(call_texrtn)は,タスクコンテキスト,
246CPUロック状æ…
247‹ï¼Œã‚¿ã‚¹ã‚¯ä¾‹å¤–許可状æ…
248‹ã§å‘¼ã³å‡ºã•ã‚Œã‚‹ï¼Žã‚¿ãƒ¼ã‚²ãƒƒãƒˆéžä¾å­˜éƒ¨ã«ãŠ
249いては,ras_texとena_texからcall_texrtnを呼び出しているが,いずれもこの
250条件を満たしている.
251
252M68040においては,dispatch_rとret_int_rの2箇所からcall_texrtnを呼び出し
253ている.dispatch_rが実行される時には,CPUロック状æ…
254‹ã¨ãªã£ã¦ãŠã‚Šï¼Œã‚¿ã‚¹ã‚¯
255例外許可状æ…
256‹ã®å ´åˆã®ã¿call_texrtnを呼び出すようにしている.ret_int_rに
257ついても,実行される時にはCPUロック状æ…
258‹ã¨ãªã£ã¦ãŠã‚Šï¼Œã‚¿ã‚¹ã‚¯ä¾‹å¤–許可状æ…
259‹
260の場合のみcall_texrtnを呼び出すようにしている(call_texrtnを直接呼ぶ代
261わりにcalltexを呼べば,calltexにおいて,タスク例外許可状æ…
262‹ã®å ´åˆã®ã¿
263call_texrtnを呼び出すようになっている).
264
265タスク例外処理ルーチン実行開始時は,CPUロック解除状æ…
266‹ï¼Œã‚¿ã‚¹ã‚¯ä¾‹å¤–禁止状
267æ…
268‹ã¨ã—なければならないため,call_texrtnにおいてタスク例外処理ルーチンを
269呼び出す前に,CPUロックを解除し,タスク例外禁止状æ…
270‹ã¨ã—ている.また,ディ
271スパッチ禁止/許可状æ…
272‹ã¨å‰²è¾¼ã¿å„ªå…
273ˆåº¦ãƒžã‚¹ã‚¯ã¯ï¼Œå‘¼ã³å‡ºã—前の状æ…
274‹ã‚’保存す
275るのみで,状æ…
276‹ã®å¤‰æ›´ã¯è¡Œã‚ãªã„.
277
278●タスク例外処理ルーチンからのリターン
279
280call_texrtnにおいてタスク例外処理ルーチンから戻った後に,CPUロック状æ…
281‹
282への移行(CPUロック状æ…
283‹ã§æˆ»ã£ã¦ããŸå ´åˆã«ã¯çœç•¥ï¼‰ã¨ï¼Œãƒ‡ã‚£ã‚¹ãƒ‘ッチ禁止/
284許可状æ…
285‹ã¨å‰²è¾¼ã¿å„ªå…
286ˆåº¦ãƒžã‚¹ã‚¯ã‚’呼び出し前の状æ…
287‹ã«æˆ»ã™å‡¦ç†ã‚’行う.また,
288タスク例外許可状æ…
289‹ã¨ã™ã‚‹ï¼ˆã‚¿ã‚¹ã‚¯ä¾‹å¤–処理ルーチンを続けて呼び出す場合に
290は,タスク例外許可状æ…
291‹ã«ã¯ã—ない).CPUロック状æ…
292‹ã®è§£é™¤ã¯ï¼Œcall_texrtn
293からリターンした後に行う.
294
295ターゲット非依存部において,ras_texとena_texからcall_texrtnが呼び出され
296た場合には,call_texrtnからのリターンによりサービスコール処理関数に戻る.
297サービスコール処理関数では,call_texrtnから戻った後に,t_unlock_cpuを呼
298び出してCPUロック状æ…
299‹ã‚’解除する.
300
301M68040において,dispatch_rからcall_texrtnが呼び出された場合には,
302call_texrtnからのリターンにより,直接サービスコール処理関数に戻る
303(dispatchの呼出しから戻る).サービスコール処理関数では,dispatchから
304戻った後に,t_unlock_cpuを呼び出してCPUロック状æ…
305‹ã‚’解除する.
306
307ret_int_rからcall_texrtnが呼び出された場合には,call_texrtnからのリター
308ン後に,lock_flagをクリアし,rte命令によりIPMを割込み発生前の値に戻して,
309CPUロック状æ…
310‹ã‚’解除する.このケースはさらに,ret_intにおいてタスク切換
311えを行った場合と,行わなかった場合(タスク例外処理ルーチンを実行するた
312めにreqflgをセットした場合)に分類できるが,いずれの場合も,rte命令によ
313り,IPMはタスクが割込みを受け付けた時の状æ…
314‹ã«æˆ»ã‚Šï¼Œä»•æ§˜ã«åˆè‡´ã—た振舞い
315となっている.
316
317●割込みハンドラの実行開始
318
319割込みハンドラの実行開始時には,ターゲット依存部において,割込み優å…
320ˆåº¦
321マスクを,実行開始する割込みハンドラの割込み優å…
322ˆåº¦ã«è¨­å®šã™ã‚‹ï¼Ž
323
324M68040においては,割込み優å…
325ˆåº¦ãƒžã‚¹ã‚¯ã®å¤‰æ›´ã¯ï¼Œãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ã§è¡Œã‚ã‚Œã‚‹ãŸ
326め,ソフトウェアでは特別の処理を行う必
327要がない.
328
329●割込みハンドラからのリターン
330
331割込みハンドラからのリターン時には,ターゲット依存部において,CPUロック
332解除状æ…
333‹ã«æˆ»ã—,割込み優å…
334ˆåº¦ãƒžã‚¹ã‚¯ã‚’割込みハンドラ実行開始前の値に戻す.
335
336M68040においては,割込みハンドラからの出口処理(ret_int)の処理を,いく
337つかの実行経路に分けて確認する必
338要がある.
339
340(1) 戻りå…
341ˆãŒéžã‚¿ã‚¹ã‚¯ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã‹ï¼Œreqflgがfalseの場合には,ret_int_1
342において,lock_flagをクリアし,rte命令によりIPMを割込み発生前の値に戻し
343て,CPUロック状æ…
344‹ã‚’解除し,割込み優å…
345ˆåº¦ãƒžã‚¹ã‚¯ã‚’å…
346ƒã®å€¤ã«æˆ»ã™ï¼Ž
347
348(2) タスク切換えが必
349要な場合には,CPUロック状æ…
350‹ã«ç§»è¡Œã—て,ディスパッチャ
351(dispatcher)へ分岐する.この際に,割込み発生前のIPM(ディスパッチ保留
352状æ…
353‹ã§ãªã„ことから,TIPM_ENAALLになっているはず)を,saved_iipmに保存す
354る.これにより,次に実行すべきタスクへと戻る前にCPUロック状æ…
355‹ã‚’解除する
356タイミングで,CPUロック状æ…
357‹ã‚’解除し,割込み優å…
358ˆåº¦ãƒžã‚¹ã‚¯ãŒå‰²è¾¼ã¿ç™ºç”Ÿå‰ã®
359値に設定されることになる.
360
361(3) タスク切換えが必
362要なく,タスク例外処理ルーチンの実行が必
363要な場合に
364は,CPUロック状æ…
365‹ã«ç§»è¡Œã—て,call_rettexを呼び出す.この際に,割込み発
366生前のIPM(TIPM_ENAALLであるとは限らない)を,saved_iipmに保存する.こ
367れにより,call_rettexの中でタスク例外処理ルーチンを呼び出す前にCPUロッ
368ク状æ…
369‹ã‚’解除するタイミングで,CPUロック状æ…
370‹ã‚’解除し,割込み優å…
371ˆåº¦ãƒžã‚¹ã‚¯
372が割込み発生前の値に設定されることになる.
373
374●割込みサービスルーチン(ISR)の実行開始
375
376割込みサービスルーチン(ISR)は,コンフィギュレータが生成する割込みハン
377ドラから呼び出す.ISRの呼出しは,割込みハンドラの実行開始後にそのままの
378状æ…
379‹ã§è¡Œã†ã‹ï¼Œä»–のISRからリターンした後にå…
380ƒã®çŠ¶æ…
381‹ã«æˆ»ã—た後に行う.いず
382れの場合も,ISRの実行開始時の条件を満たしている.
383
384●割込みサービスルーチン(ISR)からのリターン
385
386割込みサービスルーチン(ISR)からのリターン後の処理は,コンフィギュレー
387タが生成する割込みハンドラに含まれる.そこでは,CPUロック状æ…
388‹ã§ã‚ればそ
389れを解除し,割込み優å…
390ˆåº¦ãƒžã‚¹ã‚¯ã‚’ISR呼出し前の値に戻す.
391
392●タイムイベントハンドラの実行開始
393
394周期ハンドラはターゲット非依存部のcall_cychdrから,アラームハンドラはター
395ゲット非依存部のcall_almhdrから呼び出す.いずれも,呼出し前にCPUロック
396状æ…
397‹ã‚’解除する.ここで,CPUロック状æ…
398‹ã«ç§»è¡Œã—たのはsignal_timeの中のは
399ずなので,割込み優å…
400ˆåº¦ãƒžã‚¹ã‚¯ã¯ï¼Œsignal_timeが呼ばれた時の値に設定される.
401
402●タイムイベントハンドラからのリターン
403
404タイムイベントハンドラからのリターン後の処理は,周期ハンドラについては
405ターゲット非依存部のcall_cychdrに,アラームハンドラについてはターゲット
406非依存部のcall_almhdrに含まれる.そこでは,CPUロック状æ…
407‹ã§ãªã‘ればCPUロッ
408ク状æ…
409‹ã«æˆ»ã—(CPUロック状æ…
410‹ã®è§£é™¤ã¯ï¼Œsignal_timeで行われる),割込み優
411å…
412ˆåº¦ãƒžã‚¹ã‚¯ã‚’タイムイベントハンドラ呼出し前の値に戻す.
413
414●CPU例外ハンドラの実行開始
415
416CPU例外ハンドラの実行開始時には,実行開始前のシステム状æ…
417‹ã‚’保存するのみ
418で,システム状æ…
419‹ã‚’そのまま引き継ぐ.
420
421M68040においては,例外処理実行開始直後のステータスレジスタ(SR)と
422lock_flagをスタックに保存した後,システム状æ…
423‹ã‚’変更せずに,CPU例外処理
424ルーチンを呼び出す.
425
426●CPU例外ハンドラからのリターン
427
428CPU例外ハンドラからのリターン時には,ターゲット依存部において,CPUロッ
429ク/ロック解除状æ…
430‹ã¨å‰²è¾¼ã¿å„ªå…
431ˆåº¦ãƒžã‚¹ã‚¯ã‚’,CPU例外ハンドラ実行開始前の状
432æ…
433‹ã«æˆ»ã™ï¼Ž
434
435M68040においては,CPU例外ハンドラからの出口処理(ret_exc)において,ま
436ず,lock_flagをå…
437ƒã®å€¤ã«æˆ»ã—ている.割込み優å…
438ˆåº¦ãƒžã‚¹ã‚¯ã«ã¤ã„ては,いくつ
439かの実行経路に分けて確認する必
440要がある.
441
442(1) 戻りå…
443ˆãŒéžã‚¿ã‚¹ã‚¯ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã‹ï¼Œreqflgがfalseの場合には,ret_exc_2
444において,rte命令によりIPMを割込み発生前の値に戻して,割込み優å…
445ˆåº¦ãƒžã‚¹
446クをå…
447ƒã®å€¤ã«æˆ»ã™ï¼ŽCPUロック状æ…
448‹ã§CPU例外が発生した場合には,reqflgが
449trueになることはないので,この経路で実行される.
450
451(2,3) その他の場合は,CPUロック解除状æ…
452‹ã§CPU例外が発生した場合であり,
453割込みハンドラからの出口処理と同様である.
454
455以上
Note: See TracBrowser for help on using the repository browser.