(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 ================================