source: rtos_arduino/trunk/asp_1.9.2/doc/mutex_memo.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: 60.8 KB
Line 
1 TOPPERS Confidential
2 TOPPERSプロジェクト ディスカッションメモ
3 ミューテックス機能に関する検討
4
5 作成者
6: 高田広章(名古屋大学)
7 最終更新: 2009年12月31日
8
9○メモの位置付け
10
11このドキュメントは,TOPPERS新世代カーネルにおけるミューテックス機能の仕
12様と実装
13について検討するものである.TOPPERS/ASPカーネルのミューテックス
14機能拡張に関する設計メモも含んでいる.
15
16○前提となる方針
17
18TOPPERS新世代カーネルにおいては,現時点では,μITRON4.0仕様のミューテッ
19クス機能の優å…
20ˆåº¦ç¶™æ‰¿ãƒ—ロトコルはサポートしない.また,厳密な優å…
21ˆåº¦åˆ¶å¾¡
22規則のみをサポートし,簡略化した優å…
23ˆåº¦åˆ¶å¾¡è¦å‰‡ã¯ã‚µãƒãƒ¼ãƒˆã—ないものとす
24る.
25
26○μITRON4.0仕様およびHRPカーネル仕様の問題点
27
28μITRON4.0仕様およびHRPカーネルにおけるミューテックスの仕様に対して,以
29下の問題が指摘されている.なお,問題点を示す順序は,おおよそ指摘のあっ
30た順序であり,問題点の重大性を示すものではない.
31
32●問題点の指摘1(μITRON4.0仕様)
33----------------------------------------
34・ミューテックス機能を使用していた場合の、chg_priの動作について
35
36 μITRON仕様書の"chg_pri"の説明欄に、以下の記載があるかと思います.
37
38 「・・・.このサービスコールを実行した結果、対象タスクの現在優å…
39ˆåº¦
40 がベース優å…
41ˆåº¦ã«ä¸€è‡´ã—ている場合には、次の処理を行う.・・・」
42
43 対象となるタスクが、優å…
44ˆåº¦ä¸Šé™ã‚‚しくは継承プロトコルのミューテックス
45 をロックしている、あるいは解除待
46ち状æ…
47‹ã®å ´åˆã§ã‚‚、上記条件を満たして
48 いるならば、指定された優å…
49ˆåº¦ã®ä¸­ã§æœ€ä½Žã®å„ªå…
50ˆé †ä½ã«å¤‰æ›´ã™ã‚‹å¿…
51要がある
52 のでしょうか.
53
54 この仕様を適用するのが正しい場合、特にミューテックスをロックしている
55 タスクに対して、同じ優å…
56ˆåº¦ã®ä¸­ã§ã‚‚優å…
57ˆé †ä½ã‚’下げること自体が、
58 ミューテックス本来の使用意図に反しているように思えるのですが、如何で
59 しょうか.
60----------------------------------------
61
62●問題点の指摘2(HRPカーネル)
63----------------------------------------
64低優å…
65ˆåº¦ã‚¿ã‚¹ã‚¯Aがディスパッチ禁止した後,高優å…
66ˆåº¦ã‚¿ã‚¹ã‚¯Bがレディ状æ…
67‹ã«
68なり(ディスパッチ禁止なのでタスク切換えは起こらない),その後にタスク
69Aが優å…
70ˆåº¦ä¸Šé™ãŒã‚¿ã‚¹ã‚¯Bと同じミューテックスに対してploc_mtxを発行して,
71タスクBと同じ優å…
72ˆåº¦ã¾ã§ä¸ŠãŒã£ãŸå ´åˆã‚’考える.HRPカーネルでは,タスクAは
73タスクBよりも優å…
74ˆé †ä½ãŒä½Žããªã‚‹ï¼Žãã®å¾Œï¼Œã‚¿ã‚¹ã‚¯Aがディスパッチ許可する
75と,タスクBに切り換わることになり,排他制御対象のタスクå…
76¨ä½“と排他される
77わけではなくなる.
78----------------------------------------
79
80●問題点3(μITRON4.0仕様)
81----------------------------------------
82同じ優å…
83ˆåº¦ã®ã‚¿ã‚¹ã‚¯AとタスクB,それらよりも高い上限優å…
84ˆåº¦ã‚’持った優å…
85ˆåº¦
86上限ミューテックスがある場合を考える.タスクAがミューテックスをロックし,
87タスクBがミューテックスを待
88っている状況で,タスクAがミューテックスをロッ
89ク解除した場合に,タスクBがミューテックスをロックして優å…
90ˆåº¦ãŒä¸ŠãŒã‚Šï¼Œã‚¿
91スクBに切り換わってしまう.タスクAが一連で実行されない.
92
93この問題は,タスクBの優å…
94ˆåº¦ãŒï¼Œã‚¿ã‚¹ã‚¯Aよりも低い場合にも起こる.
95
96→ スケジューリング理論的には,優å…
97ˆåº¦ä¸Šé™ãƒŸãƒ¥ãƒ¼ãƒ†ãƒƒã‚¯ã‚¹ã«å¯¾ã—て待
98ち状æ…
99‹
100になることはないので,こういうケースは考æ…
101®ã•ã‚Œã¦ã„ない.
102
103→ タスクAが一連で実行されないのは,大きい問題ではないという意見も.
104
105類似だが優å…
106ˆé †ä½ã®æ‰±ã„によっては回避可能なケース:
107
108(a) 高優å…
109ˆåº¦ã®ã‚¿ã‚¹ã‚¯Aと低優å…
110ˆåº¦ã®ã‚¿ã‚¹ã‚¯B,タスクAの優å…
111ˆåº¦ã¨åŒã˜ä¸Šé™å„ªå…
112ˆ
113度を持った優å…
114ˆåº¦ä¸Šé™ãƒŸãƒ¥ãƒ¼ãƒ†ãƒƒã‚¯ã‚¹ãŒã‚る場合を考える.タスクAがミューテッ
115クスをロックし,タスクBがミューテックスを待
116っている状況で,タスクAが
117ミューテックスをロック解除した場合に,タスクBがミューテックスをロックし
118て優å…
119ˆåº¦ãŒä¸ŠãŒã‚‹ï¼Žå„ªå…
120ˆé †ä½ã®æ‰±ã„によっては,タスクBに切り換わってしまう.
121
122(b) 同じ優å…
123ˆåº¦ã®ã‚¿ã‚¹ã‚¯AとタスクB,それらと同じ上限優å…
124ˆåº¦ã‚’持った優å…
125ˆåº¦
126上限ミューテックスがある場合を考える.タスクAがミューテックスをロックし,
127タスクBがミューテックスを待
128っている状況で,タスクAがミューテックスをロッ
129ク解除した場合に,優å…
130ˆé †ä½ã®æ‰±ã„によっては,タスクBに切り換わってしまう.
131----------------------------------------
132
133●問題点3-2(μITRON4.0仕様をマルチプロセッサ拡張した場合)
134----------------------------------------
135マルチプロセッサにおいて,プロセッサ1にタスクA,プロセッサ2に優å…
136ˆåº¦ã®ä½Ž
137いタスクB1,B2,B3と優å…
138ˆåº¦ã®é«˜ã„タスクC,それらよりも高い上限優å…
139ˆåº¦ã‚’持っ
140た優å…
141ˆåº¦ä¸Šé™ãƒŸãƒ¥ãƒ¼ãƒ†ãƒƒã‚¯ã‚¹ãŒã‚る場合を考える.タスクAがミューテックスを
142ロックし,タスクB1,B2,B3がミューテックスを待
143っており,プロセッサ2ではタ
144スクCが実行されている状況で,タスクAがミューテックスをロック解除した場
145合に,タスクB1がミューテックスをロックして優å…
146ˆåº¦ãŒä¸ŠãŒã‚Šï¼Œã‚¿ã‚¹ã‚¯B1に切
147り換わってしまう.さらに,タスクB2,B3も高い優å…
148ˆåº¦ã§å®Ÿè¡Œã•ã‚Œï¼Œã‚¿ã‚¹ã‚¯Cが
149タスクB1,B2,B3のクリティカルセクションに待
150たされてしまう.
151----------------------------------------
152
153●問題点4(HRPカーネル)
154----------------------------------------
155HRPカーネルでは,優å…
156ˆåº¦ç¶™æ‰¿ã«ä¼´ã£ã¦ã‚¿ã‚¹ã‚¯ã®ç¾åœ¨å„ªå…
157ˆåº¦ãŒå¤‰åŒ–する場合に,
158同優å…
159ˆåº¦å†…
160での優å…
161ˆé †ä½ã‚’最低にする(μITRON4.0仕様では実装
162依存としてい
163る).この仕様には,次のような問題がある.
164
165同じ優å…
166ˆåº¦ã®ã‚¿ã‚¹ã‚¯AとタスクB,それらよりも高い上限優å…
167ˆåº¦ã‚’持った優å…
168ˆåº¦
169上限ミューテックスがある場合を考える.タスクAが実行状æ…
170‹ï¼Œã‚¿ã‚¹ã‚¯Bが実行
171可能状æ…
172‹ã§ã‚るとする.タスクAがミューテックスをロックし,その後ロック解
173除すると,タスクAの優å…
174ˆé †ä½ãŒåŒå„ªå…
175ˆåº¦å†…
176で最低となり,タスクBに切り換わっ
177てしまう.
178
179この振舞いは,一度タスクの実行が開始すると優å…
180ˆåº¦é€†è»¢ã«ã‚わないという優
181å…
182ˆåº¦ä¸Šé™ãƒ—ロトコルの性質に反する.
183----------------------------------------
184
185○問題点3の考察と方針
186
187問題点3を回避するためには,優å…
188ˆåº¦ä¸Šé™ãƒŸãƒ¥ãƒ¼ãƒ†ãƒƒã‚¯ã‚¹ã‚’ロック解除した時
189に,ロック待
190ち状æ…
191‹ã®ã‚¿ã‚¹ã‚¯ã«ã™ãã«ãƒŸãƒ¥ãƒ¼ãƒ†ãƒƒã‚¯ã‚¹ã‚’ロックさせてはならな
192いことになる.すなわち,ロック待
193ち状æ…
194‹ã®ã‚¿ã‚¹ã‚¯ã®å¾…
195ち解除のみを行い,そ
196のタスクが次にスケジュールされた時にミューテックスをロックし,優å…
197ˆåº¦ã‚’
198変更する処理を行えばよい.POSIXのミューテックスは,この方針で実装
199すべき
200ものと思われる.
201
202このように仕様変更した場合,rel_waiの扱いや,タイムアウトの扱いが問題に
203なる.タイムアウトは,ミューテックスの待
204ち行列につながれて待
205ち状æ…
206‹ã¨ãªã£
207ている時間だけでなく,待
208ち解除されて次にスケジュールされるのを待
209ってい
210る時間も含めて扱うべきである.また,そのタイミングでrel_waiが発行された
211場合の扱いも,どちらにするか決めておくことが必
212要である(どちらの仕様で
213も成立すると考えられる).これまでのITRON仕様の同期・通信オブジェクトに
214なかった振舞いであり,あちこちに影響が及ぶ可能性がある.
215
216このような大規模な仕様変更を避けるためには,そもそも,優å…
217ˆåº¦ä¸Šé™ãƒŸãƒ¥ãƒ¼
218テックスを取得したタスクが待
219ち状æ…
220‹ã«ãªã‚‹ã‚ˆã†ãªä½¿ã„方が推奨されるもので
221はなく,その場合には想定通りには振る舞わないことを制限事項
222とする以外に
223ないと思われる.優å…
224ˆåº¦ä¸Šé™ãƒŸãƒ¥ãƒ¼ãƒ†ãƒƒã‚¯ã‚¹ã‚’取得したタスクが待
225ち状æ…
226‹ã«ãª
227るなどの理由で実行権を失わなければ,優å…
228ˆåº¦ä¸Šé™ãƒŸãƒ¥ãƒ¼ãƒ†ãƒƒã‚¯ã‚¹ã«å¯¾ã—て待
229
230ち状æ…
231‹ã«ãªã‚‹çŠ¶æ³ã‚‚起こらない(マルチプロセッサの場合を除く).そのため,
232この制限事項
233を設ければ,問題点3の状況は起こらず,問題ではないことにな
234る.
235
236ユーザに対しては,優å…
237ˆåº¦ä¸Šé™ãƒŸãƒ¥ãƒ¼ãƒ†ãƒƒã‚¯ã‚¹ã‚’ロックする時にはploc_mtxを
238使うことを推奨すれば,この問題を確実に回避することができる.
239
240マルチプロセッサの場合には,優å…
241ˆåº¦ä¸Šé™ãƒŸãƒ¥ãƒ¼ãƒ†ãƒƒã‚¯ã‚¹ã‚’取得したタスクが
242実行権を失わなくても,優å…
243ˆåº¦ä¸Šé™ãƒŸãƒ¥ãƒ¼ãƒ†ãƒƒã‚¯ã‚¹ã«å¯¾ã—て待
244ち状æ…
245‹ã«ãªã‚‹çŠ¶
246況が起こる.そのため,問題点3-2のような問題が避けられない.
247
248今のところ,マルチプロセッサの場合にこれに対処するには,POSIXの実装
249方針
250を採用するしかないものと思われるが,POSIXの実装
251方針には,ミューテックス
252解放時にすべてのタスクが動き出してしまうためにオーバヘッドが大きいとい
253う別の問題がある.
254
255結局,マルチプロセッサの場合の良い解決法がないのが現状である.
256
257以上より,(特にマルチプロセッサの場合に)問題は残っているが,現時点で
258は,現状の仕様でやむなしとする.
259
260○問題点4の考察と方針
261
262問題点4については,想定された使用方法で発生するため,制限事項
263とするこ
264とはできず,何らかの仕様の見直しが必
265要である.
266
267問題点4を回避するには,少なくとも,次の変更が必
268要である.
269
270・優å…
271ˆåº¦ä¸Šé™ãƒŸãƒ¥ãƒ¼ãƒ†ãƒƒã‚¯ã‚¹ã‚’解放したことによりタスクの現在優å…
272ˆåº¦ãŒä½Žã
273 なる場合には,同優å…
274ˆåº¦å†…
275での優å…
276ˆé †ä½ã‚’最高にする.
277
278これは,優å…
279ˆåº¦ä¸Šé™ãƒŸãƒ¥ãƒ¼ãƒ†ãƒƒã‚¯ã‚¹ã‚’獲得して実行していたタスクは,低くなっ
280た後の優å…
281ˆåº¦ã¨åŒã˜å„ªå…
282ˆåº¦ã‚’持つ他タスクよりもå…
283ˆã«å®Ÿè¡Œå¯èƒ½ã«ãªã£ãŸã¯ãšã§
284あり,その中では最高優å…
285ˆé †ä½ã‚’持つべきと考えられるためである.
286
287優å…
288ˆåº¦ä¸Šé™ãƒŸãƒ¥ãƒ¼ãƒ†ãƒƒã‚¯ã‚¹ã‚’解放したことによりタスクの現在優å…
289ˆåº¦ãŒå¤‰åŒ–し
290ない場合にも同じことが言えるが,その現在優å…
291ˆåº¦ã§å®Ÿè¡ŒçŠ¶æ…
292‹ã§ã‚ったという
293ことは,同優å…
294ˆåº¦å†…
295では最高優å…
296ˆé †ä½ã‚’持っていたことになり(ディスパッチ
297保留状æ…
298‹ã®å ´åˆã‚’除く),優å…
299ˆé †ä½ã¯å¤‰åŒ–しないものとしても同じ結果となる.
300ただし,ディスパッチ保留状æ…
301‹ã®å ´åˆã®æŒ¯ã‚‹èˆžã„を規定するために,優å…
302ˆé †ä½
303を最高とするか変更しないとするかは決めておく必
304要がある.
305
306仕様の単純さを考えると,特殊な状況(優å…
307ˆåº¦ä¸Šé™ãƒŸãƒ¥ãƒ¼ãƒ†ãƒƒã‚¯ã‚¹ã‚’解放した
308ことによりタスクの現在優å…
309ˆåº¦ãŒä½Žããªã‚‹å ´åˆï¼‰ã§ã®ã¿æœ€é«˜å„ªå…
310ˆé †ä½ã¨ã™ã‚‹ã‚ˆ
311り,最高優å…
312ˆé †ä½ã¨ã™ã‚‹å ´åˆã‚’できる限り一般的にした方がよいと考えられる.
313このことから,次の仕様が有力な案として出てくる.
314
315・ミューテックス機能によりタスクの現在優å…
316ˆåº¦ãŒå¤‰åŒ–する場合には,同じ優
317 å…
318ˆåº¦ã®ã‚¿ã‚¹ã‚¯ã®ä¸­ã§æœ€é«˜å„ªå…
319ˆé †ä½ã¨ãªã‚‹ï¼Žç¾åœ¨å„ªå…
320ˆåº¦ãŒå¤‰åŒ–しない場合には,
321 タスクの優å…
322ˆé †ä½ã¯å¤‰æ›´ã•ã‚Œãªã„.
323
324ここで,現在優å…
325ˆåº¦ãŒå¤‰åŒ–するタスクが待
326ち状æ…
327‹ã®å ´åˆã®æŒ¯èˆžã„を規定する必
328
329要がある.上と整合させるなら,タスクが待
330ち状æ…
331‹ã§ï¼Œã‚¿ã‚¹ã‚¯ã®å„ªå…
332ˆåº¦é †ã®å¾…
333
334ち行列につながれている場合には,同じ優å…
335ˆåº¦ã®ã‚¿ã‚¹ã‚¯ã®ä¸­ã§æœ€åˆã«ã™ã‚‹ã®ãŒ
336自然であるが,待
337ち状æ…
338‹ã®é–“まで優å…
339ˆé †ä½ã‚’保持するのはやりすぎとも考えら
340れる.また,タスク状æ…
341‹ãŒå¤‰åŒ–すると同時に,優å…
342ˆåº¦ãŒå¤‰åŒ–する場合も考える
343必
344要がある.
345
346これらを考æ…
347®ã—て,次の仕様とする.
348
349・ミューテックス機能によりタスクの現在優å…
350ˆåº¦ãŒå¤‰åŒ–する場合の扱いは次の
351 通りとする.対象タスクがサービスコールの前後とも実行できる状æ…
352‹ã§ã‚ã‚‹
353 場合には,同じ優å…
354ˆåº¦ã®ã‚¿ã‚¹ã‚¯ã®ä¸­ã§æœ€é«˜å„ªå…
355ˆé †ä½ã¨ãªã‚‹ï¼Žãã†ã§ãªã„場合
356 には,同じ優å…
357ˆåº¦ã®ã‚¿ã‚¹ã‚¯ã®ä¸­ã§æœ€ä½Žå„ªå…
358ˆé †ä½ã¨ãªã‚‹ï¼Žç¾åœ¨å„ªå…
359ˆåº¦ãŒå¤‰åŒ–し
360 ない場合には,タスクの優å…
361ˆé †ä½ã¯å¤‰æ›´ã•ã‚Œãªã„.
362
363!対象タスクが待
364ち状æ…
365‹ã®å ´åˆã®æŒ¯èˆžã„は,より厳密に規定する必
366要がある.
367
368さらに,複数のタスクの現在優å…
369ˆåº¦ãŒåŒæ™‚に変化する場合には,タスクの現在
370優å…
371ˆåº¦ã‚’変化させる順序によって結果が異なってくるため,優å…
372ˆåº¦ã‚’変化させ
373る順序を明確化することが必
374要である.
375
376--------------------
377★
378上の仕様で問題がないことを確認するための検討(優å…
379ˆåº¦ä¸Šé™ãƒŸãƒ¥ãƒ¼ãƒ†ãƒƒã‚¯
380スによる場合)
381
382優å…
383ˆåº¦ä¸Šé™ãƒŸãƒ¥ãƒ¼ãƒ†ãƒƒã‚¯ã‚¹ã‚’(待
384ち状æ…
385‹ã«å…
386¥ã‚‹ã“となく)獲得したことにより
387タスクの現在優å…
388ˆåº¦ãŒä¸ŠãŒã‚‹å ´åˆã«ã¯ï¼Œãã‚Œã¾ã§ã®ç¾åœ¨å„ªå…
389ˆåº¦ã§å®Ÿè¡ŒçŠ¶æ…
390‹ã§ã‚っ
391たことから,新しい現在優å…
392ˆåº¦ã¨åŒã˜å„ªå…
393ˆåº¦ã‚’持つタスクは他にないことにな
394り(ディスパッチ保留状æ…
395‹ã®å ´åˆã‚’除く),優å…
396ˆé †ä½ã‚’最高としても最低とし
397ても同じ結果となる.
398
399優å…
400ˆåº¦ä¸Šé™ãƒŸãƒ¥ãƒ¼ãƒ†ãƒƒã‚¯ã‚¹ã‚’(待
401ち状æ…
402‹ã«å…
403¥ã‚‹ã“となく)獲得したことにより
404タスクの現在優å…
405ˆåº¦ãŒå¤‰åŒ–しない場合には,それまでの現在優å…
406ˆåº¦ã§å®Ÿè¡ŒçŠ¶æ…
407‹
408であったことから,同優å…
409ˆåº¦å†…
410では最高優å…
411ˆé †ä½ã‚’持っていたことになり(ディ
412スパッチ保留状æ…
413‹ã®å ´åˆã‚’除く),優å…
414ˆé †ä½ã‚’最高としても変化しないものと
415しても同じ結果となる.
416
417優å…
418ˆåº¦ä¸Šé™ãƒŸãƒ¥ãƒ¼ãƒ†ãƒƒã‚¯ã‚¹å¾…
419ち状æ…
420‹ã‹ã‚‰å¾…
421ち解除され,優å…
422ˆåº¦ä¸Šé™ãƒŸãƒ¥ãƒ¼ãƒ†ãƒƒ
423クスを獲得する場合は,制限事項
424としていることから,どのように決めてもよ
425い.
426--------------------
427
428○他の問題点の考察と方針
429
430制限事項
431を設けることで問題点3は問題ではないとすると,問題点2について
432も,ディスパッチ禁止と併用すると想定通りには振る舞わないとすればよい.
433その他に,rot_rdqと併用した場合には,明らかに制限事項
434を設けなければなら
435ない.
436
437問題点1についても,ベース優å…
438ˆåº¦ã®å¤‰æ›´ã¨ä½µç”¨ã™ã‚‹ã¨æƒ³å®šé€šã‚Šã«ã¯æŒ¯ã‚‹èˆžã‚
439ないとする手もあるが,次のように仕様を修正する手もある.
440
441・chg_priでタスクのベース優å…
442ˆåº¦ã‚’変更した場合の扱いは次の通りとする.対
443 象タスクがベース優å…
444ˆåº¦ã‚’変更した後の状æ…
445‹ã§ãƒŸãƒ¥ãƒ¼ãƒ†ãƒƒã‚¯ã‚¹çµŒç”±ã§ãƒ™ãƒ¼ã‚¹
446 優å…
447ˆåº¦ã¨åŒã˜ã‹ãã‚Œã‚ˆã‚Šé«˜ã„優å…
448ˆåº¦ã‚’継承している場合には,現在優å…
449ˆåº¦ãŒ
450 変化するなら同じ優å…
451ˆåº¦ã®ã‚¿ã‚¹ã‚¯ã®ä¸­ã§æœ€é«˜å„ªå…
452ˆé †ä½ã¨ãªã‚Šï¼Œç¾åœ¨å„ªå…
453ˆåº¦ãŒ
454 変化しないなら優å…
455ˆé †ä½ã‚‚変化しない.それ以外の場合には,同じ優å…
456ˆåº¦ã®
457 タスクの中で最低優å…
458ˆé †ä½ã¨ãªã‚‹ï¼Ž
459
460ここで,優å…
461ˆåº¦ç¶™æ‰¿ãƒŸãƒ¥ãƒ¼ãƒ†ãƒƒã‚¯ã‚¹ã‚’サポートしない場合には,次のことが言
462える.タスクがロックすることができる優å…
463ˆåº¦ä¸Šé™ãƒŸãƒ¥ãƒ¼ãƒ†ãƒƒã‚¯ã‚¹ã®ä¸Šé™å„ªå…
464ˆ
465度は,そのタスクの変更前後のベース優å…
466ˆåº¦ã¨åŒã˜ã‹ãã‚Œã‚ˆã‚Šé«˜ã„.そのため,
467優å…
468ˆåº¦ä¸Šé™ãƒŸãƒ¥ãƒ¼ãƒ†ãƒƒã‚¯ã‚¹ã‚’ロックしている場合には,必
469ず,「ミューテック
470ス経由でベース優å…
471ˆåº¦ã¨åŒã˜ã‹ãã‚Œã‚ˆã‚Šé«˜ã„優å…
472ˆåº¦ã‚’継承している」.つまり,
473「ミューテックス経由でベース優å…
474ˆåº¦ã¨åŒã˜ã‹ãã‚Œã‚ˆã‚Šé«˜ã„優å…
475ˆåº¦ã‚’継承して
476いる場合」は「優å…
477ˆåº¦ä¸Šé™ãƒŸãƒ¥ãƒ¼ãƒ†ãƒƒã‚¯ã‚¹ã‚’ロックしている場合」と一致する.
478さらに,優å…
479ˆåº¦ä¸Šé™ãƒŸãƒ¥ãƒ¼ãƒ†ãƒƒã‚¯ã‚¹ã‚’ロックしている場合には,chg_priでタス
480クのベース優å…
481ˆåº¦å¤‰æ›´ã—ても,そのタスクの現在優å…
482ˆåº¦ãŒå¤‰åŒ–することはない.
483
484以上のことから,上の修正仕様は,次の通りに簡単化することができる.
485
486・chg_priでタスクのベース優å…
487ˆåº¦ã‚’変更した場合の扱いは次の通りとする.対
488 象タスクが優å…
489ˆåº¦ä¸Šé™ãƒŸãƒ¥ãƒ¼ãƒ†ãƒƒã‚¯ã‚¹ã‚’ロックしていない場合,同じ優å…
490ˆåº¦
491 のタスクの中で最低優å…
492ˆé †ä½ã¨ãªã‚‹ï¼Žãã‚Œä»¥å¤–の場合には,対象タスクの現
493 在優å…
494ˆåº¦ãŒå¤‰æ›´ã•ã‚Œã‚‹ã“とはなく,優å…
495ˆé †ä½ã‚‚変更されない.
496
497○chg_priの機能記述(関連部分のみ)
498
499----------------------------------------------------------------------
500対象タスクが休止状æ…
501‹ã§ãªã„場合には,対象タスクのベース優å…
502ˆåº¦ãŒï¼Œtskpri
503で指定した優å…
504ˆåº¦ã«å¤‰æ›´ã•ã‚Œã‚‹ï¼Žãã‚Œã«ä¼´ã£ã¦ï¼Œå¯¾è±¡ã‚¿ã‚¹ã‚¯ã®ç¾åœ¨å„ªå…
505ˆåº¦ã‚‚変
506更される.
507
508対象タスクが,優å…
509ˆåº¦ä¸Šé™ãƒŸãƒ¥ãƒ¼ãƒ†ãƒƒã‚¯ã‚¹ã‚’ロックしていない場合には,次の
510処理が行われる.対象タスクが実行できる状æ…
511‹ã®å ´åˆã«ã¯ï¼ŒåŒã˜å„ªå…
512ˆåº¦ã®ã‚¿ã‚¹
513クの中で最低優å…
514ˆé †ä½ã¨ãªã‚‹ï¼Žå¯¾è±¡ã‚¿ã‚¹ã‚¯ãŒå¾…
515ち状æ…
516‹ã§ï¼Œã‚¿ã‚¹ã‚¯ã®å„ªå…
517ˆåº¦é †ã®
518待
519ち行列につながれている場合には,対象タスクの変更後の現在優å…
520ˆåº¦ã«å¾“っ
521て,その待
522ち行列中での順序が変更される.待
523ち行列中に同じ現在優å…
524ˆåº¦ã®ã‚¿
525スクがある場合には,対象タスクの順序はそれらの中で最後になる.
526
527対象タスクが,優å…
528ˆåº¦ä¸Šé™ãƒŸãƒ¥ãƒ¼ãƒ†ãƒƒã‚¯ã‚¹ã‚’ロックしている場合には,対象タ
529スクの現在優å…
530ˆåº¦ãŒå¤‰æ›´ã•ã‚Œã‚‹ã“とはなく,優å…
531ˆé †ä½ã‚‚変更されない.
532----------------------------------------------------------------------
533
534○ASPカーネルへの実装
535方針
536
537●タスク管理ブロックとミューテックス管理ブロック
538
539ミューテックス機能を実現するためのデータ構造として,ミューテックスの待
540
541ち行列(ミューテックスを待
542っているタスクのリスト)に加えて,タスクに対
543してそれがロックしているミューテックスのリストと,ミューテックスに対し
544てそれを保持しているタスクを管理する必
545要がある.
546
547そこで,TCBには,ロックしているミューテックスのキューヘッダのフィールド
548を追加する.また,現在優å…
549ˆåº¦ã«åŠ ãˆã¦ï¼Œãƒ™ãƒ¼ã‚¹å„ªå…
550ˆåº¦ã‚’保持するフィールド
551を追加する.
552
553----------------------------------------
554typedef struct task_control_block {
555 ...
556 BIT_FIELD_UINT bpriority : TBIT_TCB_PRIORITY;
557 /* ベース優å…
558ˆåº¦ï¼ˆå†…
559部表現)*/
560 BIT_FIELD_UINT priority : TBIT_TCB_PRIORITY;
561 /* 現在優å…
562ˆåº¦ï¼ˆå†…
563部表現)*/
564 ...
565 QUEUE mutex_queue; /* ロックしているミューテックスのキュー */
566 ...
567} TCB;
568----------------------------------------
569
570bpriorityは,休止状æ…
571‹ä»¥å¤–で有効な変数であるため,make_dormantで初期化す
572る.
573
574mutex_queueは,休止状æ…
575‹ä»¥å¤–で有効な変数であるが,休止状æ…
576‹ã«é·ç§»ã™ã‚‹éš›ã«
577必
578ず空にするので,(make_dormantではなく)initialize_taskにおいて初期化
579する.
580
581また,tstatフィールドにå…
582¥ã‚Œã‚‹ã‚¿ã‚¹ã‚¯çŠ¶æ…
583‹ã®å†…
584部表現に,TS_WAIT_MTX(ミュー
585テックスのロック待
586ち)を追加する.
587
588ミューテックス管理ブロックには,ミューテックス待
589ちキューに加えて,ミュー
590テックスをロックしているタスクのTCBへのポインタと,タスクがロックしてい
591るミューテックスのキューにつなぐためのフィールドを用意する.
592
593----------------------------------------
594typedef struct mutex_control_block {
595 QUEUE wait_queue; /* ミューテックス待
596ちキュー */
597 const MTXINIB *p_mtxinib; /* 初期化ブロックへのポインタ */
598 TCB *p_loctsk; /* ミューテックスをロックしているタスク */
599 QUEUE mutex_queue; /* ロックしているミューテックスのキュー */
600} MTXCB;
601----------------------------------------
602
603ミューテックスがロックされていないことは,p_loctskをNULLに設定すること
604で表す.ミューテックスがロックされていない時には,mutex_queueは無効で
605ある.
606
607ミューテックス初期化ブロックには,ミューテックス属性とミューテックスの
608上限優å…
609ˆåº¦ã‚’保持する.
610
611----------------------------------------
612typedef struct mutex_initialization_block {
613 ATR mtxatr; /* ミューテックス属性 */
614 uint_t ceilpri; /* ミューテックスの上限優å…
615ˆåº¦ï¼ˆå†…
616部表現)*/
617} MTXINIB;
618----------------------------------------
619
620タスクを手掛かりに,それがロックしているミューテックスを操作することが
621多いため,ミューテックス管理ブロック中のmutex_queueへのポインタから,
622ミューテックス管理ブロックへのポインタを取り出すためのマクロを用意して
623おく(mutex.c).
624
625----------------------------------------
626#define MTXCB_QUEUE(p_queue) \
627 ((MTXCB *)(((char *) p_queue) - offsetof(MTXCB, mutex_queue)))
628----------------------------------------
629
630●優å…
631ˆåº¦åˆ¶å¾¡è¦å‰‡ã¨ç¾åœ¨å„ªå…
632ˆåº¦ã®è¨ˆç®—
633
634TOPPERS新世代カーネルでは,μITRON4.0仕様の厳密な優å…
635ˆåº¦åˆ¶å¾¡è¦å‰‡ã®ã¿ã‚’実
636装
637する.厳密な優å…
638ˆåº¦åˆ¶å¾¡è¦å‰‡ã«ãŠã„ては,タスクの現在優å…
639ˆåº¦ã‚’,常に,以
640下の優å…
641ˆåº¦ã®æœ€é«˜å€¤ã«ä¸€è‡´ã™ã‚‹ã‚ˆã†ã«è¨­å®šã™ã‚‹ï¼Ž
642
643(1) タスクのベース優å…
644ˆåº¦
645
646(2) タスクが優å…
647ˆåº¦ä¸Šé™ãƒŸãƒ¥ãƒ¼ãƒ†ãƒƒã‚¯ã‚¹ã‚’ロックしている場合,それらのミュー
648 テックス中で,最も高い上限優å…
649ˆåº¦ã‚’持つミューテックスの上限優å…
650ˆåº¦
651
652(3) タスクが優å…
653ˆåº¦ç¶™æ‰¿ãƒŸãƒ¥ãƒ¼ãƒ†ãƒƒã‚¯ã‚¹ã‚’ロックしている場合,それらのミュー
654 テックスのロックを待
655っているタスクの中で,最も高い現在優å…
656ˆåº¦ã‚’持つ
657 タスクの現在優å…
658ˆåº¦
659
660これらの優å…
661ˆåº¦ã‚’,ここでは,現在優å…
662ˆåº¦ã‚’決定する要素となるという意味で,
663要素優å…
664ˆåº¦ã¨å‘¼ã¶ï¼Ž
665
666ASPカーネルのミューテックス拡張では,優å…
667ˆåº¦ç¶™æ‰¿ãƒŸãƒ¥ãƒ¼ãƒ†ãƒƒã‚¯ã‚¹ã¯ã‚µãƒãƒ¼ãƒˆ
668しないため,(3)は考える必
669要がない.
670
671まずは,すべての要素優å…
672ˆåº¦ã‚’スキャンし,タスクの現在優å…
673ˆåº¦ã‚’計算する関
674数を実装
675する.この関数を呼ぶことにより,タスクの現在優å…
676ˆåº¦ã«è¨­å®šã™ã¹ã
677値を計算することができる.
678
679----------------------------------------
680/*
681 * タスクの現在優å…
682ˆåº¦ã®è¨ˆç®—
683 */
684static uint_t
685mutex_calc_priority(TCB *p_tcb)
686{
687 uint_t priority;
688 QUEUE *p_queue;
689 MTXCB *p_mtxcb;
690
691 priority = p_tcb->bpriority;
692 p_queue = p_tcb->mutex_queue.p_next;
693 while (p_queue != &(p_tcb->mutex_queue)) {
694 p_mtxcb = MTXCB_QUEUE(p_queue);
695 if (MTX_CEILING(p_mtxcb) && p_mtxcb->p_mtxinib->ceilpri < priority) {
696 priority = p_mtxcb->p_mtxinib->ceilpri;
697 }
698 p_queue = p_queue->p_next;
699 }
700 return(priority);
701}
702----------------------------------------
703
704●現在優å…
705ˆåº¦ã®å¤‰æ›´å¾Œã®å‡¦ç†
706
707ミューテックス機能によりタスクの現在優å…
708ˆåº¦ã‚’変更した場合には,TCB中の現
709在優å…
710ˆåº¦ã‚’更新することに加えて,次の処理を行う必
711要がある
712
713----------------------------------------
714ミューテックス機能によりタスクの現在優å…
715ˆåº¦ãŒå¤‰åŒ–する場合には,次の処理
716が行われる.現在優å…
717ˆåº¦ã‚’変化させるサービスコールの前後とも,当該タスク
718が実行できる状æ…
719‹ã§ã‚る場合には,同じ優å…
720ˆåº¦ã®ã‚¿ã‚¹ã‚¯ã®ä¸­ã§æœ€é«˜å„ªå…
721ˆé †ä½ã¨
722なる.そのサービスコールにより,当該タスクが実行できる状æ…
723‹ã«é·ç§»ã™ã‚‹å ´
724合には,同じ優å…
725ˆåº¦ã®ã‚¿ã‚¹ã‚¯ã®ä¸­ã§æœ€ä½Žå„ªå…
726ˆé †ä½ã¨ãªã‚‹ï¼Žãã®ã‚µãƒ¼ãƒ“スコール
727の後で,当該タスクが待
728ち状æ…
729‹ã§ï¼Œã‚¿ã‚¹ã‚¯ã®å„ªå…
730ˆåº¦é †ã®å¾…
731ち行列につながれて
732いる場合には,当該タスクの変更後の現在優å…
733ˆåº¦ã«å¾“って,その待
734ち行列中で
735の順序が変更される.待
736ち行列中に同じ現在優å…
737ˆåº¦ã®ã‚¿ã‚¹ã‚¯ãŒã‚る場合には,
738当該タスクの順序はそれらの中で最後になる.
739----------------------------------------
740
741この処理を実現するために,現在優å…
742ˆåº¦ã‚’変更する際に,同じ優å…
743ˆåº¦ã®ã‚¿ã‚¹ã‚¯
744の中で最高優å…
745ˆé †ä½ã¨ã™ã‚‹é–¢æ•°ãŒå¿…
746要である.このような関数を新たに用意す
747ることも可能であるが,多くの部分がchange_priorityとå…
748±é€šã§ã‚るため,
749change_priorityに新たなパラメータmtxmodeを追加し,mtxmodeがfalseの時は
750同じ優å…
751ˆåº¦ã®ã‚¿ã‚¹ã‚¯ã®ä¸­ã§æœ€ä½Žå„ªå…
752ˆé †ä½ï¼Œmtxmodeがtrueの時は同じ優å…
753ˆåº¦ã®ã‚¿
754スクの中で最高優å…
755ˆé †ä½ã¨ã™ã‚‹ã‚ˆã†ã«ä¿®æ­£ã™ã‚‹ï¼Ž
756
757----------------------------------------
758bool_t
759change_priority(TCB *p_tcb, uint_t newpri, bool_t mtxmode)
760{
761 uint_t oldpri;
762
763 oldpri = p_tcb->priority;
764 p_tcb->priority = newpri;
765
766 if (TSTAT_RUNNABLE(p_tcb->tstat)) {
767 /*
768 * タスクが実行できる状æ…
769‹ã®å ´åˆ
770 */
771 queue_delete(&(p_tcb->task_queue));
772 if (queue_empty(&(ready_queue[oldpri]))) {
773 primap_clear(oldpri);
774 }
775 if (mtxmode) {
776 queue_insert_next(&(ready_queue[newpri]), &(p_tcb->task_queue));
777 }
778 else {
779 queue_insert_prev(&(ready_queue[newpri]), &(p_tcb->task_queue));
780 }
781 primap_set(newpri);
782
783 if (p_schedtsk == p_tcb) {
784 if (newpri >= oldpri) {
785 p_schedtsk = search_schedtsk();
786 return(p_schedtsk != p_tcb && dspflg);
787 }
788 }
789 else {
790 if (mtxmode ? newpri <= p_schedtsk->priority
791 : newpri < p_schedtsk->priority) {
792 p_schedtsk = p_tcb;
793 return(dspflg);
794 }
795 }
796 }
797 else {
798 if (TSTAT_WAIT_WOBJCB(p_tcb->tstat)) {
799 /*
800 * タスクが,同期・通信オブジェクトの管理ブロックのå…
801±é€šéƒ¨
802 * 分(WOBJCB)の待
803ちキューにつながれている場合
804 */
805 wobj_change_priority(((WINFO_WOBJ *)(p_tcb->p_winfo))->p_wobjcb,
806 p_tcb);
807 }
808 }
809 return(false);
810}
811----------------------------------------
812
813ここで,同じ優å…
814ˆåº¦ã®ã‚¿ã‚¹ã‚¯ã®ä¸­ã§æœ€é«˜å„ªå…
815ˆé †ä½ã¨ãªã‚‹ã®ã¯ï¼Œç¾åœ¨å„ªå…
816ˆåº¦ã‚’変
817化させるサービスコールの前後とも当該タスクが実行できる状æ…
818‹ã§ã‚る場合に
819限られるため,wobj_change_priorityを修正する必
820要はない.
821
822chg_priからchange_priorityを呼ぶ場合には,mtxmodeをfalseにする.
823
824一方,ミューテックス機能により,タスクの状æ…
825‹ãŒå¤‰åŒ–せずに,タスクの現在
826優å…
827ˆåº¦ãŒå¤‰åŒ–する時は,mtxmodeをtrueにしてchange_priorityを呼ぶ.タスク
828の状æ…
829‹ãŒå¤‰åŒ–する場合には,別途検討する.
830
831●現在優å…
832ˆåº¦ã®åˆ¶å¾¡å‡¦ç†
833
834現在優å…
835ˆåº¦ã®åˆ¶å¾¡ã‚’行う際に,現在優å…
836ˆåº¦ã‚’決定するための要素優å…
837ˆåº¦ãŒä¸ŠãŒ
838る(または増える)場合と,下がる(または減る)場合では大きい違いがある.
839
840要素優å…
841ˆåº¦ãŒä¸ŠãŒã‚‹ï¼ˆã¾ãŸã¯å¢—える)場合には,上がった後の要素優å…
842ˆåº¦ã¨ã‚¿
843スクの現在優å…
844ˆåº¦ã‚’比較するだけで,現在優å…
845ˆåº¦ã®å¤‰æ›´ã®å¿…
846要性が判断できる.
847すべての要素優å…
848ˆåº¦ã‚’スキャンする必
849要はない.
850
851それに対して,要素優å…
852ˆåº¦ãŒä¸‹ãŒã‚‹ï¼ˆã¾ãŸã¯æ¸›ã‚‹ï¼‰å ´åˆã§ï¼Œä¸‹ãŒã‚‹å‰ã®è¦ç´ å„ª
853å…
854ˆåº¦ãŒã‚¿ã‚¹ã‚¯ã®ç¾åœ¨å„ªå…
855ˆåº¦ã¨ä¸€è‡´ã—ていた場合(言い換えると,その要素優å…
856ˆ
857度がタスクの現在優å…
858ˆåº¦ã‚’決定していた場合)には,すべての要素優å…
859ˆåº¦ã‚’ス
860キャンしてタスクの現在優å…
861ˆåº¦ã‚’計算することが必
862要である.下がる前の要素
863優å…
864ˆåº¦ãŒã‚¿ã‚¹ã‚¯ã®ç¾åœ¨å„ªå…
865ˆåº¦ã¨ä¸€è‡´ã—ていなかった場合には,現在優å…
866ˆåº¦ãŒå¤‰
867更になる可能性はなく,この処理は必
868要ない.
869
870言うまでもなく,要素優å…
871ˆåº¦ãŒå¤‰åŒ–しない場合には,タスクの現在優å…
872ˆåº¦ã‚‚変
873化せず,処理は必
874要ない.
875
876要素優å…
877ˆåº¦ãŒä¸ŠãŒã‚‹ï¼ˆã¾ãŸã¯å¢—える)場合の処理は次の通り.newpriには,上
878がった後の(または増えた)要素優å…
879ˆåº¦ã‚’渡す.
880
881----------------------------------------
882/*
883 * 要素優å…
884ˆåº¦ãŒä¸ŠãŒã‚‹ï¼ˆã¾ãŸã¯å¢—える)場合の現在優å…
885ˆåº¦å¤‰æ›´å‡¦ç†
886 */
887Inline bool_t
888mutex_raise_priority(TCB *p_tcb, uint_t newpri)
889{
890 if (newpri < p_tcb->priority) {
891 return(change_priority(p_tcb, newpri, true));
892 }
893 return(false);
894}
895----------------------------------------
896
897要素優å…
898ˆåº¦ãŒä¸‹ãŒã‚‹ï¼ˆã¾ãŸã¯æ¸›ã‚‹ï¼‰å ´åˆã®å‡¦ç†ã¯æ¬¡ã®é€šã‚Šï¼Žoldpriには,下が
899る前の(または減った)要素優å…
900ˆåº¦ã‚’渡す.
901
902----------------------------------------
903/*
904 * 要素優å…
905ˆåº¦ãŒä¸‹ãŒã‚‹ï¼ˆã¾ãŸã¯æ¸›ã‚‹ï¼‰å ´åˆã®ç¾åœ¨å„ªå…
906ˆåº¦å¤‰æ›´å‡¦ç†
907 */
908Inline bool_t
909mutex_drop_priority(TCB *p_tcb, uint_t oldpri)
910{
911 uint_t newpri;
912
913 if (oldpri == p_tcb->priority) {
914 newpri = mutex_calc_priority(p_tcb);
915 if (newpri != p_tcb->priority) {
916 return(change_priority(p_tcb, newpri, true));
917 }
918 }
919 return(false);
920}
921----------------------------------------
922
923いずれの関数も,タスクディスパッチが必
924要な場合にtrue,必
925要ない場合に
926falseを返す.
927
928●優å…
929ˆåº¦åˆ¶å¾¡ã®å¿…
930要箇所
931
932前述の(1)および(2)の優å…
933ˆåº¦ãŒå¤‰åŒ–する場合に,タスクの現在優å…
934ˆåº¦ã®å¤‰æ›´ãŒ
935必
936要になる可能性がある.そこで,(1)および(2)の優å…
937ˆåº¦ã®ãã‚Œãžã‚Œã«ã¤ã„て,
938どのような場合に変化するかを検討し,プログラム中のどの箇所で現在優å…
939ˆåº¦
940を変更すべきか洗い出す.
941
942(1)「タスクのベース優å…
943ˆåº¦ã€ãŒå¤‰åŒ–するのは,chg_priによってタスクのベー
944 ス優å…
945ˆåº¦ã‚’変更した場合のみである.この時は,要素優å…
946ˆåº¦ãŒä¸ŠãŒã‚‹å ´åˆ
947 も下がる場合もある.
948
949(2)「タスクが優å…
950ˆåº¦ä¸Šé™ãƒŸãƒ¥ãƒ¼ãƒ†ãƒƒã‚¯ã‚¹ã‚’ロックしている場合,それらのミュー
951 テックス中で,最も高い上限優å…
952ˆåº¦ã‚’持つミューテックスの上限優å…
953ˆåº¦ã€
954 が変化するのは,以下のいずれかの状況である.
955
956(2-1) 優å…
957ˆåº¦ä¸Šé™ãƒŸãƒ¥ãƒ¼ãƒ†ãƒƒã‚¯ã‚¹ã‚’ロックした時.この時は,要素優å…
958ˆåº¦ãŒå¢—
959 える.
960
961(2-2) 優å…
962ˆåº¦ä¸Šé™ãƒŸãƒ¥ãƒ¼ãƒ†ãƒƒã‚¯ã‚¹ã‚’ロック解除した時.この時は,要素優å…
963ˆåº¦
964 が減る.
965
966●優å…
967ˆåº¦åˆ¶å¾¡ã®å®Ÿè£…
968
969
970上で整理した優å…
971ˆåº¦åˆ¶å¾¡ã®å¿…
972要箇所毎に,実装
973方法を検討する.(1)のchg_pri
974の処理については後でまとめて検討することとし,ここでは(2-1)と(2-2)につ
975いて検討する.
976
977(2-1) 優å…
978ˆåº¦ä¸Šé™ãƒŸãƒ¥ãƒ¼ãƒ†ãƒƒã‚¯ã‚¹ã‚’ロックした時
979
980タスクがミューテックスをロックする処理は,loc_mtx,ploc_mtx,tloc_mtxに
981加えて,unl_mtx,ext_tsk,ter_tskにある.
982
983loc_mtx,ploc_mtx,tloc_mtxでタスクがミューテックスをロックした場合には,
984ミューテックスをロックしたタスクをp_loctsk,ロックしたミューテックスを
985p_mtxcbとすると,次の処理を行えばよい.
986
987----------------------------------------
988 mutex_raise_priority(p_loctsk, p_mtxcb->p_mtxinib->ceilpri);
989----------------------------------------
990
991一方,unl_mtx,ext_tsk,ter_tskでタスクがミューテックスをロックするのは,
992ミューテックス待
993ち状æ…
994‹ã®ã‚¿ã‚¹ã‚¯ãŒå¾…
995ち解除された場合である.この場合には,
996「現在優å…
997ˆåº¦ã‚’変化させるサービスコールの前後とも当該タスクが実行できる
998状æ…
999‹ã§ã‚る場合」に該当しないため,待
1000ち解除されたタスクは,同じ優å…
1001ˆåº¦ã®
1002タスクの中で最低優å…
1003ˆé †ä½ã¨ãªã‚‹ï¼Ž
1004
1005そこで,この場合にはmtxmodeをtrueにしてchange_priorityを呼び出す
1006mutex_raise_priorityを使わずに,新しい現在優å…
1007ˆåº¦ã‚’TCBに設定した後に,
1008make_non_waitを呼び出す形で実装
1009する.å…
1010·ä½“的には,待
1011ち解除されてミューテッ
1012クスをロックしたタスクをp_tcb,ロックしたミューテックスをp_mtxcbとする
1013と,次の処理を行う.
1014
1015----------------------------------------
1016 if (MTX_CEILING(p_mtxcb)) {
1017 if (p_mtxcb->p_mtxinib->ceilpri < p_tcb->priority) {
1018 p_tcb->priority = p_mtxcb->p_mtxinib->ceilpri;
1019 }
1020 }
1021 make_non_wait(p_tcb);
1022----------------------------------------
1023
1024上記のコードは,ミューテックスのロック解除処理を行うmutex_releaseの中に
1025含める.mutex_releaseの実装
1026は次の通り.
1027
1028----------------------------------------
1029static bool_t
1030mutex_release(MTXCB *p_mtxcb)
1031{
1032 TCB *p_tcb;
1033
1034 if (queue_empty(&(p_mtxcb->wait_queue))) {
1035 p_mtxcb->p_loctsk = NULL;
1036 return(false);
1037 }
1038 else {
1039 /*
1040 * ミューテックス待
1041ちキューのå…
1042ˆé ­ã‚¿ã‚¹ã‚¯ï¼ˆp_tcb)に,ミューテッ
1043 * クスをロックさせる.
1044 */
1045 p_tcb = (TCB *) queue_delete_next(&(p_mtxcb->wait_queue));
1046 wait_dequeue_tmevtb(p_tcb);
1047 p_tcb->p_winfo->wercd = E_OK;
1048
1049 p_mtxcb->p_loctsk = p_tcb;
1050 queue_insert_prev(&(p_tcb->mutex_queue), &(p_mtxcb->mutex_queue));
1051 if (MTX_CEILING(p_mtxcb)) {
1052 if (p_mtxcb->p_mtxinib->ceilpri < p_tcb->priority) {
1053 p_tcb->priority = p_mtxcb->p_mtxinib->ceilpri;
1054 }
1055 }
1056 return(make_non_wait(p_tcb));
1057 }
1058}
1059----------------------------------------
1060
1061この関数の後半は,次のように実装
1062することも可能に思える.
1063
1064----------------------------------------
1065 else {
1066 bool_t dspreq = false;
1067
1068 p_tcb = (TCB *) queue_delete_next(&(p_mtxcb->wait_queue));
1069 if (wait_complete(p_tcb)) {
1070 dspreq = true;
1071 }
1072 if (mutex_acquire(p_tcb, p_mtxcb)) {
1073 dspreq = true;
1074 }
1075 return(dspreq);
1076 }
1077----------------------------------------
1078
1079しかしこのコードには,ミューテックスをロックしたタスクの優å…
1080ˆé †ä½ãŒï¼ŒåŒ
1081じ優å…
1082ˆåº¦ã®ã‚¿ã‚¹ã‚¯ã®ä¸­ã§æœ€é«˜ã¨ãªã£ã¦ã—まうという問題がある.仕様に合わせ
1083るためには,mutex_acquireに対してパラメータmtxmodeを追加するなどの修正
1084が必
1085要である.
1086
1087またこのコードは,wait_compleateでタスクをレディキューにつないだ後,
1088mutex_acquireから呼んだmutex_raise_priorityでレディキューからの削除と挿
1089å…
1090¥ã‚’行う場合があり,効率が悪い.
1091
1092(2-2) 優å…
1093ˆåº¦ä¸Šé™ãƒŸãƒ¥ãƒ¼ãƒ†ãƒƒã‚¯ã‚¹ã‚’ロック解除した時
1094
1095タスクがミューテックスをロック解除する処理は,unl_mtxに加えて,ext_tsk,
1096ter_tsk,ini_mtxにある.この場合には,ミューテックスをロック解除したタ
1097スクをp_loctsk,ロック解除したミューテックスをp_mtxcbとすると,次の処理
1098を行えばよい.
1099
1100----------------------------------------
1101 mutex_drop_priority(p_loctsk, p_mtxcb->p_mtxinib->ceilpri);
1102----------------------------------------
1103
1104●各処理の実装
1105
1106
1107・loc_mtx,ploc_mtx,tloc_mtx
1108
1109loc_mtxの中では,ミューテックスをロックする処理と,ミューテックスのロッ
1110クを待
1111ち始める処理を行う.そのため,前述の優å…
1112ˆåº¦å¤‰æ›´ç®‡æ‰€ã®(2-1) に対応
1113しなければならない.この内
1114(2-1)の処理は,mutex_acquireの中で行う.
1115
1116・unl_mtx
1117
1118unl_mtxの中では,ミューテックスをロック解除する処理と,待
1119ち状æ…
1120‹ã§ã‚った
1121タスクにミューテックスをロックさせる処理を行う.そのため,前述の優å…
1122ˆåº¦
1123変更箇所の(2-1),(2-2)に対応しなければならない.この内
1124(2-1)の処理は,
1125mutex_releaseの中で行う.
1126
1127・ini_mtx
1128
1129ini_mtxの中では,ミューテックスをロック解除する処理と,ミューテックスの
1130ロックを待
1131つのをやめる処理を行う.そのため,前述の優å…
1132ˆåº¦å¤‰æ›´ç®‡æ‰€ã®
1133(2-2)に対応しなければならない.
1134
1135・ext_tsk
1136
1137ext_tskの中では,ミューテックスをロック解除する処理と,待
1138ち状æ…
1139‹ã§ã‚った
1140タスクにミューテックスをロックさせる処理を行う.そのため,前述の優å…
1141ˆåº¦
1142変更箇所の(2-1),(2-2)に対応しなければならない.(2-1)の処理は,
1143mutex_release_allから呼び出されるmutex_releaseの中で行う.
1144
1145(2-2)の処理については,次の理由により省略することができる.この処理は,
1146ミューテックスのロック解除により自タスクの優å…
1147ˆã‚’変更する処理であるが,
1148自タスクはこのサービスコールにより終了するため,優å…
1149ˆåº¦ã‚’更新する必
1150要は
1151ない.
1152
1153・ter_tsk
1154
1155ter_tskの中では,ミューテックスのロックを待
1156つのをやめる処理,ミューテッ
1157クスをロック解除する処理と,待
1158ち状æ…
1159‹ã§ã‚ったタスクにミューテックスをロッ
1160クさせる処理を行う.そのため,前述の優å…
1161ˆåº¦å¤‰æ›´ç®‡æ‰€ã®(2-1),(2-2)に対応
1162しなければならない.(2-1)の処理は,mutex_release_allから呼び出される
1163mutex_releaseの中で行う.
1164
1165(2-2)の処理については,次の理由により省略することができる.この処理は,
1166ミューテックスのロック解除により対象タスクの優å…
1167ˆã‚’変更する処理であるが,
1168対象タスクはこのサービスコールにより終了するため,優å…
1169ˆåº¦ã‚’更新する必
1170要
1171はない.
1172
1173●chg_priの修正
1174
1175まず,ミューテックスをサポートすることにより,chg_priに以下のエラーチェッ
1176クを追加する必
1177要がある.
1178
1179----------------------------------------
1180対象タスクが優å…
1181ˆåº¦ä¸Šé™ãƒŸãƒ¥ãƒ¼ãƒ†ãƒƒã‚¯ã‚¹ã‚’ロックしているかロックを待
1182ってい
1183る場合,tskpriは,それらのミューテックスの上限優å…
1184ˆåº¦ã¨åŒã˜ã‹ãã‚Œã‚ˆã‚Šä½Ž
1185くなければならない.
1186----------------------------------------
1187
1188このエラーを検出するために,chg_priには次のコードを追加する.
1189
1190----------------------------------------
1191 else if ((!queue_empty(&(p_tcb->mutex_queue))
1192 || TSTAT_WAIT_MTX(p_tcb->tstat))
1193 && !mutex_check_ceilpri(p_tcb, newbpri)) {
1194 ercd = E_ILUSE;
1195 }
1196----------------------------------------
1197
1198mutex_check_ceilpriの実装
1199は次の通り.この関数は,エラーを検出した場合
1200にfalseを,そうでない場合にtrueを返す.
1201
1202----------------------------------------
1203bool_t
1204mutex_check_ceilpri(TCB *p_tcb, uint_t bpriority)
1205{
1206 QUEUE *p_queue;
1207 MTXCB *p_mtxcb;
1208
1209 /*
1210 * タスクがロックしている優å…
1211ˆåº¦ä¸Šé™ãƒŸãƒ¥ãƒ¼ãƒ†ãƒƒã‚¯ã‚¹ã®ä¸­ã§ï¼Œä¸Šé™å„ªå…
1212ˆ
1213 * 度がbpriorityよりも低いものがあれば,falseを返す.
1214 */
1215 p_queue = p_tcb->mutex_queue.p_next;
1216 while (p_queue != &(p_tcb->mutex_queue)) {
1217 p_mtxcb = MTXCB_QUEUE(p_queue);
1218 if (MTX_CEILING(p_mtxcb) && bpriority < p_mtxcb->p_mtxinib->ceilpri) {
1219 return(false);
1220 }
1221 p_queue = p_queue->p_next;
1222 }
1223
1224 /*
1225 * タスクが優å…
1226ˆåº¦ä¸Šé™ãƒŸãƒ¥ãƒ¼ãƒ†ãƒƒã‚¯ã‚¹ã®ãƒ­ãƒƒã‚¯ã‚’å¾…
1227っている場合に,そ
1228 * の上限優å…
1229ˆåº¦ãŒbpriorityよりも低くければ,falseを返す.
1230 */
1231 if (TSTAT_WAIT_MTX(p_tcb->tstat)) {
1232 p_mtxcb = ((WINFO_MTX *)(p_tcb->p_winfo))->p_mtxcb;
1233 if (MTX_CEILING(p_mtxcb) && bpriority < p_mtxcb->p_mtxinib->ceilpri) {
1234 return(false);
1235 }
1236 }
1237
1238 /*
1239 * いずれの条件にも当てはまらなければtrueを返す.
1240 */
1241 return(true);
1242}
1243----------------------------------------
1244
1245次に,ベース優å…
1246ˆåº¦ã‚’変更した後,次の処理を行う必
1247要がある.
1248
1249----------------------------------------
1250それに伴って,対象タスクの現在優å…
1251ˆåº¦ã‚‚変更される.
1252
1253対象タスクが,優å…
1254ˆåº¦ä¸Šé™ãƒŸãƒ¥ãƒ¼ãƒ†ãƒƒã‚¯ã‚¹ã‚’ロックしていない場合には,次の
1255処理が行われる.対象タスクが実行できる状æ…
1256‹ã®å ´åˆã«ã¯ï¼ŒåŒã˜å„ªå…
1257ˆåº¦ã®ã‚¿ã‚¹
1258クの中で最低優å…
1259ˆé †ä½ã¨ãªã‚‹ï¼Žå¯¾è±¡ã‚¿ã‚¹ã‚¯ãŒå¾…
1260ち状æ…
1261‹ã§ï¼Œã‚¿ã‚¹ã‚¯ã®å„ªå…
1262ˆåº¦é †ã®
1263待
1264ち行列につながれている場合には,対象タスクの変更後の現在優å…
1265ˆåº¦ã«å¾“っ
1266て,その待
1267ち行列中での順序が変更される.待
1268ち行列中に同じ現在優å…
1269ˆåº¦ã®ã‚¿
1270スクがある場合には,対象タスクの順序はそれらの中で最後になる.
1271
1272対象タスクが,優å…
1273ˆåº¦ä¸Šé™ãƒŸãƒ¥ãƒ¼ãƒ†ãƒƒã‚¯ã‚¹ã‚’ロックしている場合には,対象タ
1274スクの現在優å…
1275ˆåº¦ãŒå¤‰æ›´ã•ã‚Œã‚‹ã“とはなく,優å…
1276ˆé †ä½ã‚‚変更されない.
1277----------------------------------------
1278
1279これを実現するためには,優å…
1280ˆåº¦ä¸Šé™ãƒŸãƒ¥ãƒ¼ãƒ†ãƒƒã‚¯ã‚¹ã‚’ロックしていない場合
1281にのみchange_priorityを呼ぶように修正すればよい(change_priorityは,
1282mtxmodeをfalseにして呼ぶ).å…
1283·ä½“的には,chg_priの主要部分は次のようにな
1284る.
1285
1286----------------------------------------
1287 p_tcb->bpriority = newbpri;
1288 if (queue_empty(&(p_tcb->mutex_queue))
1289 || !mutex_scan_ceilmtx(p_tcb)) {
1290 if (change_priority(p_tcb, newbpri, false)) {
1291 dispatch();
1292 }
1293 }
1294 ercd = E_OK;
1295----------------------------------------
1296
1297ここで,mutex_scan_ceilmtxは,タスクが優å…
1298ˆåº¦ä¸Šé™ãƒŸãƒ¥ãƒ¼ãƒ†ãƒƒã‚¯ã‚¹ã‚’ロック
1299している場合にtrueを返す関数で,次のように実装
1300される.
1301
1302----------------------------------------
1303bool_t
1304mutex_scan_ceilmtx(TCB *p_tcb)
1305{
1306 QUEUE *p_queue;
1307 MTXCB *p_mtxcb;
1308
1309 p_queue = p_tcb->mutex_queue.p_next;
1310 while (p_queue != &(p_tcb->mutex_queue)) {
1311 p_mtxcb = MTXCB_QUEUE(p_queue);
1312 if (MTX_CEILING(p_mtxcb)) {
1313 return(true);
1314 }
1315 p_queue = p_queue->p_next;
1316 }
1317 return(false);
1318}
1319----------------------------------------
1320
1321●rot_rdqの修正
1322
1323rot_rdqは,tskpriにTPRI_SELFが指定された場合に,自タスクのベース優å…
1324ˆåº¦
1325を対象優å…
1326ˆåº¦ã¨ã™ã‚‹ï¼ŽãƒŸãƒ¥ãƒ¼ãƒ†ãƒƒã‚¯ã‚¹ã®å°Žå…
1327¥ã«ã‚ˆã‚Šï¼Œãƒ™ãƒ¼ã‚¹å„ªå…
1328ˆåº¦ã‚’表すフィー
1329ルドが新設されたため,その部分のコードを修正する必
1330要がある.å…
1331·ä½“的には,
1332rot_rdq中の
1333
1334----------------------------------------
1335 pri = (tskpri == TPRI_SELF) ? p_runtsk->priority : INT_PRIORITY(tskpri);
1336----------------------------------------
1337
1338の行を,次のように修正する.
1339
1340----------------------------------------
1341 pri = (tskpri == TPRI_SELF) ? p_runtsk->bpriority : INT_PRIORITY(tskpri);
1342----------------------------------------
1343
1344●ref_tskの修正
1345
1346ref_tskは,tskbpriに対象タスクのベース優å…
1347ˆåº¦ã‚’返す.ミューテックスの導
1348å…
1349¥ã«ã‚ˆã‚Šï¼Œãƒ™ãƒ¼ã‚¹å„ªå…
1350ˆåº¦ã‚’表すフィールドが新設されたため,その部分のコー
1351ドを修正する必
1352要がある.å…
1353·ä½“的には,ref_tsk中の
1354
1355----------------------------------------
1356 pk_rtsk->tskbpri = EXT_TSKPRI(p_tcb->priority);
1357----------------------------------------
1358
1359の行を,次のように修正する.
1360
1361----------------------------------------
1362 pk_rtsk->tskbpri = EXT_TSKPRI(p_tcb->bpriority);
1363----------------------------------------
1364
1365●ミューテックス機能をリンクしない工夫
1366
1367最後に,ミューテックス機能を使用しない場合に,ミューテックス関連のコー
1368ドをリンクしない工夫を行う.
1369
1370ミューテックスモジュールの外から呼び出すミューテックスモジュールの内
1371部
1372関数は次の通り.
1373
1374 mutex_check_ceilpri(chg_priより)
1375 mutex_scan_ceilmtx(chg_priより)
1376 mutex_release_all(ext_tsk,ter_tskより)
1377
1378これらの関数はフックルーチンであるものとし,呼び出す際には,変数参ç…
1379§ã‚’
1380はさむことにする.例えば「mutex_release_all(p_runtsk)」の代わりに,
1381
1382 (*mtxhook_release_all)(p_runtsk);
1383
1384と記述する.mtxhook_release_allには,ミューテックスモジュールがリンクさ
1385れた場合にはmutex_release_allへのポインタを格納する.å…
1386·ä½“的には,
1387initialize_mutexにおいて設定する.ミューテックスモジュールがリンクされ
1388ない場合には,mtxhook_release_allを参ç…
1389§ã—てはならないものとする(0がå…
1390¥
1391ることは仮定しない).
1392
1393例えば,ext_tskからmutex_release_allを呼ぶ箇所は次のようになる.
1394
1395----------------------------------------
1396 if (!queue_empty(&(p_runtsk->mutex_queue))) {
1397 (void) (*mtxhook_release_all)(p_runtsk);
1398 }
1399----------------------------------------
1400
1401TCB中のmutex_queueが空でなくなるのは,タスクがミューテックスをロックし
1402ている場合のみで,これはミューテックスモジュールがリンクされた場合に限
1403られる.そのため上のコードで,ミューテックスモジュールがリンクされない
1404場合には,mtxhook_release_allが参ç…
1405§ã•ã‚Œã‚‹ã“とはない.
1406
1407他の2つの関数についてもこれと同様に扱う.
1408
1409●ミューテックス機能拡張のコールグラフ
1410
1411 chg_pri -- mutex_check_ceilpri
1412 -- change_priority -- wobj_change_priority
1413
1414 ext_tsk -- mutex_release_all -- mutex_release
1415
1416 ter_tsk -- mutex_release_all -- mutex_release
1417
1418 initialize_mutex
1419
1420 mutex_check_ceilpri
1421
1422 mutex_calc_priority
1423
1424 mutex_raise_priority -- change_priority -- wobj_change_priority
1425
1426 mutex_drop_priority -- mutex_calc_priority
1427 -- change_priority -- wobj_change_priority
1428
1429 mutex_acquire -- mutex_raise_priority --
1430
1431 mutex_release_all -- mutex_release
1432
1433 loc_mtx -- mutex_acquire -- mutex_raise_priority --
1434 ploc_mtx -- mutex_acquire -- mutex_raise_priority --
1435 tloc_mtx -- mutex_acquire -- mutex_raise_priority --
1436
1437 unl_mtx -- mutex_drop_priority --
1438 -- mutex_release
1439
1440 ini_mtx -- mutex_drop_priority --
1441
1442 ref_mtx
1443
1444○ミューテックス機能のテスト
1445
1446●ミューテックスのテスト(1)
1447
1448FIFO順ミューテックスを,ロックする処理とロック解除する処理を一通りテス
1449トする.
1450
1451●ミューテックスのテスト(2)
1452
1453優å…
1454ˆåº¦é †ãƒŸãƒ¥ãƒ¼ãƒ†ãƒƒã‚¯ã‚¹ã‚’,ロックする処理とロック解除する処理を一通りテ
1455ストする.
1456
1457●ミューテックスのテスト(3)
1458
1459優å…
1460ˆåº¦ä¸Šé™ãƒŸãƒ¥ãƒ¼ãƒ†ãƒƒã‚¯ã‚¹ã‚’,ロックする処理とロック解除する処理を一通り
1461テストする.ref_tskによるベース優å…
1462ˆåº¦ã¨ç¾åœ¨å„ªå…
1463ˆåº¦ã®å‚ç…
1464§å‡¦ç†ã®ãƒ†ã‚¹ãƒˆã‚‚å…
1465¼
1466ねている.
1467
1468●ミューテックスのテスト(4)
1469
1470優å…
1471ˆåº¦ä¸Šé™ãƒŸãƒ¥ãƒ¼ãƒ†ãƒƒã‚¯ã‚¹ã«å¯¾ã—て,loc_mtxとunl_mtxに伴う優å…
1472ˆåº¦ã®å¤‰æ›´å‡¦
1473理を網羅
1474的にテストする.ただし,change_priorityとmutex_calc_priorityの
1475内
1476容には踏み込まない.
1477
1478●ミューテックスのテスト(5)
1479
1480優å…
1481ˆåº¦ä¸Šé™ãƒŸãƒ¥ãƒ¼ãƒ†ãƒƒã‚¯ã‚¹ã«å¯¾ã—て,ミューテックスの再初期化処理を網羅
1482的
1483にテストする.ただし,change_priorityとmutex_calc_priorityの内
1484容には踏
1485み込まない.
1486
1487●ミューテックスのテスト(6)
1488
1489優å…
1490ˆåº¦ä¸Šé™ãƒŸãƒ¥ãƒ¼ãƒ†ãƒƒã‚¯ã‚¹ã«å¯¾ã—て,タスクの終了時,タスクの優å…
1491ˆé †ä½ã®å›ž
1492転時のミューテックス関連の処理を網羅
1493的にテストする.
1494
1495●ミューテックスのテスト(7)
1496
1497優å…
1498ˆåº¦ä¸Šé™ãƒŸãƒ¥ãƒ¼ãƒ†ãƒƒã‚¯ã‚¹ã«å¯¾ã—て,タスクの強制終了時のミューテックス関
1499連の処理を網羅
1500的にテストする.
1501
1502●ミューテックスのテスト(8)
1503
1504優å…
1505ˆåº¦ä¸Šé™ãƒŸãƒ¥ãƒ¼ãƒ†ãƒƒã‚¯ã‚¹ã«å¯¾ã—て,chg_priに伴うミューテックス関連の優å…
1506ˆ
1507度変更処理を網羅
1508的にテストする.ただし,change_priorityと
1509mutex_check_ceilpri,mutex_scan_ceilmtxの内
1510容には踏み込まない.
1511
1512以上
1513
1514**********************************************************************
1515採用されなかった検討
1516**********************************************************************
1517
1518○ミューテックス機能の修正仕様案
1519
1520ミューテックス機能の仕様については,μITRON4.0仕様のミューテックス機能
1521をベースとするが,次の修正を加える.
1522
1523・ミューテックス操作に伴いタスクの現在優å…
1524ˆåº¦ãŒå¤‰åŒ–する場合には,同じ優
1525 å…
1526ˆåº¦ã®ã‚¿ã‚¹ã‚¯ã®ä¸­ã§æœ€é«˜å„ªå…
1527ˆé †ä½ã¨ãªã‚‹ï¼Ž
1528
1529 ★
1530タスクが実行できる状æ…
1531‹ã®å ´åˆã«é™ã‚‹ã¹ãã‹
1532 実行状æ…
1533‹ã«é™ã‚‹ã¨ã™ã‚‹æ¡ˆã‚‚ある → 不採用
1534 サービスコールの前後とも実行できる状æ…
1535‹ã§ã‚る場合に限る案もある → 採用
1536 ★
1537ミューテックスをロックしている場合に限られる
1538 (新たにロックする場合,これまでロックしていた場合も含む)
1539
1540・chg_priでタスクのベース優å…
1541ˆåº¦ã‚’変更した場合で,ベース優å…
1542ˆåº¦ã‚’変更した
1543 後の状æ…
1544‹ã§ãƒŸãƒ¥ãƒ¼ãƒ†ãƒƒã‚¯ã‚¹çµŒç”±ã§å„ªå…
1545ˆåº¦ã‚’継承していない場合に限り,同じ
1546 優å…
1547ˆåº¦ã®ã‚¿ã‚¹ã‚¯ã®ä¸­ã§æœ€ä½Žå„ªå…
1548ˆé †ä½ã¨ãªã‚‹ï¼ŽãƒŸãƒ¥ãƒ¼ãƒ†ãƒƒã‚¯ã‚¹çµŒç”±ã§å„ªå…
1549ˆåº¦ã‚’
1550 継承している場合にどうなるかは要検討(優å…
1551ˆåº¦ãŒå¤‰ã‚ã‚‹æ™‚は最高優å…
1552ˆé †ä½ï¼Œ
1553 変わらない場合はそのままとするのが妥当か).
1554
1555 ★
1556タスクが実行できる状æ…
1557‹ã®å ´åˆã«é™ã‚‹ã¹ãã‹ → 採用
1558 実行状æ…
1559‹ã«é™ã‚‹ã¨ã™ã‚‹æ¡ˆã‚‚ある → 不採用
1560
1561上の検討を受けて,次のように詳細化する.
1562
1563・ミューテックス操作に伴いタスクの現在優å…
1564ˆåº¦ãŒå¤‰åŒ–する場合の扱いは次の
1565 通りとする.対象タスクがサービスコールの前後とも実行できる状æ…
1566‹ã§ã‚ã‚‹
1567 場合には,同じ優å…
1568ˆåº¦ã®ã‚¿ã‚¹ã‚¯ã®ä¸­ã§æœ€é«˜å„ªå…
1569ˆé †ä½ã¨ãªã‚‹ï¼Žãã†ã§ãªã„場合
1570 には,同じ優å…
1571ˆåº¦ã®ã‚¿ã‚¹ã‚¯ã®ä¸­ã§æœ€ä½Žå„ªå…
1572ˆé †ä½ã¨ãªã‚‹ï¼Ž
1573
1574・chg_priでタスクのベース優å…
1575ˆåº¦ã‚’変更した場合の扱いは次の通りとする.対
1576 象タスクが実行できる状æ…
1577‹ã§ï¼Œãƒ™ãƒ¼ã‚¹å„ªå…
1578ˆåº¦ã‚’変更した後の状æ…
1579‹ã§ãƒŸãƒ¥ãƒ¼ãƒ†ãƒƒ
1580 クス経由でベース優å…
1581ˆåº¦ã¨åŒã˜ã‹ãã‚Œã‚ˆã‚Šé«˜ã„優å…
1582ˆåº¦ã‚’継承している場合に
1583 は,現在優å…
1584ˆåº¦ãŒå¤‰åŒ–するなら同じ優å…
1585ˆåº¦ã®ã‚¿ã‚¹ã‚¯ã®ä¸­ã§æœ€é«˜å„ªå…
1586ˆé †ä½ã¨ãª
1587 り,現在優å…
1588ˆåº¦ãŒå¤‰åŒ–しないなら優å…
1589ˆé †ä½ã‚‚変化しない.それ以外の場合に
1590 は,同じ優å…
1591ˆåº¦ã®ã‚¿ã‚¹ã‚¯ã®ä¸­ã§æœ€ä½Žå„ªå…
1592ˆé †ä½ã¨ãªã‚‹ï¼Ž
1593
1594注)ミューテックス経由でベース優å…
1595ˆåº¦ã‚ˆã‚Šã‚‚低い優å…
1596ˆåº¦ã‚’継承する状況は,
1597 優å…
1598ˆåº¦ç¶™æ‰¿ãƒŸãƒ¥ãƒ¼ãƒ†ãƒƒã‚¯ã‚¹ã®ã¿ã§èµ·ã“り,優å…
1599ˆåº¦ä¸Šé™ãƒŸãƒ¥ãƒ¼ãƒ†ãƒƒã‚¯ã‚¹ã§ã¯
1600 起こらない.そのため,優å…
1601ˆåº¦ç¶™æ‰¿ãƒŸãƒ¥ãƒ¼ãƒ†ãƒƒã‚¯ã‚¹ã‚’サポートしない場合
1602 には,「ミューテックス経由でベース優å…
1603ˆåº¦ã¨åŒã˜ã‹ãã‚Œã‚ˆã‚Šé«˜ã„優å…
1604ˆåº¦
1605 を継承している場合」は「優å…
1606ˆåº¦ä¸Šé™ãƒŸãƒ¥ãƒ¼ãƒ†ãƒƒã‚¯ã‚¹ã‚’ロックしている場
1607 合」と一致する.
1608
1609【参考】
1610
1611優å…
1612ˆåº¦ç¶™æ‰¿å‡¦ç†ã¯ï¼Œæœ¬æ¥ã¯ï¼Œå„ªå…
1613ˆåº¦ã§ã¯ãªãå„ªå…
1614ˆé †ä½ã‚’継承すべきであるべき
1615という意見があるが,現状の実装
1616では優å…
1617ˆé †ä½ã‚’記憶していないため,実現が
1618難しいという問題がある.
1619
1620○chg_priの機能記述(関連部分のみ)
1621
1622----------------------------------------------------------------------
1623tskidで指定したタスク(対象タスク)のベース優å…
1624ˆåº¦ã‚’,tskpriで指定した優
1625å…
1626ˆåº¦ã«å¤‰æ›´ã™ã‚‹ï¼Žå…
1627·ä½“的な振舞いは以下の通り.
1628
1629対象タスクが休止状æ…
1630‹ã§ãªã„場合には,対象タスクのベース優å…
1631ˆåº¦ãŒï¼Œtskpri
1632で指定した優å…
1633ˆåº¦ã«å¤‰æ›´ã•ã‚Œã‚‹ï¼Žãã‚Œã«ä¼´ã£ã¦ï¼Œå¯¾è±¡ã‚¿ã‚¹ã‚¯ã®ç¾åœ¨å„ªå…
1634ˆåº¦ã‚‚変
1635更される.
1636
1637対象タスクが実行できる状æ…
1638‹ã®å ´åˆã«ã¯ï¼Œå¯¾è±¡ã‚¿ã‚¹ã‚¯ã®å„ªå…
1639ˆé †ä½ã¯æ¬¡ã®é€šã‚Šã¨
1640なる.変更後の現在優å…
1641ˆåº¦ãŒãƒŸãƒ¥ãƒ¼ãƒ†ãƒƒã‚¯ã‚¹çµŒç”±ã§å„ªå…
1642ˆåº¦ã‚’継承していない場
1643合には,同じ優å…
1644ˆåº¦ã®ã‚¿ã‚¹ã‚¯ã®ä¸­ã§æœ€ä½Žå„ªå…
1645ˆé †ä½ã¨ãªã‚‹ï¼ŽãƒŸãƒ¥ãƒ¼ãƒ†ãƒƒã‚¯ã‚¹çµŒç”±
1646で優å…
1647ˆåº¦ã‚’継承している場合には,現在優å…
1648ˆåº¦ãŒå¤‰åŒ–するなら同じ優å…
1649ˆåº¦ã®ã‚¿
1650スクの中で最高優å…
1651ˆé †ä½ã¨ãªã‚Šï¼Œç¾åœ¨å„ªå…
1652ˆåº¦ãŒå¤‰åŒ–しないなら優å…
1653ˆé †ä½ã‚‚変化
1654しない.
1655
1656ここで,現在優å…
1657ˆåº¦ãŒãƒŸãƒ¥ãƒ¼ãƒ†ãƒƒã‚¯ã‚¹çµŒç”±ã§å„ªå…
1658ˆåº¦ã‚’継承しているとは,対象
1659タスクがミューテックスをロックしていることにより,ベース優å…
1660ˆåº¦ã¨åŒã˜ã‹
1661それより高い優å…
1662ˆåº¦ã‚’継承していることを言う.すなわち,次のいずれか(ま
1663たは両方)の条件を満たす場合である.
1664
1665 ・対象タスクがロックしている優å…
1666ˆåº¦ç¶™æ‰¿ãƒŸãƒ¥ãƒ¼ãƒ†ãƒƒã‚¯ã‚¹ã‚’,対象タスクの
1667 ベース優å…
1668ˆåº¦ã¨åŒã˜ã‹ãã‚Œã‚ˆã‚Šé«˜ã„優å…
1669ˆåº¦ã‚’持ったタスクが待
1670っている.
1671 ・対象タスクが優å…
1672ˆåº¦ä¸Šé™ãƒŸãƒ¥ãƒ¼ãƒ†ãƒƒã‚¯ã‚¹ã‚’ロックしている(タスクがロッ
1673 クしている優å…
1674ˆåº¦ä¸Šé™ãƒŸãƒ¥ãƒ¼ãƒ†ãƒƒã‚¯ã‚¹ã®ä¸Šé™å„ªå…
1675ˆåº¦ã¯ï¼Œå¿…
1676ず,そのタスク
1677 のベース優å…
1678ˆåº¦ã¨åŒã˜ã‹ãã‚Œã‚ˆã‚Šé«˜ã„).
1679
1680対象タスクが待
1681ち状æ…
1682‹ã§ï¼Œã‚¿ã‚¹ã‚¯ã®å„ªå…
1683ˆåº¦é †ã®å¾…
1684ち行列につながれている場合
1685には,対象タスクの変更後の現在優å…
1686ˆåº¦ã«å¾“って,その待
1687ち行列中での順序が
1688変更される.待
1689ち行列中に同じ現在優å…
1690ˆåº¦ã®ã‚¿ã‚¹ã‚¯ãŒã‚る場合には,対象タス
1691クの順序はそれらの中で最後になる.
1692----------------------------------------------------------------------
1693
1694○参考:μITRON4.0仕様(4.02.00)におけるchg_pri
1695
1696----------------------------------------------------------------------
1697このサービルコールを実行した結果,対象タスクの現在優å…
1698ˆåº¦ãŒå¤‰åŒ–した場合
1699および現在優å…
1700ˆåº¦ãŒãƒ™ãƒ¼ã‚¹å„ªå…
1701ˆåº¦ã«ä¸€è‡´ã—ている場合(ミューテックス機能を
1702使わない場合には,この条件は常に成り立つ)には,次の処理を行う.対象タ
1703スクが実行できる状æ…
1704‹ã§ã‚る場合,タスクの優å…
1705ˆé †ä½ã‚’,変更後の優å…
1706ˆåº¦ã«ã—
1707たがって変化させる.変更後の優å…
1708ˆåº¦ã¨åŒã˜å„ªå…
1709ˆåº¦ã‚’持つタスクの間では,対
1710象タスクの優å…
1711ˆé †ä½ã‚’最低とする.対象タスクが何らかのタスク優å…
1712ˆåº¦é †ã®å¾…
1713
1714ち行列につながれている場合にも,その待
1715ち行列の中での順序を,変更後の優
1716å…
1717ˆåº¦ã«ã—たがって変化させる.変更後の優å…
1718ˆåº¦ã¨åŒã˜å„ªå…
1719ˆåº¦ã‚’持つタスクの間
1720では,対象タスクを最後につなぐ.
1721----------------------------------------------------------------------
1722
1723○chg_priにおける優å…
1724ˆé †ä½å¤‰åŒ–に関する分析
1725
1726(a) このサービスコールを実行した結果,対象タスクの現在優å…
1727ˆåº¦ãŒå¤‰åŒ–した
1728場合および現在優å…
1729ˆåº¦ãŒãƒ™ãƒ¼ã‚¹å„ªå…
1730ˆåº¦ã«ä¸€è‡´ã—ている場合
1731
1732(a1)「現在優å…
1733ˆåº¦ãŒãƒ™ãƒ¼ã‚¹å„ªå…
1734ˆåº¦ã«ä¸€è‡´ã€
1735 ミューテックス経由で優å…
1736ˆåº¦ã‚’継承していない or
1737 ミューテックス経由で優å…
1738ˆåº¦ã‚’継承している優å…
1739ˆåº¦ãŒãƒ™ãƒ¼ã‚¹å„ªå…
1740ˆåº¦ã¨
1741 同じかそれより低い
1742(a2) 対象タスクの現在優å…
1743ˆåº¦ãŒå¤‰åŒ–した
1744
1745(a-) このサービスコールを実行した結果,対象タスクの現在優å…
1746ˆåº¦ãŒå¤‰åŒ–せず,
1747現在優å…
1748ˆåº¦ãŒãƒ™ãƒ¼ã‚¹å„ªå…
1749ˆåº¦ã«ä¸€è‡´ã—ていない場合
1750
1751(a1-)「現在優å…
1752ˆåº¦ãŒãƒ™ãƒ¼ã‚¹å„ªå…
1753ˆåº¦ã«ä¸€è‡´ã—ていない」
1754 ミューテックス経由で,ベース優å…
1755ˆåº¦ã‚ˆã‚Šã‚‚高い優å…
1756ˆåº¦ã‚’継承している
1757(a2-) 対象タスクの現在優å…
1758ˆåº¦ãŒå¤‰åŒ–した
1759
1760ベース優å…
1761ˆåº¦ãŒï¼Œchg_priの前後でどのように変化したかを,ミューテックス経
1762由で継承している最高優å…
1763ˆåº¦ã¨ã®æ¯”較で分類する.下の表で「高い」とは,ベー
1764ス優å…
1765ˆåº¦ãŒï¼ŒãƒŸãƒ¥ãƒ¼ãƒ†ãƒƒã‚¯ã‚¹çµŒç”±ã§ç¶™æ‰¿ã—ている最高優å…
1766ˆåº¦ã‚ˆã‚Šã‚‚高いことを
1767示す.また,「(変化あり)」とは,chg_priの前後でベース優å…
1768ˆåº¦ã®å€¤ãŒå¤‰ã‚ã‚‹
1769ことを示す.
1770 優å…
1771ˆé †ä½ã®å¤‰åŒ–
1772 chg_pri前 chg_pri後 成立条件 実行できる状æ…
1773‹ 待
1774ち状æ…
1775‹
1776 高い 高い(変化あり) (a1)(a2)(a) (b) 最低 最低
1777 高い 高い(変化なし) (a1) (a) (b) 最低 最低
1778 高い 同じ (a1)(a2)(a) 最低→最高 最低
1779 高い 低い (a2)(a) 最低→最高 最低
1780 同じ 高い (a1)(a2)(a) (b) 最低 最低
1781 同じ 同じ(変化なし) (a1) (a) 最低→変化なし 最低→?
1782 同じ 低い 変化なし 変化なし
1783 低い 高い (a1)(a2)(a) (b) 最低 最低
1784 低い 同じ (a1) (a) 最低→変化なし 最低→?
1785 低い 低い(変化あり) 変化なし 変化なし
1786 低い 低い(変化なし) 変化なし 変化なし
1787
1788(b) 変更後の現在優å…
1789ˆåº¦ãŒãƒŸãƒ¥ãƒ¼ãƒ†ãƒƒã‚¯ã‚¹çµŒç”±ã§å„ªå…
1790ˆåº¦ã‚’継承していない場合
1791
1792(b-) 変更後の現在優å…
1793ˆåº¦ãŒãƒŸãƒ¥ãƒ¼ãƒ†ãƒƒã‚¯ã‚¹çµŒç”±ã§å„ªå…
1794ˆåº¦ã‚’継承している場合
1795
1796○検討過程のメモ
1797
1798☆優å…
1799ˆåº¦ä¸Šé™ã«ã—ぼって考える
1800
1801優å…
1802ˆåº¦ä¸Šé™ã§ã¯ï¼Œå„ªå…
1803ˆåº¦ãŒå¤‰åŒ–するのは,以下の状況.
1804
1805・ミューテックスをロックしたとき
1806 優å…
1807ˆåº¦ãŒä¸ŠãŒã‚‹ï¼ˆã¾ãŸã¯ï¼Œå¤‰ã‚ã‚‰ãªã„)
1808 → 指摘2の状況を考えると,同優å…
1809ˆåº¦å†…
1810では最高優å…
1811ˆé †ä½ã§ã‚るべき
1812
1813・ミューテックスをロック解除したとき
1814 優å…
1815ˆåº¦ãŒä¸‹ãŒã‚‹ï¼ˆã¾ãŸã¯ï¼Œå¤‰ã‚ã‚‰ãªã„)
1816 → 他の優å…
1817ˆåº¦ä¸Šé™ãƒŸãƒ¥ãƒ¼ãƒ†ãƒƒã‚¯ã‚¹ã‚’ロックしている場合には,
1818 同優å…
1819ˆåº¦å†…
1820では最高優å…
1821ˆé †ä½ã§ã‚るべき
1822 → そうでない場合には,どちらでも問題ないと思われるが,
1823 stack resource policy を実現するには,最高優å…
1824ˆé †ä½ã§ã‚るべき
1825
1826課題:あるタスクがミューテックスをロック解除し,他のタスクがロックする時
1827 上の2つが同時に起こる
1828
1829 → 待
1830ち状æ…
1831‹ã‹ã‚‰å®Ÿè¡Œå¯èƒ½çŠ¶æ…
1832‹ã«ãªã‚‹æ™‚は,最高優å…
1833ˆé †ä½ã§ã‚ã‚‹å¿…
1834要がない
1835 ロックを取得する「他のタスク」は最低優å…
1836ˆé †ä½ã¨ã™ã‚‹
1837
1838 言い換えると,
1839 他タスクにミューテックスをロックさせた時は,最低優å…
1840ˆé †ä½ã¨ã™ã‚‹
1841
1842・ミューテックスが初期化された時
1843 ロックしていたタスクの優å…
1844ˆåº¦ãŒä¸‹ãŒã‚‹ï¼ˆã¾ãŸã¯ï¼Œå¤‰ã‚ã‚‰ãªã„)
1845
1846・chg_priが発行された時
1847 ミューテックスをロックしている時
1848 ベース優å…
1849ˆåº¦ã‚’上げる時
1850 ベース優å…
1851ˆåº¦ãŒï¼Œãƒ­ãƒƒã‚¯ã—ているミューテックスの優å…
1852ˆåº¦ä¸Š
1853 限よりも高くなることはないため,ベース優å…
1854ˆåº¦ã‚’上げたこ
1855 とで,現在優å…
1856ˆåº¦ã®å¤‰æ›´ã¯ãªã„.
1857 ベース優å…
1858ˆåº¦ã‚’下げる時
1859 それまでのベース優å…
1860ˆåº¦ãŒï¼Œãƒ­ãƒƒã‚¯ã—ているミューテックス
1861 の優å…
1862ˆåº¦ä¸Šé™ã‚ˆã‚Šã‚‚高いことはないため,ベース優å…
1863ˆåº¦ã‚’下
1864 げたことで,現在優å…
1865ˆåº¦ã®å¤‰æ›´ã¯ãªã„.
1866
1867 → ロックしているミューテックスの優å…
1868ˆåº¦ä¸Šé™ã¯ï¼Œå¤‰æ›´å‰å¾Œã®ãƒ™ãƒ¼
1869 ス優å…
1870ˆåº¦ã¨åŒã˜ã‹ãã‚Œã‚ˆã‚Šé«˜ã„ため,現在優å…
1871ˆåº¦ã®å¤‰æ›´ã¯ãªã„.
1872 よって,優å…
1873ˆé †ä½ã¯å¤‰æ›´ã—ないのが素直.
1874
1875 ★
1876優å…
1877ˆåº¦ç¶™æ‰¿ãƒŸãƒ¥ãƒ¼ãƒ†ãƒƒã‚¯ã‚¹ãŒã‚ると成り立たなくなる.
1878
1879 ミューテックスをロックしていない時は,通常の振る舞いと一致すべき
1880 つまり,最低優å…
1881ˆé †ä½ã¨ã™ã‚‹
1882
1883・タスクが終了した時・強制終了された時
1884 ミューテックスをロックしていれば,ロック解除することになるが,
1885 タスクが終了してしまうので,優å…
1886ˆé †ä½ã¯æ„å‘³ãŒãªããªã‚‹
1887
1888○実装
1889に向けての仕様の詳細検討(古い)
1890
1891μITRON4.0仕様の厳密な優å…
1892ˆåº¦åˆ¶å¾¡è¦å‰‡ã«ãŠã„ては,タスクの現在優å…
1893ˆåº¦ã‚’,
1894常に,次の優å…
1895ˆåº¦ã®æœ€é«˜å€¤ã«ä¸€è‡´ã™ã‚‹ã‚ˆã†ã«è¨­å®šã™ã‚‹ï¼Ž
1896
1897(1) タスクのベース優å…
1898ˆåº¦
1899
1900(2) タスクがTA_INHERIT属性のミューテックスをロックしている場合,それら
1901 のミューテックスのロックを待
1902っているタスクの中で,最も高い現在優å…
1903ˆ
1904 度を持つタスクの現在優å…
1905ˆåº¦
1906
1907(3) タスクがTA_CEILING属性のミューテックスをロックしている場合,それら
1908 のミューテックス中で,最も高い上限優å…
1909ˆåº¦ã‚’持つミューテックスの上限
1910 優å…
1911ˆåº¦
1912
1913これらの優å…
1914ˆåº¦ã‚’,ここでは,現在優å…
1915ˆåº¦ã‚’決定する要素となるという意味で,
1916要素優å…
1917ˆåº¦ã¨å‘¼ã¶ï¼Ž
1918
1919修正仕様(A)により,(2)と(3)の要素優å…
1920ˆåº¦ã¯ï¼ŒåŒå„ªå…
1921ˆåº¦å†…
1922の最高優å…
1923ˆé †ä½ã¨ã¿
1924なすことになる.
1925
1926また(2)において,TA_INHERIT属性のミューテックスの待
1927ちキューはタスクの優
1928å…
1929ˆåº¦é †ã§ã‚るため,最も高い現在優å…
1930ˆåº¦ã‚’持つタスクは,待
1931ちキューのå…
1932ˆé ­ã®
1933タスクである.つまり,(2)の要素優å…
1934ˆåº¦ã‚’求めるために,待
1935ちキューをスキャ
1936ンする必
1937要はない.
1938**********************************************************************
Note: See TracBrowser for help on using the repository browser.