You are not logged in. This forum allows only logged in users to post. If you want to post in the forum, please log in.
下載
軟體開發
帳戶
下載
軟體開發
登入
我忘記帳戶名和密碼了
新增帳戶
語言
手冊
語言
手冊
×
登入
登入名稱
密碼
×
我忘記帳戶名和密碼了
繁體中文翻譯狀態
類別:
軟體
人
PersonalForge
Magazine
Wiki
搜尋
OSDN
>
軟體搜索
>
System
>
Operating System Kernels
>
Hyper Operating System(ITRON仕様OS)
>
討論區
>
開發者論壇
>
HOS/Windowsの割り込み処理
Hyper Operating System(ITRON仕様OS)
Fork
描述
專案概要
開發人員儀表板
專案的網頁
Developers
Image Gallery
List of RSS Feeds
活動
使用統計
歷史
檔案下載
發布列表
Stats
原始碼
儲存庫列表
Git
hos-v4a
CVS
查看儲存庫
待辦事項
待辦事項列表
里程碑列表
類型列表
元件列表
List of frequently used tickets/RSS
新增待辦事項
文檔
溝通
討論區
討論區列表
開發者論壇 (761)
幫助論壇 (688)
公開討論 (342)
通信論壇
通信論壇列表
hos-cvs
hos-git
新聞
討論區:
開發者論壇
(Thread #3693)
Return to Thread list
RSS
HOS/Windowsの割り込み処理 (2003-11-05 01:08 by
miro
#6491)
Create ticket
現在、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)
Create ticket
ご報告ありがとうございます。
まず、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)
Create ticket
早速のご対応ありがとうございます。
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)
Create ticket
では確認いただけたので、そのように修正をかけます。
ちょっとソースを眺めてみたところ、それが原因とは
断言出来ないですが、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)
Create ticket
あ!いたたたた。
既にご存知と思いますが、twai_semもですね。
回覆:
#6503
RE: HOS/Windowsの割り込み処理 (2003-11-05 16:52 by
hamayan
#6505)
Create ticket
ん?
資源を確保できた場合、72行目でロック解除できないでしょうか?
回覆:
#6504
RE: HOS/Windowsの割り込み処理 (2003-11-05 16:53 by
m-arai
#6506)
Create ticket
(--; そうでした。
回覆:
#6505
RE: HOS/Windowsの割り込み処理 (2003-11-06 11:39 by
miro
#6514)
Create ticket
デッドロックを起こしてしまう件ですが、
その後試行錯誤してみた結果、
「これが正解かどうかはわからないが、少なくともデッドロック現象がとても発生しにくくなる」
(少なくとも数十分連続運転してもロックしなくなった)
という状態まで持っていけました。
修正箇所は一点、
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)
Create ticket
これは良いニュースです。
しばらく様子を見て、他にご意見・情報が無いようでした
ら、そのように修正を入れますね。
回覆:
#6514