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.
Download
Magazine
Develop
Account
Download
Magazine
Develop
Login
Forgot Account/Password
Create Account
Language
Help
Language
Help
×
Login
Login Name
Password
×
Forgot Account/Password
Category:
Software
People
PersonalForge
Magazine
Wiki
Search
OSDN
>
Find Software
>
System
>
Operating System Kernels
>
Hyper Operating System(ITRON仕様OS)
>
Forums
>
Developers
>
HOS/Windowsの割り込み処理
Hyper Operating System(ITRON仕様OS)
Fork
Description
Project Summary
Developer Dashboard
Web Page
Developers
Image Gallery
List of RSS Feeds
Activity
Statistics
History
Downloads
List of Releases
Stats
Source Code
Code Repository list
Git
hos-v4a
CVS
View Repository
Ticket
Ticket List
Milestone List
Type List
Component List
List of frequently used tickets/RSS
Submit New Ticket
Documents
Communication
Forums
List of Forums
Developers (761)
Help (688)
Open Discussion (342)
Mailing Lists
list of ML
hos-cvs
hos-git
News
Forums:
Developers
(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版を全く使ったことがないので、果た
して対応できるかどうか分かりませんが、少し考えて
みます。
Reply to
#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が連続して呼び出されることで
ロックしてしまうようです。
これはこちらでももう少し追ってみます。
Reply to
#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
Reply to
#6502
RE: HOS/Windowsの割り込み処理 (2003-11-05 16:48 by
hamayan
#6504)
Create ticket
あ!いたたたた。
既にご存知と思いますが、twai_semもですね。
Reply to
#6503
RE: HOS/Windowsの割り込み処理 (2003-11-05 16:52 by
hamayan
#6505)
Create ticket
ん?
資源を確保できた場合、72行目でロック解除できないでしょうか?
Reply to
#6504
RE: HOS/Windowsの割り込み処理 (2003-11-05 16:53 by
m-arai
#6506)
Create ticket
(--; そうでした。
Reply to
#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が確実に完了するまで待ったほうがいいのかな?と思い試しに追加したのですが、
これが効いたのか今のところ全然止まりません。
…が、繰り返しになりますがこれが正解かどうかはわかりません。
とりあえずこれでしのぎつつ、引き続き検証してみたいと思います。
Reply to
#6503
RE: HOS/Windowsの割り込み処理 (2003-11-06 18:59 by
m-arai
#6522)
Create ticket
これは良いニュースです。
しばらく様子を見て、他にご意見・情報が無いようでした
ら、そのように修正を入れますね。
Reply to
#6514