Forums: Help (Thread #5892)

rcv_msgでのFIFO順でのメッセージの取得について (2004-09-02 17:45 by Anonymous #10854)

お世話になります。
起床待ちのタスクにsnd_msgを発行しても起床後に
rcv_msgがFIFO順にメッセージを取得できません。

ソースをみますと、メッセージの取得でプライオリティをチェックして待ちに入いっているようです。


Reply to #10854×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) Login

RE: rcv_msgでのFIFO順でのメッセージの取得について (2004-09-02 17:46 by Anonymous #10855)

すみません、"msg"でなく"mbx"です。
Reply to #10854

Reply to #10855×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) Login

RE: rcv_msgでのFIFO順でのメッセージの取得について (2004-09-02 18:17 by hamayan #10856)

メールボックスは、手元では動いているのですが。

すいません、宜しければ静的APIの記述とか、snd_mbx、rcv_mbxを使った所のコードを書いてもらえると、何か判るかも知れません。
Reply to #10855

Reply to #10856×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) Login

RE: rcv_mbxでのFIFO順でのメッセージの取得について (2004-09-02 18:41 by Anonymous #10857)

回答ありがとうございます。

使用例が複数のタスク記述にまたがるためうまく記述できないので要約します。

メールボックスの生成は "TA_MFIFO"で静的に生成しました。
rcv_mbxのソースでメッセージのチェックのところを試験的に
 if (msgpri <= mbxcb_rom->maxpri - TMIN_PRI)
を以下のように変更
if (msg != NULL )
これによりそれらしく動くようになりました。

ソースのifブロックがずれているのではないでしょうか?
よろしくお願いいたします。


Reply to #10854

Reply to #10857×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) Login

RE: rcv_msgでの変更箇所です (2004-09-02 18:51 by Anonymous #10858)

すみません、正確には以下のように変更しました。

/* if (msgpri <= mbxcb_rom->maxpri - TMIN_PRI){ */

msg = mbxcb_rom->mprihd[msgpri]
if (msg != NULL){
if (msg == msg->next )
以下省略です。



Reply to #10854

Reply to #10858×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) Login

RE: rcv_msgでの変更箇所です (2004-09-02 18:56 by m-arai #10859)

>ソースをみますと、メッセージの取得でプライオリティを
>チェックして待ちに入いっているようです。
その部分は、プライオリティをチェックして待ちに
入っているのではありません。

 for ( msgpriを0→「最大優先度-最小優先度」カウンタとしてループ)
 {
  優先度 「msgpri-最小優先度」のメッセージがあれば break;
 /* メッセージを優先度順に検索 */
 }

 if ( msgpri <= mbxcb_rom->maxmpri - TMIN_MPRI )
 {
  カウンタが「最大優先度-最小優先度」以下なので、受信有り
  受信処理を行い E_OK
 } else
  先の検索ループでメッセージが検出できなかったので、
  待ちに入る…

>msg = mbxcb_rom->mprihd[msgpri]
>if (msg != NULL){
>if (msg == msg->next )
この修正だと、範囲外の不定な値を参照するしていませんか?


以下どうでもいいこと

一時的なもので構いませんから、何か名乗っていただけると
フォローが書き易いです。
Reply to #10858

Reply to #10859×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) Login

RE: rcv_msgでの変更箇所です (2004-09-02 19:01 by m-arai #10860)

×優先度 「msgpri-最小優先度」のメッセージがあれば break;
○優先度 「msgpri+最小優先度」のメッセージがあれば break;
 
Reply to #10859

Reply to #10860×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) Login

RE: rcv_msgでのFIFO順 すみません、ありがとうございます。 (2004-09-02 19:26 by (del#10153) #10861)

いろいろと匿名で失礼いたしました。

またご回答ありがとうございました。

mbxのプライオリティが0になっていました。1に変更しましたら動作ました。

大変申し訳ありませんでした。

Reply to #10854

Reply to #10861×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) Login

RE: rcv_msgでのFIFO順 すみません、ありがとうございます。 (2004-09-02 19:38 by m-arai #10862)

匿名については問題ありません。
今のように空いた状態であれば、誰が何に対して発言して
いるのか不明で分かりにくいといったこともありませんし。
ただ、何か識別子が無いと「~さんの修正は」とか
書きにくいというだけの、個人的な感覚です。

優先度については、よく勘違いしてしまいますね。
私も同様なことで嵌ったことがあります。

今後も不明な点がありましたら、お気軽にお問い合わせ
下さい。常に即答、解決に至るとは限りませんが。
Reply to #10861

Reply to #10862×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) Login

大変ありがとうございます。 (2004-09-03 01:25 by (del#10153) #10865)

お世話になります。すみません、今回も迅速な対応をしていただきありがとうございます。大変感謝いたします。
HOSのおかげで、目標達成までもう少しです。もう絶対に手放せないソフトウェアになりました。
今後ともよろしくお願い致します。

すみません、あとVer.4のTRON仕様だとフラグで複数のタスクが待ちに入れないのでしょうか。クリアも全フラグがクリアされてしまう仕様のようなのでちょっと不便のような気がします。
Reply to #10854

Reply to #10865×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) Login

RE: 大変ありがとうございます。 (2004-09-03 05:03 by hamayan #10866)

100パーセントm-araiさんのお陰ですが、問題が解消してよかったですね。実は私もTA_MFIFOで今更勘違いしていた所が見つかって、助かりました。

イベントフラグですが、一つのイベントフラグに、同時に複数のタスクが待ち状態になるかどうかは実装依存で、HOSではサポートしていないですね。
ちょっと不便にも感じますが、イベントフラグの実装を軽くするには、その処置も適切かとも思えます。
イベントフラグって、最も軽いタスク間通信を期待してしまいますから。

静的生成の際に、TA_CLRを指定しなければ、勝手にクリアしない筈です。そうではなくて?。
Reply to #10865

Reply to #10866×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) Login

RE: 大変ありがとうございます。 (2004-09-03 21:59 by m-arai #10869)

vm_suzuki:
>クリアも全フラグがクリアされてしまう仕様のようなので
???ちょっとこの文の意図が分かりません。仕様については、
ITRON Projectのサイトから、仕様書のPDFファイルが
無料で入手できます。大抵のことはこれを読めば解決
すると思いますよ。
http://www.assoc.tron.org/itron/home-j.html

また、これはITRONという意味では外れたことですが、
HOSはソースが公開されているOSです。
これはつまり、不便だと思ったり、追加したらより
良くなるというアイデアがあるなら、自在に改良
できるということですよ。

#が、よくよく仕様書を読んでみると、自分が考え付く
#程度のことは、偉い先生方はとうにお見通しで、より
#スマートな枠組が用意されているのが殆どだったり…
#(^^;

hamayan:
> イベントフラグですが、一つのイベントフラグに、同時に
> 複数のタスクが待ち状態になるかどうかは実装依存で、
> HOSではサポートしていないですね。
むむ…TA_WMULの立場は…試してはいませんが、実装されて
いるのでは?
Reply to #10866

Reply to #10869×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) Login

RE: 大変ありがとうございます。 (2004-09-04 00:19 by hamayan #10871)

すいません、前、随分前にTA_WMULを使ってみて、上手く動かせなかったので、てっきり駄目なのかと思い込んでいました。

今度、再チャレンジします。
Reply to #10869

Reply to #10871×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) Login

RE: TA_WMULについて (2004-09-04 00:38 by (del#10153) #10873)

すみません、TA_WMULの存在は確認していたのですが、私の使い方がまちがっていたのか、フラグクリアの手順が悪かったのか.....もっと勉強しなおします。
Reply to #10854

Reply to #10873×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) Login

RE:TA_WMUについて (2004-09-05 01:59 by Anonymous #10882)

TA_WMUL|TA_CLRとしてはいけない? TA_WMULとしてもフラグが一致した時点でフラグの全ビットがクリアされるので他の待ちタスクを起こせないということですか?
Reply to #10854

Reply to #10882×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) Login

RE:TA_WMUについて (2004-09-05 07:45 by m-arai #10883)

「いけない」ということはありません。(^^)
また、「起こせない」という表現には違和感を感じますが、
つまりそういうことでしょう。

仕様書 Ver.4.02.00 p142を参照してみると、
TA_CLRとは「タスクをイベントフラグ待ち状態から
待ち解除する時に、イベントフラグのビットパターンの
すべてのビットをクリアする。」というイベントフラグ
属性です。それを意図的に指定する以上、そうなるのは
当然のように思えるのですが。

【補足説明】のところにも記述があります。
「TA_CLR属性のイベントフラグの場合、タスクを一つ待ち
解除した時点でイベントフラグのすべてのビットをクリア
するため、複数のタスクを同時に待ち解除することはない」

TA_CLRの振る舞いを、『待ち解除条件を満たす'全ての'
タスクを待ち解除した時点でビットをクリアする』ものに
変更したければ、タスク起床ループ内の

 if ( flgcb_rom->flgatr & TA_CLR )
 {
  flgcb_ram->flgptn = 0; /* クリア属性があればクリア */
 }


 /* 起動を行ったタスクがあるならディスパッチを行う */
 if ( wupflg )
 {
  ここ
  mknl_exe_dsp(); /* タスクディスパッチの実行 */
  mknl_exe_tex(); /* 例外処理の実行 */
 }
に移動すれば良いと思います。(試してはいません)
勿論、この改造は仕様を逸脱しますが。


余談:
set_flg.cを見なおしていて気づいたのですが、
タスク起床ループ内の
 if ( flgcb_rom->flgatr & TA_CLR )
 {
   flgcb_ram->flgptn = 0; /* クリア属性があればクリア */
 }
は、起床処理の後に移動して break; を加えるべきかな。
無駄な検索を少しだけ減らせる可能性があります。
Reply to #10882

Reply to #10883×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) Login