(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 ================================
>
>
>
>
------------------------- 引用ここまで -------------------------
石川 宏保
_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/