ログインしていません。このフォーラムはログインユーザのみに投稿が許可されています。投稿する場合はログインしてください。
ダウンロード
Magazine
開発
アカウント
ダウンロード
Magazine
開発
ログイン
アカウント/パスワードを忘れた
アカウント作成
言語
ヘルプ
言語
ヘルプ
×
ログイン
ログイン名
パスワード
×
アカウント/パスワードを忘れた
日本語の翻訳状況
カテゴリ:
ソフトウェア
人物
PersonalForge
Magazine
Wiki
検索
OSDN
>
ソフトウェアを探す
>
システム
>
オペレーティングシステム カーネル
>
Hyper Operating System(ITRON仕様OS)
>
フォーラム
>
開発者
>
HOS/Windowsの割り込み処理
Hyper Operating System(ITRON仕様OS)
Fork
概要
プロジェクト概要
開発ダッシュボード
Webページ
開発メンバー
画像ギャラリー
公開フィード一覧
活動
統計情報
活動履歴
ダウンロード
リリース一覧
統計
ソースコード
コードリポジトリリスト
Git
hos-v4a
CVS
リポジトリ閲覧
チケット
チケット一覧
マイルストーン一覧
チケットの種類一覧
コンポーネント一覧
よく使われるチケット一覧のリスト/RSS
新規チケット登録
文書
コミュニケーション
フォーラム
フォーラム一覧
開発者 (758)
ヘルプ (688)
公開討議 (342)
メーリングリスト
MLの一覧
hos-cvs
hos-git
ニュース
フォーラム:
開発者
(スレッド #3693)
話題(スレッド)一覧に戻る
RSS
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
への返信