(toppers-users 2783) Re: メールボックスの機能について

TAKADA Hiroaki hiro @ ertl.jp
2008年 8月 7日 (木) 12:39:52 JST


杉山様

名古屋大学の高田です。

> メールボックスを使った以下のソースを実行した結果がどうにも
> 腑に落ちません。
> どなたか、正しい説明を御願いできませんか??
> 
> 以下のソースを実行しました。受信タスクの2つはプライオリティ
> を代えています。
> 
> たぶん、この記述だと、受信タスクは優先度の高いタスクだけが
> 受信するはずなのですが、送信データの個数にかかわらず、最後の
> 1パケットだけを優先度の低いタスクが受け取ってしまいます。。

メールボックスが TA_TFIFO 属性になっていますので、優先度の低い方のタス
クもメッセージを受け取ります。TA_TPRI 属性にすれば、優先度の高い方のタ
スクだけがメッセージを受け取るようになるはずです。

最後の1パケットを優先度の低いタスクが受け取っているのではなく、最初の
メッセージを優先度の低いタスクが受け取っており、syslogに出力されるのが
最後になっているものと思われます。

動きを時間順に示すと次のようになります。

(1) main_taskが起動
(2) act_tsk(TASK1)で優先度の低いタスクが起動。そちらに切り替わる
(3) 優先度の低いタスクが、メールボックス受信待ちになる。main_taskに戻る
(4) act_tsk(TASK2)で優先度の高いタスクが起動。そちらに切り替わる
(5) 優先度の高いタスクが、メールボックス受信待ちになる。main_taskに戻る
(6) act_tsk(TASK3)で送信タスクが起動。そちらに切り替わる
(7) 送信タスクが最初に送信したメッセージは、最初にメールボックス待ちに
    なった優先度の低いタスクが受信する(TA_TFIFO属性なので)。優先度の
    低いタスクに切り替わらない。
(8) 送信タスクが2番目に送信したメッセージは、優先度の高いタスクが受信
    する。

あとは、予想いただけると思います。

なお、send_taskは10個のメッセージで msg を共通に使っていますが、これは、
推奨される使い方ではありません(このケースは、大丈夫ですが、少し修正す
ると不具合が出ると思われます)。msg を10個分確保した方がいいと思います。

高田広章
名古屋大学