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

takaya_kakizaki @ gmx.yamaha.com takaya_kakizaki @ gmx.yamaha.com
2008年 8月 7日 (木) 14:37:47 JST


柿崎です。
どうもこんにちは。

メールボックスは渡されたポインタのメモリ領域の先頭部分を
リンクリストとして使って情報を管理してますが、
forループ内で同じ領域をsnd_mbxに
渡した時点でリンクリストが破綻しています。ありがちなバグ。
(TASK1の優先度=TASK3の優先度なので送信した時点では受信タスクに実行権は渡ら
ない)

メールボックスの送信パケットにはヒープ領域とか
固定長メモリプール等を使いましょう。

その後に実行権とかなんとかの議論をされたほうがよろしいかと。

------------------------
柿崎 貴也
ヤマハ株式会社 INFOサウンド開発推進室
E-mail: takaya_kakizaki @ gmx.yamaha.com




"M.Sugiyama" <sugiyama @ ap.chugoku-pc.ac.jp> 
2008/08/07 12:04
users @ toppers.jp へ
返信してください


宛先
users @ toppers.jp
cc

件名
(toppers-users 2782) メールボックスの機能について






メールボックスを使った以下のソースを実行した結果がどうにも
腑に落ちません。
どなたか、正しい説明を御願いできませんか??

以下のソースを実行しました。受信タスクの2つはプライオリティ
を代えています。

たぶん、この記述だと、受信タスクは優先度の高いタスクだけが
受信するはずなのですが、送信データの個数にかかわらず、最後の
1パケットだけを優先度の低いタスクが受け取ってしまいます。。

 何か、決定的な間違いがあるのでしょうか??
よろしく御願いします。


以下Cのソースファイル

typedef struct
{
        T_MSG pk_msg;
        char buf[64];
}MESSAGE;

/*
 *  メインタスク
 *  メールボックス機能を使ってデータを送信する
 */
void main_task(VP_INT exinf){

                 act_tsk(TASK1);
        act_tsk(TASK2);
        act_tsk(TASK3);

    slp_tsk();
}

void send_task(VP_INT exinf){
        MESSAGE msg;
        INT i;
        strcpy(msg.buf,"thie is test message from task\r\n");
        for(i=0;i<10;i++){
                snd_mbx(MAILBOX,(T_MSG*)&msg);
        }
}


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",msg->buf);
        }
}


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});

       ======================================================
      _|  __|
    _/_| _/_| E-mail:sugiyama @ ap.chugoku-pc.ac.jp 
   _/ _|_/ _| 中国能力開発大学校 生産情報システム技術科
  _/  __/  _| 杉山 誠
 _/        _|akoto.Sugiyama  ================================