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

SHUKUGUCHI Masahiro mshukuguchi @ elec.nara-k.ac.jp
2008年 8月 7日 (木) 15:10:16 JST


杉山さま

宿口です。返答ありがとうございます。

柿崎さんのご指摘を実施するのがよいでしょうし、また、メッセージに
シーケンス番号を入れるのも手だと思います。

さて、その他の情報として

配布パッケージのままであれば、syslog の先のシリアルドライバでセマフォ
による待ちが発生する場合があります。

送信タスクがメッセージ送信中であれば、優先度の高い方の受信タスクに
プリエンプションされるものの、MID_PRIORITY のレディキューからは
送信タスクは取り除かれません。このため優先度の低い方の受信タスクが
RUNNINGに遷移することはありません。

優先度の高い方の受信タスクがsyslog で待ちになった場合に送信タスクが
動作します。syslog 中に最後のメッセージを送信し終わる可能性があります。
最後のメッセージを送信し終わると送信タスクは関数終了(暗黙のext_tsk発行)
により休止状態となりMID_PRIORITY のレディキューから除かれ、優先度の低
いほうの受信タスクがレディとなり、このとき優先度の高い方の受信タスクの
待ちが解除されていないのであれば優先度の低いほうの受信タスクがメッセー
ジ待ちとなる可能性があります。

まずは、高田先生や柿崎さんのご指摘に対応するのが良いかと。

Shukuguchi

PS
> 普通は、恥の書きついでに以下のようにすればよいのでしょうか??

いくつかのやり方があります。固定長メモリプールを使用するのも手だと
思いますが、手っ取り早くやるなら

/*
        送信タスク
*/
void send_task(VP_INT exinf){
	MESSAGE msg_bdy[10];
        MESSAGE *msg;   //送信パケット
        VP              p_blk;  //送信用固定メモリプール
        INT i;

        for(i=0;i<10;i++){
		msg = &msg_bdy[cnti]
                msg->n=i;
                strcpy(&msg->buf[0],"thie is test message from task \r\n");
                snd_mbx(MAILBOX,(T_MSG*)msg);
        }
}

ですかね(あくまでテストプロとして)

固定長メモリプールを使用する場合は、提示されたコードでよいと思います。


"M.Sugiyama" <sugiyama @ ap.chugoku-pc.ac.jp> wrote:
> みさなん 
> 
>  お世話になります。
> もろもろ実験中ですが、途中経過のみ。。
> 
> プライオリティは、もともとの物には手を加えていません。
> 従って、5,9、10のままです。
> 
> パケットの受け取りの順序を確認すべく、少々ソースに手を
> 加えてみました。
> 
> 実行結果はのようになり、最後のパケットを2つのタスクが
> 受信しているようです。
> act_tsk(TASK1),act_task(TASK2)の順序には依存いしてないようです。
> 
> 言い忘れておりましたがAkiH8 3069F JSP-1.4.3での様子です。
> 
> 取り急ぎご報告まで。。
> 
> start
> waiting
> waiting
> message 2
> thie is test message from task
>   0
> 
> <中略>
> message 2
> thie is test message from task
>   9
> message 1
> thie is test message from task
>   9
> 
> =========Cソースファイル========
> #include <t_services.h>
> #include "kernel_id.h"
> #include "sample1.h"
> /*
>         メール送受信用のバッファ
> */
> typedef struct
> {
>         T_MSG pk_msg;
>         char buf[64];
>         INT  n;
> }MESSAGE;
> 
> /*
>  *  メインタスク
>  *  メールボックス機能を使ってデータを送信する
>  */
> void main_task(VP_INT exinf){
> 
>         act_tsk(TASK2);
>         act_tsk(TASK1);
>         act_tsk(TASK3);
> 
>     syslog(LOG_NOTICE,"start");
>     slp_tsk();
> }
> /*
>         送信タスク
> */
> void send_task(VP_INT exinf){
>         MESSAGE msg;    //送信パケット
>         INT i;
> 
>         for(i=0;i<10;i++){
>                 msg.n=i;
>                 strcpy(msg.buf,"thie is test message from task \r\n");
>                 snd_mbx(MAILBOX,(T_MSG*)&msg);
>         }
> }
> 
> /*
>         受信タスク
>         タスクは2つ生成している
> */
> void task(VP_INT exinf){
> MESSAGE *msg;
>     //受信処理
>     syslog(LOG_NOTICE,"waiting");
>         while(1){
>                 rcv_mbx(MAILBOX,(T_MSG**)&msg);
>                 syslog(LOG_NOTICE,"message %d",exinf);
>                 syslog(LOG_NOTICE,"%s  %d",msg->buf,msg->n);
>         }
> }
> 
> ==========CFG========
> 
> #define _MACRO_ONLY
> #include "sample1.h"
> 
> INCLUDE("\"sample1.h\"");
> CRE_TSK(MAIN_TASK, { TA_HLNG|TA_ACT, (VP_INT) 0, main_task, MAIN_PRIORITY,
>                         STACK_SIZE, NULL });
> CRE_TSK(TASK1, { TA_HLNG, (VP_INT) 1, task, MID_PRIORITY,
>                 STACK_SIZE, NULL });    //受信タスク
> CRE_TSK(TASK2, { TA_HLNG, (VP_INT) 2, task, HIGH_PRIORITY,
>                 STACK_SIZE, NULL });    //受信タスク
> CRE_TSK(TASK3, { TA_HLNG, (VP_INT) 1, send_task, MID_PRIORITY,
>                 STACK_SIZE, NULL });    //送信タスク
> CRE_MBX(MAILBOX,{TA_TFIFO,HIGH_PRIORITY,NULL});
> #include "../../systask/timer.cfg"
> #include "../../systask/serial.cfg"
> #include "../../systask/logtask.cfg"
> 
>        ======================================================
>       _|  __|
>     _/_| _/_| E-mail:sugiyama @ ap.chugoku-pc.ac.jp 
>    _/ _|_/ _| 中国能力開発大学校 生産情報システム技術科
>   _/  __/  _| 杉山 誠
>  _/        _|akoto.Sugiyama  ================================
> 
>