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

石川 宏保 ishikawa @ axis-corp.co.jp
2008年 8月 7日 (木) 14:46:24 JST


杉山 様

はじめまして、石川@埼玉と申します。


> void send_task(VP_INT exinf){
>         MESSAGE msg;    //送信パケット
ここで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);
送信して使い回していますが、
>         }
> }

送信する時にメモリがコピーされて相手に渡されるわけではありません。
なので、送信タスクが「msg.n=i」で書き換えると受信したタスクの数値も変わります。
また、send_task()を抜けると、msgは無くなってしまうのでかなり危険な操作になります。
動的にメモリを取得し、それぞれの送信メッセージにそれぞれのメモリを割り当てるなど
しないと、ということだと思います。

以上、乱文失礼いたします。

石川

------------------------- 引用ここから -------------------------
送信者 : "M.Sugiyama" <sugiyama @ ap.chugoku-pc.ac.jp>
日時   : 2008/08/07 14:21:17 (JST)
件名   : (toppers-users 2787) Re: メールボックスの機能について
--------
> みさなん 
> 
>  お世話になります。
> もろもろ実験中ですが、途中経過のみ。。
> 
> プライオリティは、もともとの物には手を加えていません。
> 従って、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  ================================
> 
> 
> 
> 
------------------------- 引用ここまで -------------------------


石川 宏保
_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/