(toppers-users 546) Re: 基本的な事ですが?

Tatsuhiko Matsukawa KFC00725 @ nifty.ne.jp
2002年 9月 11日 (水) 21:33:48 JST


ユートンさん、今日は。
ITRON駆け出しの松川といいます。

自分の勉強の意味も含めて、回答させていただきます。
(何か不備な点がありましたら、ベテランの皆様、
フォローをお願いいたします。)

結論から言うと、snd_msg()とsnd_mbx()は同じです。
待ち状態(WAITING)になることはありませんが、プリエンプト
されて実行可能状態(READY)になることは、どちらもあります。

仮に、空のメールボックスに対してsnd_mbxを呼び出
すタスクをTASK-Aとします。
snd_mbxを呼び出す時点では、TASK-Aが動いて
いるのですから、TASK-Aは実行状態(RUNNING)という
ことです。

ここで、snd_mbxを行った時点で、

[Case1] このメールボックスへのrcv_mbxで待ち状態の
タスクが無い場合、いずれのタスクにも状態遷移は無く、
引き続き、TASK-Aは実行状態(RUNNING)です。

[Case2] このメールボックスへのrcv_mbxで待ち状態の
タスク(TASK-B)がTASK-Aより優先度が低い場合、
TASK-Bは待ち解除され実行可能状態(READY)になり
ますが、TASK-Aのほうが優先度が高いため、引き続き、
TASK-Aは実行状態(RUNNING)のままです。

[Case3] このメールボックスへのrcv_mbxで待ち状態の
タスク(TASK-B)がTASK-Aより優先度が高い場合、
まず、TASK-Bは待ち解除され実行可能状態(READY)
になります。TASK-Aの優先度はTASK-Bより低いため、
TASK-Aはプリエンプトされて実行可能状態(READY)、
TASK-Bはディスパッチされて実行状態(RUNNING)にな
ります。

> 3.0 snd_msg
>  3.0のサービスコール詳細において、snd_msg発行で待ち状態へ移行しない
> と記述されています。(プリエンプトもしないと思っていたのですが?)
snd_msgでも、Case3の場合、プリエンプトされます。

************************
松川竜彦
KFC00725 @ nifty.ne.jp
************************