Forums: Help (Thread #1321)

メールボックスでSUNPENDED (2002-10-29 16:54 by hamayan #2441)

お世話になっています。いつも質問ばかりで貢献できなくてすいません。

今、H8/3069でHOS-V4を使ってプログラムを作っています。
その中でtrcv_mbxを使ってメッセージ待ちを行っていると、時折、と言いますか、結構高い頻度でそのタスクがSUSPENDEDに陥っています。
コード上には一切sus_tskを使っていないので・・・、暫くこれで嵌まっています。
別タスクでモニターして、rsm_tskをすると、復帰します。

例えば、の話しなのですが、
mwup_tsk.c中でタスクの状態を調べるのに、
if ( mtcb->tskstat == TTS_WAI )
{
mtcb->tskstat = TTS_RDY; /* 待ち解除なら実行可能状態 */
}
else
{
mtcb->tskstat = TTS_SUS; /* 二重待ち状態なら強制待ち状態 */
}
となっていますが、この寸前に待ち状態が解除される事は無いのでしょうか?

すんません。

Reply to #2441×

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: メールボックスでSUNPENDED (2002-10-29 17:31 by hamayan #2442)

自己フォローになってしまいますが、
先のファイルを
if ( mtcb->tskstat == TTS_WAI )
{
mtcb->tskstat = TTS_RDY; /* 待ち解除なら実行可能状態 */
}
else if( mtcb->tskstat == TTS_WAS )
{
mtcb->tskstat = TTS_SUS; /* 二重待ち状態なら強制待ち状態 */
}
else{}

と直しましたら、今の所嵌まっていません。
だからと言って自信は全然無いのですが。
Reply to #2441

Reply to #2442×

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: メールボックスでSUNPENDED (2002-10-29 18:29 by m-arai #2443)

こりゃバグでしょうね。待ち状態以外でmknl_wup_tsk()
したら、必ず強制待ち状態で嵌ってしまうわけで。
hamayanさんの対処で問題ないように思えますが…。

src/kernel/tsk/wup_tsk.cの
    /* 起床要求キューイングのチェック */
    if ( !(mknl_get_tskstat(&tcb_ram->mtcb) & TTS_WAI)
        || mknl_get_tskwait(&tcb_ram->mtcb) != TTW_SLP )
に、!(mknl_get_tskstat(&tcb_ram->mtcb)&TTS_WAS
を加えるという解もあるかな?

いづれが適切かは、設計者のご意見を伺わないと。
だけど、お忙しいようですからね。
#いや、別に催促はしてませんよ!本当に。
Reply to #2442

Reply to #2443×

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: メールボックスでSUNPENDED (2002-10-29 20:50 by m-arai #2444)

いや、やはりmknl_wup_tsk()が呼ばれる時は、必ず
TTS_WAIかTTS_WASでないといけないような気が
してきました。だから、src/kernel/tsk/wup_tsk.c
の方を修正すべきでしょう。

しかし、私が先ほど示したものは誤りです。あれは忘れて
ください。(--;

オブジェクト状態チェックの所で待ち状態(当然、二重待
ちも含まれる)以外を弾くようにするのが正しい…
のかなぁ?


て見てて、別のバグ発見。
  return E_OK;   /* オブジェクト未生成 */
は、
  return E_NOEXS; /* オブジェクト未生成 */
Reply to #2443

Reply to #2444×

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: メールボックスでSUNPENDED (2002-10-30 09:04 by hamayan #2446)

ただ、mknl_wup_tsk()自体複数の(20個位)から呼ばれているので、そのへん大丈夫でしょうか。
Reply to #2444

Reply to #2446×

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: メールボックスでSUNPENDED (2002-10-30 09:47 by m-arai #2447)

wup_tsk()以外は、待ちキューから取ってきた、オブジェ
クト状態がTTS_WAIかTTS_WASであるタスクに対する操作
に限られる筈なので、特に問題無いかと思います。
#多分 (^^;

と、よく考えてみると、hamayanさんはwup_tsk()を使っ
ているとは一言も書いておられなかったのですね。
ざっと見て、mknl_wup_tsk()でオブジェクト状態が
不正になりえるのはwup_tsk()しかないように見えたの
で、丸っきり決めこんでました。

wup_tsk()、使っているんですよね?
Reply to #2446

Reply to #2447×

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: メールボックスでSUNPENDED (2002-10-30 10:11 by hamayan #2448)

wup_tsk()は使っていないタスクがサスペンデッドになっています。trcv_mbx()です。

私の考えた理由は、snd_mbx()の最初の辺りでシステムがロックされますが、この間にシステムタイマーを更新する割り込みが入って来て、ロック解除を待ちます。
trcv_mbx()なのでsnd_mbx()でメッセージを送信すると、すかさず、待ち状態を解除され、レディとなると思いますが、その操作の直後に、ロック解除となるので、この時、たまたまタイムアウト処理が行われると、先のサスペンデッドに陥るのでは?と考えていたんですが、甚だ自信無い話しです。
Reply to #2447

Reply to #2448×

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: メールボックスでSUNPENDED (2002-10-30 10:37 by m-arai #2450)

しかし、snd_mbx内において待ち状態を解除される場合、
レディ状態にされたタスクは既にタイムアウト待ち行列か
ら削除されるので、タイムアウト処理には引っかからない
ような?
Reply to #2448

Reply to #2450×

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: メールボックスでSUNPENDED (2002-10-30 10:45 by hamayan #2451)

そうなんですよね。私も今snd_mbx()のコードを見ていてそれに気付きました。

と言う事は別経路が有るんだろうか。

いやそもそも、mknl_loc_sys()でちゃんと割込みを止めているのだろうか?

怪しくなってきました。
Reply to #2450

Reply to #2451×

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: メールボックスでSUNPENDED (2002-10-30 11:17 by m-arai #2452)

本筋には関係ないけど、忘れないように。

2度目のmknl_ref_qhdは不要ですね。
kernel/mbx/snd_mbx.c:

  mtcb = mknl_ref_qhd(&mbxcb_ram>que); /* 待ち行列先頭タスクを取得 */
  if ( mtcb != NULL )
  {
    /* 待ちタスクがあれば開放 */
    mtcb->data = (VP_INT)pk_msg; /* メッセージを渡す */
    mtcb = mknl_ref_qhd(&mbxcb_ram->que); /* 待ち行列先頭からタスク取り出し */
Reply to #2451

Reply to #2452×

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: メールボックスでSUNPENDED (2002-10-30 21:29 by m-arai #2453)

そういえば、そもそも嵌る時にmknl_wup_tsk(mtcb,ercd)
で渡されるmtcb->tskstatって何なのでしょうか?

tskstat自体、更新されている場所は全部を見ても10ヶ所位
しかないから、見るべきところはそうないと思うのですが
…う~む。あ、後、使っている全部のサービスコール
を教えていただけると。使っているサービスコール∩
嵌る時のtskstatを考えれば見るべきところが絞られる
ので。既に検討済みかと思いますが。


忘れないように記録(2)
kernel/tsk/ter_tsk.c:

  /* 実行タスクの終了 */
  mknl_rmv_tmout(&tcb_ram->mtcb); /* タイムアウト待ち行列につながれていれば解除 */
  mknl_ter_tsk(&tcb_ram->mtcb); /* タスクを削除 */

だが、

mknl/tsk/mter_tsk.c:

/* タスクの終了 */
void mknl_ter_tsk(
  T_MKNL_TCB *mtcb) /* 終了させるタスク */
{
  /* タイムアウトキューにあれば削除 */
  mknl_rmv_tmout(mtcb);

2度のmknl_rmv_tmoutは無意味。mknl_ter_tskは他に
exd_tsk、ext_tskで呼び出されるが、これらは自タスク
に対する処理なので、タイムアウトキューに関しては
必要ないだろう。従ってmknl_ter_tskのmknl_rmv_tmout
は削除すべきか。
Reply to #2452

Reply to #2453×

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: メールボックスでSUNPENDED (2002-10-30 22:00 by hamayan #2454)

システムコールの数え上げ了解です。ちょっとサイズがかなりでかくなっているので、時間をください。

しかし、初めは私の戯言から、既にm-araiさんのカーネルコードチェックになっちゃっていますね。
Reply to #2453

Reply to #2454×

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: メールボックスでSUNPENDED (2002-10-30 22:23 by m-arai #2455)

あ、済みません。そんなに大きくなりますか。マップ
ファイルを軽くgrepして出たものを必要に応じて少し
編集する位で良いと思っていたんですが。

お手間をかけてお役に立てなかったら…(--;…mOm。
Reply to #2454

Reply to #2455×

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: メールボックスでSUNPENDED (2002-10-30 22:56 by hamayan #2456)

成る程、全然気づきませんでした。
ではmapを編集した結果を書きます。

chg_pri,clr_flg,dis_dsp,dly_tsk,ena_dsp,
ext_tsk,get_mpf,get_tid,get_tim,isig_tim,
loc_cpu,mknl_add_que,mknl_add_tmout,mknl_adf_que,
mknl_adp_que,mknl_chg_pri,mknl_ctx_stat,mknl_dly_dsp,
mknl_exe_dsp,mknl_exe_tex,mknl_ext_startup,mknl_idl_loop,
mknl_idl_stk,mknl_idl_stksz,mknl_idlctx,mknl_ini_sys,
mknl_rdq_cnt,mknl_rdq_tbl,mknl_rmv_que,mknl_rmv_tmout,
mknl_rsm_tsk,mknl_run_mtcb,mknl_srh_top,mknl_sta_startup,
mknl_sta_tsk,mknl_ter_tsk,mknl_tic_tmout,mknl_timout_head,
mknl_wai_tsk,mknl_wup_tsk,pol_flg,rcv_mbx,ref_tst,rel_mpf,
rsm_tsk,set_flg,sig_sem,slp_tsk,snd_mbx,sta_hos,sta_tsk,
trcv_mbx,twai_flg,unl_cpu,wai_sem,wup_tsk

となりました。
よろしくお願いします。
Reply to #2455

Reply to #2456×

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: メールボックスでSUNPENDED (2002-10-30 23:07 by m-arai #2457)

度々すみませんが、嵌る時のmtcb->tskstatは何でした?
RUNかRDYかDMTだとは思いますが。
Reply to #2456

Reply to #2457×

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: メールボックスでSUNPENDED (2002-10-31 00:11 by hamayan #2458)

遅くなりました。今デバックしているのは、比較的症状を発祥し難い、SH2だったのですが、漸く2回確認しました。
レディの時に発生しています。

なんか、もっと、どういう経路を通って来たのか、判る様なアイディアが有りましたら仰って下さい。
どうも発想が貧困で。
Reply to #2457

Reply to #2458×

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: メールボックスでSUNPENDED (2002-10-31 00:35 by m-arai #2459)

う~む。まだ全然見えてきません。今思いついたのは、

mknl_tic_tmout()において多重割りこみを許す期
間があり、そこで起きた割り込み処理でタイムアウトキュ
ーへの操作が起こると、mknl_timout_headの更新が生じ
る場合がある。

mknl_tic_tmoutに帰ってくるとmknl_timout_headが、
*多重割りこみ前のタイムアウトキュー*に対する操作
の結果としてのもので上書きされる。

結果としてイムアウトキューにゾンビが残ったり、追加
操作が失敗する。ゾンビは既にmknl_wup_tskされていれ
ばTTS_RDYになってしまっている。

ゾンビに対するタイムアウト処理が行われると嵌る。

というものですが、システムタイマより上位の優先度を
持つ割りこみあり、その処理中にタイムアウトキューへ
の操作が起こる場合があり得ますか?そうでなければ
この考えは廃棄です。そうでなくても穴があるかも
しれませんが。
Reply to #2458

Reply to #2459×

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: メールボックスでSUNPENDED (2002-10-31 01:01 by hamayan #2460)

SH2に関してはシステムタイマーが最上位です。
H8は、多分割込みのネストを出来る様に設定していない?

多重割り込みが原因と言う訳では無さそうですね。

まだ、メールボックスの使い方に問題が有るのかなあ。
Reply to #2459

Reply to #2460×

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: メールボックスでSUNPENDED (2002-10-31 04:00 by m-arai #2464)

いや、サービスコールだけを使っている限り、キュー
にゾンビが発生することがあってはならないでしょう。

あ、私の思考は「タイムアウトキューからは本来削除さ
れているべきものが不正に残ってしまっているために、
タイムアウト処理のmknl_wup_tskでありうべからざ
るTTS_RDYになってしまっている」に固まってしまって
ます。
#それ以外の理由はもう考えられません。(--??

タスクコントロールブロックが、伸びるスタックとか、
アプリの不測な振る舞いで破壊されているというのは、
hamayanさんの対策でTTS_SUSを回避した場合にかなり
悲惨なことになる筈なので、ありそうもないですしね
…ん、tskstatは頭に近いからそうですが、tm_prevはか
なり尻の方ですね。tm_prevあたりだけ破壊されていて、
0になってるなんて事はないですか?

タイムアウト処理が始まる"前に"タスクコントロール
ブロックのtm_prevが0で破壊されてしまうと、処理
が行われる際、正しくタイムアウトキューからの削除
が行われません。破壊の程度が尻の方だけで留まって
いれば、タスクに処理が移っても致命的にはならない
可能性があります。

…ダメでしょうね…う~む(--???
Reply to #2460

Reply to #2464×

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: メールボックスでSUNPENDED (2002-10-31 09:41 by hamayan #2466)

おはようございます。と言いますか、m-araiさん、こんな夜更かしで大丈夫なんですか?

いやー!かなりm-araiさんの御指摘の通りだと思えています。タイムアウトキューを破壊する恐れがある!うーん!!それでもH8のボードは一晩放って置いても動いているのがビミョーですが(-_-;)。
多分これは待ち状態に入っているタスクの数が1個とか、2個とか少ない為かと。

そこで、基本に立ち返ろうと思います。
つまり、メールボックスとメモリプールの使い方の再確認。
今トラブルになっているのが、固定長メモリプールで取得した領域をメールボックスで送信しています。

ソースコード読めよ!と言われそうですが、ちょっと教えて下さい。
固定長メモリプールは静的に生成されるので、どっかに管理テーブルを作成しているものと思い込んでいますが、実際に固定長メモリプールの領域を見てみると、
_kernel_mpf?_heap
ですが、先頭にはリンクリストの管理と思われる、次のメモリブロックへのポインタらしき物が格納されています。やはりこのメモリプールもリンクリストで管理されているのでしょうか?

Reply to #2464

Reply to #2466×

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: メールボックスでSUNPENDED (2002-10-31 10:22 by m-arai #2467)

固定長メモリプールの管理は単方向リストと言っていいで
しょうか。最初の初期化で、

mpfcb->free
 ↓
[ → ][ → ]…[NULL]
[ -- ][ -- ]…[ -- ]
…………………………
[ -- ][ -- ]…[ -- ]

(うう…分かりづらい図だ)

のようになっていて、mpfbc->freeが先頭の空きブロック
へのポインタで(無ければNULL)さらにブロックの先頭に
次の空きブロックへのポインタ(無ければNULL)が格納され
ています。当然最後のブロックの先頭はNULLです。

取得、返却は常にリストの先頭に対して行われます。

以上から、現在自タスクが獲得していない固定長メモリプ
ールのブロックに操作を加えることは、そのブロックを
他タスクが獲得している場合は、他タスクにおける使用上
の予期せぬ内容の破壊、
未使用の場合は、先頭を0にするといくつかのブロックが
その後獲得できなくなる、先頭に0以外の値を書いてしま
うとリンクリストが破壊され、以降のメモリブロック
取得操作で縁もゆかりも無いメモリ領域を破壊、等の可能
性があります。

確実に現在自タスクで獲得しているブロック以外にアク
セスしてはいけません。

こんなとこで如何でしょう。間違っていたら訂正してくだ
さい。
Reply to #2466

Reply to #2467×

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: メールボックスでSUNPENDED (2002-10-31 10:32 by m-arai #2468)

書き忘れましたが、SHの方が全く同じプログラムでも
スタック伸びは大きいはずです。
スタック領域は本当に十分ですか?出来るだけ贅沢に
確保してやると、うまくいったりしませんか?

(--??う~む…。
Reply to #2467

Reply to #2468×

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: メールボックスでSUNPENDED (2002-10-31 10:41 by hamayan #2469)

成る程、やはり管理で使用している領域が先頭に有ると言う事ですね。

所で、μITRONの仕様書でもメールボックスの一般的?な利用方法として、メモリプールから取得したメモリブロックにメッセージを入れて、メールボックスで送信し、受け側ではメールボックスで受け取って処理が済んだら開放、
つまり
送信側----------
get_mpf(MPID,&blk);
何らかの処理;
snd_mbx(MID,(T_MSG *)blk);
-------------

受信側----------
rcv_mbx(MID,(T_MSG **)&blk);
何らかの処理;
rel_mpf(MPID,blk);
-------------

の様な手順で行って行くのかと思っていました。
しかし、これでは、get_mpfで獲得した領域の先頭を、
次のsnd_mbxで破壊してしまうと言う事になりますね。
Reply to #2467

Reply to #2469×

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: メールボックスでSUNPENDED (2002-10-31 10:45 by m-arai #2470)

そのようなプログラムをするなら、送信側のタスクでは
送信の都度、メモリブロックを取得すべきでしょう。
Reply to #2469

Reply to #2470×

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: メールボックスでSUNPENDED (2002-10-31 10:54 by hamayan #2471)

え!その!送信側でメモリブロックの獲得をやっているつもりなんですが(~_~;)

SHもH8も充分メモリが有るので、スタック領域に余裕を持たせています。
時折デバッカでスタックの使用状況を確認したり。
Reply to #2470

Reply to #2471×

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: メールボックスでSUNPENDED (2002-10-31 11:20 by m-arai #2472)

#う…何かがおかしい…どうもSF.jpへの要求がしばしば
#失敗する。メッセージのポストに失敗すると、せっかく
#書いた文章が消えて(TT)

その例では、受信側のタスクでメッセージ領域として
使用したメモリブロックを開放することにしています。
そのような場合、送信側では、メッセージが受信されたか
どうかに関わらず、一度snd_mbxに使用したメモリブロッ
クに触れてはいけません。snd_mbx以降、ポインタ変数blk
はもう無効です。

再び送信側から送信を行いたい場合は、改めてメモリブロ
ックを取得して、そこにメッセージを作成してやらなけ
ればなりません。送信の都度というのはそういう意味で
す。
Reply to #2471

Reply to #2472×

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: メールボックスでSUNPENDED (2002-10-31 11:33 by hamayan #2473)

>再び送信側から送信を行いたい場合は、改めてメモリブロ
>ックを取得して、そこにメッセージを作成してやらなけ
>ればなりません。送信の都度というのはそういう意味で
>す。
多分、これはやっている、つもりなのです。

それでちょっと気になるのが、get_mpfで獲得した領域をメールボックスに入れてしまうと、前回のメールボックスの時に教えてもらった、領域の先頭にリンクリストの管理領域が設けられる、その部分です。
ひょっとして、メモリブロックの管理領域をメールボックスの管理領域で上書きされる?んでしょうか。

そうすると、メモリブロックの管理領域分オフセットした領域アドレスをメールボックスに渡して、受信側ではオフセット分戻したアドレスを使って、メモリブロックの開放を行わないといけなくなるのかなあ。
Reply to #2472

Reply to #2473×

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: メールボックスでSUNPENDED (2002-10-31 11:40 by m-arai #2474)

その必要はありません。返却は、mpfcb->freeの内容を
帰すブロックの先頭にコピーし、帰すブロックの先頭
アドレスをmpfcb->freeに格納することで行われます。
リンクリストの先頭に挿入する操作ですね。
従って、メモリブロック先頭がどう使われていようが
無問題です。
Reply to #2473

Reply to #2474×

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: メールボックスでSUNPENDED (2002-10-31 11:49 by hamayan #2475)

そうですか、安心しました。
折角獲得したメモリも、管理領域ばかりじゃどうしようかと思っていた所です。

原因の究明に繋がるか判らないのですが、mknl_wup_tskを呼び出す複数有る関数で、サスペンデッドに陥らせる典型的な関数が判りました。
mtic_tmo.cのmknl_tic_tmoutです。
これは確かisig_tim.cからの呼び出しです。
Reply to #2474

Reply to #2475×

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: メールボックスでSUNPENDED (2002-10-31 12:05 by m-arai #2476)

そうなると、やはりタイムアウトキューに本来削除され
ているべきものが残っている線が濃厚…?。

う~ん。(-_-??????

これは多分無いと思うんですが、_HOS_ERCHK_LEVELを
なんらかの定義しているということはないですよね?
オブジェクト状態チェックが殺されている場合、
タイムアウト待ちをしているタスクをsta_tskしても弾
かれず、タイムアウトキューにゴミが残る可能性が
あるかも。まず無いと思うので、この件に関してはリプ
ライ不要です。(^^;;
Reply to #2475

Reply to #2476×

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: メールボックスでSUNPENDED (2002-10-31 18:18 by hamayan #2481)

先程からずっと、自分の作成したコードを眺めていたり、スタックを倍に増やしたりと、色々やっているのですが、芳しくありません。

それで、ちょっと判った事が、
サスペンデッドに陥らせているシステムコールは、どうやらsnd_mbxみたいなのです。

そこで、こんな事を考えてみました。
まず、送信と、受信の二つのタスクの関係は、メールボックスでメッセージを受け取る。送信側の方が優先順位が高い、受信側はtrcv_mbxで待つ。送信側の起動は別の割り込みに起因する。

まずシステムタイマーの更新の割り込みが入力します。

isig_timからタイムティックの減算の為にmknl_tic_tmoutが呼ばれて、この中でタイムアウトとなります。

この時点ではウエイトからレディに遷移します。

ディスパッチが行われますが、実はこの時送信側タスクを起動する割り込みが保留されています。
mknl_tic_tmoutの最後で割り込みが受け付けられます。

初めのタイマー割り込みの最後でディスパッチが行われ、直後に、より優先順位の高い送信側タスクがランニングとなります。

その中でsnd_mbxシステムコール中に受信タスクは、再度mknl_wup_tskで状態遷移をさせられてしまう。

そう言えば、trcv_mbxがタイムアウトした時に、メールボックスのキューからは削除されていませんよね。

どうでしょうか。(・・;)
Reply to #2475

Reply to #2481×

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: メールボックスでSUNPENDED (2002-10-31 20:27 by m-arai #2482)

おお!?確かにtrcv_mbxがタイムアウトする場合、
mknl_wup_tskでレディキューに繋がれてはいますが、
それまで接続していたキューからの削除がケアされて
いません!これでは、次にそのキューへの操作が行われ
る際に破綻が生じます。

今回の件も、既にメッセージ待ち状態は終わってRDY状態
になっているのに、snd_mbxがメールボックスのキューか
ら受信タスクを発見してしまい、RDYなタスクに対して
mknl_wup_tskを実行してしまっているという説明がつく
…。

となれば話は簡単。

Index: mwup_tsk.c
===================================================================
RCS file: /cvsroot/hos/hos/hos-v4/src/mknl/tsk/mwup_tsk.c,v
retrieving revision 1.3
diff -u -r1.3 mwup_tsk.c
--- mwup_tsk.c 11 Aug 2002 20:06:46 -0000 1.3
+++ mwup_tsk.c 31 Oct 2002 11:23:34 -0000
@@ -18,6 +18,7 @@
{
/* タスクのスリープ解除 */
mtcb->ercd = ercd;
+ mknl_rmv_que(mtcb);
mknl_adf_que(&mknl_rdq_tbl[mtcb->tskpri - TMIN_TPRI], mtcb);
if ( mtcb->tskstat == TTS_WAI )
{

解決の予感(^^)

以下は余談。

「送信タスク(TXTSK)の起動は別の割りこみ(以下INT_A)に
起因する」というのが気になったのですが、INT_Aのハン
ドラでTXTSKをsta_tskなりact_stkなりしているんです
か?

INT_Aが発生する時、TXTSKは常にDMTとは限らないので
すよね?つまり、前に発生したINT_Aの為に起動して
RUNなりRDYなりWAIになっている場合もあると。

しかし、それにしてもTXTSKがDMTでない場合には、
sta_tskなら起動に失敗、act_tskなら起動要求がキュー
イングされるだけであり、INT_Aが発生したからといっ
てisig_tic終了直後のディスパッチでTXTSKが起動する
とは限りませんね。

それに仮に起動したところでメッセージのキューがちゃ
んとしていれば、受信タスクをmknl_wup_tskしてしまう
おそれは多分ありません。
Reply to #2481

Reply to #2482×

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: メールボックスでSUNPENDED (2002-10-31 20:30 by m-arai #2483)

×おお!?確かにtrcv_mbxがタイムアウトする場合、
○おお!?確かにタイムアウトが発生する場合、
Reply to #2482

Reply to #2483×

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: メールボックスでSUNPENDED (2002-10-31 21:14 by hamayan #2484)

うーん!m-araiさん、鋭過ぎ。

確かに先の話の送信タスクは実際には割り込みから起動されていません。話が長くなるので、話を端折ってしまったのですが、返って悪かったみたいですね。

実際にはこの割り込みと言うのは、Ethernetの受信割り込みで、まずこの割り込みから最大優先度のタスクをwup_tskします。
そのタスクでとりあえず、取り込むだけ取り込んだら、次の優先度のプロトコル処理を行うタスクに、データを渡して終了してしまいます。
このプロトコル処理をするのが、送信タスクと呼んでいるタスクです。
受信タスクはサーバーアプリケーションで、リアルタイムな処理を要求されないので、ずうっと下の優先度に設定されています。

この辺が、割り込みに”起因する”と書いた由縁です。
Reply to #2482

Reply to #2484×

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: メールボックスでSUNPENDED のパッチ、結果 (2002-10-31 22:54 by hamayan #2486)

従来なら、とっくにサスペンデッドに陥っているだろう回数、試験してみましたが、現在の所快調に動いています。

やっぱり、これでしょうかね。
Reply to #2482

Reply to #2486×

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: メールボックスでSUNPENDED のパッチ、結果 (2002-10-31 23:21 by m-arai #2487)

そうですか!良かった。きっと解決でしょう。(^^)

mknl_wup_tskにmknl_rmv_queを入れるのは、起床待ち
→起床の際に呼ばれる場合には無意味なので、実は
最適ではないのです。が、他にも同じ病を抱えたサービ
スコールはあるでしょうし、レディキューに繋ぐ直前
に(あれば)現在繋がっているキューから削除する処理が
あるほうが分かりやすいという考え方もあり…。
また、このようにするなら、他のサービスコール内で
のmknl_wup_tskの前のmknl_rmv_queは削除できますから

とにかく、途中で間違った方向(タイムアウトキュー)へ
行ってしまったりして若干遅くなりましたが、いくつか
他の収穫もありましたので良しとしましょう。

Developersに場所を移して他の方々のコメントをいただ
く方向で、得られた宿題は整理しますか。
あ、OpenDiscussionの方で始まったコンフィグレータ
関連の事柄もDevelopersの方がフォーラムの趣旨との
整合性が良いかもしれませんね。
Reply to #2486

Reply to #2487×

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: メールボックスでSUNPENDED のパッチ、結果 (2002-10-31 23:26 by hamayan #2488)

Developersへの展開、賛成です。
あの方のご意見も聞きたいところ。
Reply to #2487

Reply to #2488×

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: メールボックスでSUNPENDED (2002-10-30 10:14 by m-arai #2449)

あれ…寝ていないタスクに対する要求はキューイングし
なけりゃならないのか。だから、オブジェクト状態チェ
ックでTTS_WAIが立っていないものを弾いてはいけない
んだ。

それに、TTS_WAIが立っていなければ、起床要求キュー
イングのチェック所で弾かれるから、TTS_WAIが立ってい
ないタスクがmknl_wup_tsk()に渡されるはずがない!!
Reply to #2447

Reply to #2449×

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