討論區: 開發者論壇 (Thread #3693)

HOS/Windowsの割り込み処理 (2003-11-05 01:08 by miro #6491)

現在、HOS/H8での動作を事前にHOS/Windowsで検証しようとしているのですが、
こういった開発を行っていく上で、1点の修正希望と1点わからない点が発生しました。
ともにHOS/Windowsでの割り込みエミュレーションにあたるのですが…

1. HOS/Windowsの割り込みベクタ番号について
  hos-v4\src\win\pacint.c、hospac_win_int関数において、
  割り込みエミュレーション処理部分
> if ( kernel_intcb_tbl[intno].isr != NULL )
> {
> kernel_intcb_tbl[intno].isr(kernel_intcb_tbl[intno].exinf); /* 割り込みサービスルーチン実行 */
> }
  において、intnoがそのまま使用されているために、コンフィグレータで
  HOS_MIN_INTNOを0以外に指定していると正常に動作しません。
  intno-kernel_min_intnoとするべきかと思います。


2. セマフォを使用した割り込みマスクに微妙なタイミング競合が起こる?
  猛烈な勢いで割り込みエミュレーションを発生させる(hospac_win_intを呼び出す)と、
  PCの負荷が高い時にhospac_win_int内のセマフォ待ち部分でデッドロックが発生
  することがあるようです。

  Microsoft Visual C++ .NET,ならびにBorland C++ Compiler 5.5でビルドした場合それぞれで
  同一の現象を確認しました。
  簡単なサンプルプログラムでは再現性するのが結構難しいのですが、
  hos-v4 v1.01パッケージ付属のサンプル(哲学者のフォーク)について、
   ・system.cfgのHOS_TIM_TICを(100, 1)に
   ・wintimer.cのtimeSetEventを(5, 1, ~)に
  変更し、ビルドしたバイナリ(sample.exe)を10~20個ほど平行して実行すると
  数分で止まる(デッドロックする)プロセスが出てきます。
  非常に微妙なタイミングの問題のようで、これは修正案を私のほうで
  見つけることができませんでした。何かお心当たりなどありますでしょうか?


以上、ご報告させていただきます。HOS/Windowsはあまり使い込まれていないのかな…?とも思いますが
ご参考になれば幸いです。

RE: HOS/Windowsの割り込み処理 (2003-11-05 01:32 by m-arai #6493)

ご報告ありがとうございます。

まず、1.についてですが、
https://sourceforge.jp/tracker/index.php?func=detail&aid=2009&group_id=183&atid=780
の修正への追従がWin版では漏れていたようです。

Index: src/win/pacint.c
===================================================================
RCS file: /cvsroot/hos/hos/hos-v4/src/win/pacint.c,v
retrieving revision 1.3
diff -u -r1.3 pacint.c
--- src/win/pacint.c 10 Nov 2002 15:28:41 -0000 1.3
+++ src/win/pacint.c 4 Nov 2003 16:23:41 -0000
@@ -16,6 +16,7 @@
void hospac_win_int(INTNO intno)
{
T_HOSPAC_CTXINF *ctxinf;
+ T_KERNEL_INTCB intcb;

/* 範囲チェック */
if ( intno < KERNEL_TMIN_INTNO || intno > KERNEL_TMAX_INTNO )
@@ -41,13 +42,16 @@
/* 割り込みフラグセット */
hospac_blInt = TRUE;

+ /* ローカルにコピー */
+ intcb = KERNEL_INTNO_TO_INTCB(intno);
+
/* 非タスク部(割り込みコンテキストに移行) */
mknl_sta_ind();

/* 割り込みの実行 */
- if ( kernel_intcb_tbl[intno].isr != NULL )
+ if ( intcb.isr != NULL )
{
- kernel_intcb_tbl[intno].isr(kernel_intcb_tbl[intno].exinf);
/* 割り込みサービスルーチン実行 */
+ intcb.isr(intcb.exinf); /* 割り込みサービスルーチン実行
*/
}

/* タスク部に移行 */


あたりでどうかと思うのですが、ご確認いただけますか?

2.の方はちょっと今すぐには分かりません。HOS全般の
問題なのか、Win版固有のものなのか?

実を言うと私はWin版を全く使ったことがないので、果た
して対応できるかどうか分かりませんが、少し考えて
みます。
回覆: #6491

RE: HOS/Windowsの割り込み処理 (2003-11-05 16:11 by miro #6502)

早速のご対応ありがとうございます。
int_noについてのパッチを当ててみました。
手元のコードはどれも正常に動作しました。ありがとうございます。

デッドロックを起こしてしまう問題ですが、少し凝ったことをしたソースですと
結構簡単に止まって(100msごとのタイムチックをhospac_win_intに食わせていると
数秒~数十秒で止まってしまったりする)しまいます。

ロックする場所はほぼpacint.cの28行目
> WaitForSingleObject(hospac_hSem, INFINITE);
です。なんらかの原因でセマフォが開放されないままhospac_win_intが連続して呼び出されることで
ロックしてしまうようです。

これはこちらでももう少し追ってみます。
回覆: #6491

RE: HOS/Windowsの割り込み処理 (2003-11-05 16:33 by m-arai #6503)

では確認いただけたので、そのように修正をかけます。

ちょっとソースを眺めてみたところ、それが原因とは
断言出来ないですが、wai_semにシステムロック解除の
抜けを発見しました。

Index: src/kernel/sem/wai_sem.c
===================================================================
RCS file: /cvsroot/hos/hos/hos-v4/src/kernel/sem/wai_sem.c,v
retrieving revision 1.7
diff -u -r1.7 wai_sem.c
--- src/kernel/sem/wai_sem.c 10 Nov 2002 15:28:41 -0000 1.7
+++ src/kernel/sem/wai_sem.c 5 Nov 2003 07:25:26 -0000
@@ -54,6 +54,7 @@
if ( semcb_ram->semcnt > 0 )
{
semcb_ram->semcnt--; /* セマフォ資源の獲得 */
+ mknl_unl_sys(); /* システムのロック解除 */
ercd = E_OK;
}
else
回覆: #6502

RE: HOS/Windowsの割り込み処理 (2003-11-05 16:48 by hamayan #6504)

あ!いたたたた。

既にご存知と思いますが、twai_semもですね。
回覆: #6503

RE: HOS/Windowsの割り込み処理 (2003-11-05 16:52 by hamayan #6505)

ん?
資源を確保できた場合、72行目でロック解除できないでしょうか?
回覆: #6504

RE: HOS/Windowsの割り込み処理 (2003-11-05 16:53 by m-arai #6506)

(--; そうでした。
回覆: #6505

RE: HOS/Windowsの割り込み処理 (2003-11-06 11:39 by miro #6514)

デッドロックを起こしてしまう件ですが、
その後試行錯誤してみた結果、
「これが正解かどうかはわからないが、少なくともデッドロック現象がとても発生しにくくなる」
(少なくとも数十分連続運転してもロックしなくなった)
という状態まで持っていけました。

修正箇所は一点、
src/win/pacint.cの39~40行目、
> SuspendThread(ctxinf->hThread);
> ctxinf->blIntSuspend = TRUE;

> SuspendThread(ctxinf->hThread);
> ctxinf->blIntSuspend = TRUE;
> Sleep(0);
と、一行追加するだけです。

Windows全体の負荷が高くなってきた時に
SuspendThreadが確実に完了するまで待ったほうがいいのかな?と思い試しに追加したのですが、
これが効いたのか今のところ全然止まりません。
…が、繰り返しになりますがこれが正解かどうかはわかりません。

とりあえずこれでしのぎつつ、引き続き検証してみたいと思います。
回覆: #6503

RE: HOS/Windowsの割り込み処理 (2003-11-06 18:59 by m-arai #6522)

これは良いニュースです。

しばらく様子を見て、他にご意見・情報が無いようでした
ら、そのように修正を入れますね。
回覆: #6514