Forums: Help (Thread #2088)

snd_mbx.c (2003-02-25 16:40 by Anonymous #3968)

どうもはじめまして。snd_mbx.cについて
質問なのですが

82行目のローカル変数msgに対する代入
msg->next = pk_msg
は不要ではないでしょうか?
これが原因でリターンアドレスを保持している
領域をつぶしてしまいsnd_mbxから正常にリターン
できなかったりするようなのですが?
それともこれが然るべき動作なのでしょうか?

osは特に初心者なので妙なことを言っているかも
しれませんがよろしく回答お願いします。

Reply to #3968×

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: snd_mbx.c (2003-02-25 16:45 by Anonymous #3969)

環境を書くのを忘れていました。
使用しているのはhos-v4(h4_100.tgz)で
ターゲットはarm9です。(ADS使用)
Reply to #3968

Reply to #3969×

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: snd_mbx.c (2003-02-25 17:07 by hamayan #3970)

私も、人に物を教えられる程、カーネルに詳しくないので、
試した結果と、想像だけですが、これじゃあないかな?
と言う部分について書きますね。

まず、前述の82行目を外して、カーネルを再構築して、
動かしてみました。
結果は、絶望的に暴走します。
そちらでは上手く動いたのでしょうか?

以下は想像ですが、
rcv_mbxの71行目で、メッセージの終わりの検出をして
いますが、ここに利いてくるのではないでしょうか。

あと、リリースファイルは、大分古くなっているので、
CVSから、最新版を落とす事を、お勧めします。

ARMは、Ryuzさん位しか触れていないので、期待してい
ます。
Reply to #3968

Reply to #3970×

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: snd_mbx.c (2003-02-25 17:09 by ryuz #3971)

 始めまして、Ryuzと申します。

> 82行目のローカル変数msgに対する代入
> msg->next = pk_msg
> は不要ではないでしょうか?
> これが原因でリターンアドレスを保持している
> 領域をつぶしてしまいsnd_mbxから正常にリターン
> できなかったりするようなのですが?
> それともこれが然るべき動作なのでしょうか?

 仕組みだけ申しますと、これは循環リストで
管理しており、mbxcb_rom->mprihd[msgpri]は
末尾を指しております。
 なので、循環させるために必要な行のなはず
なのですが、ちょっと再確認してみます。
 念のため、メールボックス生成時の設定と
おかしくなるときのメッセージ優先度など教えて
いただけますと助かります。

> ターゲットはarm9です。(ADS使用)

 私も仕事では同一環境です。
 もっともARMの場合チェプメーカーごとに
ペリフェラルが全く違うのでアレですが...

 よろしくお願いします。

Reply to #3968

Reply to #3971×

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: snd_mbx.c (2003-02-25 17:17 by ryuz #3972)

 Ryuz です。

> もっともARMの場合チェプメーカーごとに
 チップメーカーですね... タイプミス (--;;;

 よくよくソースを見ると、優先度が範囲内か
どうかのエラーチェック埋め忘れてますね。
 優先度を使うシーンはレアなのであまり枯れて
ないのが実情です。
 その辺踏まえて再確認が必要かなと...

 取りえずエラーチェックは埋めるようにします。
Reply to #3971

Reply to #3972×

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: snd_mbx.c (2003-02-25 19:32 by ryuz #3974)

 Ryuzです。

 エラーチェックを追加したものをチェックインしました。
 こちらで簡単に試した範囲では大丈夫な模様です。

 次の点を注意していただけますでしょうか?

 (1) 生成時に最大優先度の設定は正しいか。
 (2) snd_mbx後、受信されてないメッセージの
   インスタンスを再利用していないか。
 (3) rcv_mbxでキャストミスしていないか。

 (3)なんかは慣れてる人でも結構よくやらかし
ますので念のため...
 ちなみに生成時はどのAPIを使われていますで
しょうか?
Reply to #3972

Reply to #3974×

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: snd_mbx.c (2003-02-25 17:17 by m-arai #3973)

m-araiです。

armでお使いですか。私はarmのことは全然分からないのですが、取り敢えず
一般的な見地から。

else
{
/* 末尾に追加 */
msg = mbxcb_rom->mprihd[msgpri];
pk_msg->next = msg->next;
msg->next = pk_msg;
mbxcb_rom->mprihd[msgpri] = pk_msg;
}

の msg->next = pk_msg;が、スタック領域なり何なりを破壊する可能性につい
てお考えと思いますが、msgの型はT_MSG *で、mbxcb_rom->mprihd[msgpri]
(=指定されたメールボックスの制御ブロックの、メッセージ優先順位に対応す
るメッセージキューヘッダの先頭番地)で初期化されています。

つまり、msgは以前に接続されたメッセージヘッダの番地なわけです。
で、msg->next = pk_msg; は、そのメッセージヘッダの次のメッセージへのポ
インタを、今度追加するメッセージのヘッダの番地にしているわけです。

という事で、これがスタック領域を破壊するというのは無いような気がする
のですが?

一つ可能性として考えられるのは、「優先度付きメールボックス」に対して
T_MSG_PRIなヘッダを持っていないメッセージを送っていて…
メールボックスのコンフィグレーションと、送っているメッセージを再確認
してみてくれませんか?

と書いている間にお二方からリプライが。
Reply to #3971

Reply to #3973×

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: snd_mbx.c (2003-02-25 20:53 by Anonymous #3978)

質問者です。おおこんなにレスが。恐縮です。

msg->next = pk_msg は必要ですね。
2行上を見逃していて参照されることのない
ローカル変数への代入に見えてしまいました。
おさがわせしましてすみません。

状況を整理しますと以下のようになっています。
ものすごく初歩的なことかもしれませんが...

コンフィグ(mbxはこれ一つだけです)
CRE_MBX(MID, {TA_TFIFO | TA_MFIFO, 1, NULL})

ソース
struct _MsgPkt {
TMSG* next
その他メンバ
} MsgPkt

func1()
{
MsgPkt pkt1
snd_mbx(ID, (T_MSG*)&pkt1);
...
}

func2()
{
MsgPkt pkt2
snd_mbx(ID, (T_MSG*)&pkt2);
...
}

task1()
{
func1();
func2();
}

のようにpkt1, pkt2をローカルとしています。
一つのタスクの中でfunc1, 2を続けて呼び出しており
func2のsnd_mbx中でリターンアドレスが上書きされて
func2に戻れていないという状況です。
rcv_mbxはまだ一度も実行されていません。

func1, func2を抜けるとこのローカル変数が格納されていた
アドレスには何が入っているか保証できないわけですが
snd_mbx.cでメッセージのリストにはpk_msgが直接代入されて
いるように見えます。

1回目のsnd_mbxでメッセージのリストにpkt1のアドレスが
挿入され(リストには1個)
2回目のsnd_mbxで2個目となるpkt2のアドレスを挿入する
場合に1個目のnextメンバに2個目のアドレスを代入する
わけですが(件のmsg->next = pk_msg)
この1個目のnextメンバが配置されていたアドレスには
もはや別の変数が配置されている
(今の場合リターンアドレス)
というのが今の現象のように思いました。

pkt1, 2をグローバルにすれば回避できると思いますが
この場合1つのタスクが同時に実行される場合に
整合がとれなくなりますよね?
根本的にsnd_mbxの使用法が何か誤っているのでしょうか?

後, hospac_swi_ctx中でユーザーモードのspが
本来の領域からrw領域を指すように書き換えられますが
これはosの然るべき動作なのでしょうか?

p.s
ちなみにm-araiさんはミニモニを作られた方ですか?
今動かそうとしているのが実はこれなんですが。
Reply to #3968

Reply to #3978×

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: snd_mbx.c (2003-02-25 21:08 by ryuz #3979)

 お世話になります。Ryuzです。

 メッセージの内容をローカルに取られているのが
原因です。
 このような書き方がしたい場合はメッセージバッファを
使ってください。
 メールボックスはITRON仕様上、送信から受信までの間に
インスタンスを破棄することは出来ません。

 通常このような場合でメールボックスを使う場合は
メモリプールと併せて使います。

 (1) メモリプールからメモリを獲得してそこに
   メッセージを書く
 (2) snd_mbxで送信
 (3) 受信タスクは rcv_mbx で受けた後にメモリ開放


> 後, hospac_swi_ctx中でユーザーモードのspが
> 本来の領域からrw領域を指すように書き換えられますが
> これはosの然るべき動作なのでしょうか?

 しかるべき動作です。
 タスク毎にスタックを割り当てないとマルチタスクが
できません。
 HOSではC言語のデータ領域に宣言しますのでこう
なります。

 スタック用メモリを特別扱いしないとまずい
プロセッサだと若干ケアが必要な場合もありますが
ARMだとその問題は無いはずです。
 ただしデバッガによっては混乱するものも居るかも
しれません。AXDデバッガは大丈夫だった記憶が...
# 3rdパーティーのものだと謎です...

Reply to #3978

Reply to #3979×

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: snd_mbx.c (2003-02-25 21:27 by ryuz #3981)

 お世話になります。Ryuzです。
 若干 Tips 的なことを...

 通常この手のメッセージ送受信には mbfを使う方法と
mbx + mpf を使う方法がありますが

<mbfの場合>
 ・メモリ使用効率は良い
 ・優先度付きメッセージが使えない
 ・データコピーに伴い、割り込み禁止時間が長い
 ・スタンダードプロファイルでmustではない

<mbx + mpfの場合>
 ・最大時のメッセージに併せてプールを作らないと
  いけないのでメモリ使用効率が悪い
 ・優先度付きメッセージが使える
 ・ユーザーが割り込み許可の状態でコピーするので
  割り込み禁止区間が短い
 ・スタンダードプロファイルで必須

 などの特徴があります。
 特に最大割禁時間はしばしば問題となる為、大きな
データを送る場合 mpf はお勧めできませんが、
大きなデータでなければ mbf の方が簡単かつすっきりは
します。
 状況に応じて使い分けていただければ良いかと
思います。
 ご参考になれば幸いです。
Reply to #3979

Reply to #3981×

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: snd_mbx.c (2003-02-25 21:38 by hamayan #3982)

Ryuz> 特に最大割禁時間はしばしば問題となる為、
Ryuz> 大きなデータを送る場合 mpf はお勧めできませんが、

は、mbfですね。

メッセージバッファの短所で、割り込み禁止時間は気付き
ませんでした。
Reply to #3981

Reply to #3982×

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: snd_mbx.c (2003-02-25 21:12 by m-arai #3980)

いわゆる自動変数は一般的にスタック上に動的に確保され
て、したがってその変数が有効なのはその関数内だけの話
ということは理解されているのですね。

ですから、func1からreturnしたら、その瞬間からもう
MsgPkt pkt1に触れることはできないわけです。なんら
保証はありません。

メッセージが受信されたことを確認するまでfunc1,2からは
リターンしないようにするか、メッセージを外部に静的に
確保するか、メモリプールで確保した領域を使うとかしな
いといけません。

>p.s
>ちなみにm-araiさんはミニモニを作られた方ですか?
>今動かそうとしているのが実はこれなんですが。
そ、そうです。(--;あれは本当に何も知らない時に書いた
ものなので、非常に多くの問題を含んでいるはずです。

…害になるから、改定しないなら削除すべきかも…。
Reply to #3978

Reply to #3980×

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

赤面ものの過去 (2003-02-25 21:55 by m-arai #3983)

かな~り怖かったのですが、見返してみました。

確かに自動変数領域にメッセージを確保してますね。
snd_msgした後は、*必ず*フラグによる送り先のタスクか
らの終了通知を待っていたので、動作としては一応問題な
いようになっていました。

しかし、う~む…。他にもかなり痛い部分が…。
Reply to #3980

Reply to #3983×

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: snd_mbx.c (2003-02-27 16:32 by Anonymous #3999)

質問者です。どうもこんにちわ。
とても丁寧な説明ありがとうございます。

とりあえず簡単そうなmbfでチャレンジしてみようと
ビルドしたところkernel_ini_mbfが解決
しませんでした。

src以下を探してみますとini_mbf.cにこの関数の
定義がありますね。h4al.makではリンクされて
いないようですがこれを使用すればよろしいの
ですよね?

あとref_tskはまだ実装されていないのでしょうか?
(ref_tst.cが内容的にそれっぽい?)

# 以上はh4_100.tgzの話です。
# cvs版をとってきたいのはやまやまなんですが…
# cvsってプロキシ通せませんでしたっけ?

itronのサンプルコードって中々みつからなくて
ミニモニをようやく発見してなんとなく
イメージが掴めたように思うので
m-araiさんのページが削除なら残念ですね。
個人的には更新を希望したいところです。

# とりあえず削除にそなえてwget
Reply to #3968

Reply to #3999×

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: snd_mbx.c (2003-02-27 16:41 by hamayan #4000)

私のお応えできる範囲で。

ソースコードの参照からも、ディレクトリごっそりのtarボールがダウンロードできますよ。

なお、ドキュメントの日本語コードは、EUCとなっています。
Reply to #3999

Reply to #4000×

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

無事CVS版おとせました (2003-02-27 19:55 by Anonymous #4001)

質問者です。

tarballを落としてきました。
やはりh4al.makにini_mbf.oがリンクされて
いないようなので追加して無事解決しました。

ref_tskはこの版でも見当たらないようですね…
Reply to #3968

Reply to #4001×

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: 無事CVS版おとせました (2003-02-27 20:43 by m-arai #4003)

> やはりh4al.makにini_mbf.oがリンクされて
> いないようなので追加して無事解決しました。

修正しました。
Reply to #4001

Reply to #4003×

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: 無事CVS版おとせました (2003-02-27 21:24 by m-arai #4004)

ref_tskについて少し検討してみましたが、現状のhosで
wobjidとlefttmoを作るのは少し面倒で、あまり美しく
なさげな感じです。広範囲に渡る改造も考えられますが、
目的がref_tsk実装では、あまりモチベーションが…。
スタンダードプロファイルでは無くても可なものですし。

アレで使う目的でしたら、ref_tstで我慢できませんか?
また、ref_tskを作成してPatchesあたりに投げていた
だくというのも歓迎です。
Reply to #4003

Reply to #4004×

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: 無事CVS版おとせました (2003-03-05 20:52 by Anonymous #4055)

質問者です。お世話になります。

> アレで使う目的でしたら、ref_tstで我慢できませんか?

私はかまわないです.ただ他ref_*はあるのにref_tskだけ
ないのだろうと思って。スタンダードプロファイルでは
ないのですね。

> また、ref_tskを作成してPatchesあたりに投げていた
> だくというのも歓迎です。

wobjidとlefttmo以外は修正してみましたが
m-araiさんなら多分手修正されたほうが
圧倒的に早そうなので投げないでおこうかなと
思ったり。
Reply to #4004

Reply to #4055×

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: 無事CVS版おとせました (2003-03-05 21:12 by m-arai #4058)

> wobjidとlefttmo以外は修正してみましたが
その二つをどうにかしないと、ref_tskとして入れることが
出来ないのです。
Reply to #4055

Reply to #4058×

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