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)
>
Ticket List/Search
>
Ticket #3133
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
Ticket #3133
Ticket List
Submit New Ticket
RSS
起動キューイングされたタスクのext_tsk
Open Date:
2003-10-12 23:17
Last Update:
2006-05-06 00:10
monitor
ON
OFF
Reporter:
m-arai
Owner:
m-arai
Type:
Patches
Status:
Closed
Component:
(None)
MileStone:
(None)
Priority:
9 - Highest
Severity:
5 - Medium
Resolution:
Invalid
File:
5
Details
Reply
ext_tsk()において、
1. 起動要求がキューイングされている
2. 呼び出す瞬間のスタックの伸びが十分でない
場合、深刻な問題が生じる場合がある。
確認の手段
CRE_TSK(TID_ACTER, {TA_HLNG|TA_ACT, 1, Task1, 1, 256,
NULL});
CRE_TSK(TID_EXTER, {TA_HLNG|TA_ACT, 1, Task2, 2, 256,
NULL});
void Task1(VP_INT exinf)
{
Sci_Puts("Task1: Start.\r\n");
/* Task2 (ext_tsk onlyなタスク)を起動要求する */
Sci_Puts("Task1: act_tsk(TID_EXTER)\r\n");
act_tsk(TID_EXTER);
/* 但し,既にREADYであるため,キューイングされる。*/
/* 1秒間眠る */
Sci_Puts("Task1: dly_tsk(1000)\r\n");
dly_tsk(1000);
/* この眠りによってTask2へのディスパッチが起こる */
/* 生存を主張し続ける */
for (;;) {
Sci_Puts("Task1: Alive!\r\n");
dly_tsk( 5000);
} /* システムが落ちていなければ,約5秒ごとに表示が出る */
}
void Task2(VP_INT exinf)
{
/* いきなりext_tskする */
Sci_Puts("Task2: Start and Exit.\r\n");
ext_tsk();
/* CRE_TSKの段階でTA_ACTなので,Task1でact_tskされてい
る分,
起動要求が1回分キューイングされている。
従って,ここでext_tskしても,1度はすぐ再び起動される筈
である。
ここでシステム死ぬことは,ext_tskのバグの証明に他なら
ない */
}
なるプログラムの実行で、Task1が死なないこと、Task2が2度起
動する
ことが確認されれば問題なし。
添付のパッチはこの問題を解決する。
Ticket History (3/12 Histories)
Show older Histories
2003-10-12 23:17
Updated by:
m-arai
File
729: ext_tsk.diff
is attached
2003-10-13 09:18
Updated by:
m-arai
Comment
Reply
Logged In: YES
user_id=1822
書き忘れていたが、添付差分の問題点として、「レディキューへの
接続がディスパッチ1回分保留されるため、仕様から想定されるより
タスクの再起動が遅くなる」というものがある。
2003-10-13 14:59
Updated by:
m-arai
File
730: zomb.diff
is attached
Comment
Reply
Logged In: YES
user_id=1822
修正2版の要旨は以下の2点。
1. 自タスクを起動する場合、スタックを強制的
に割り込み用に切替えてコンテキストの破壊を
防ぐ。
2. 停止されたタスク実行中から発行される
ディスパッチの場合、コンテキストスイッチは
「切替え」ではなく「変更」になるようにする。
どちらもPACにアセンブラレベルの関数追加
を行なっている。
結果:
Task1: Start.
Task1: act_tsk(TID_EXTER)
Task1: dly_tsk(1000)
Task2: Start and Exit.
Task2: Start and Exit.
Task1: Alive!
Task1: Alive!
…
1版ではレディキューへの接続が
ディスパッチ1回分保留されるため、
Task1: Start.
Task1: act_tsk(TID_EXTER)
Task1: dly_tsk(1000)
Task2: Start and Exit.
Task1: Alive!
Task2: Start and Exit.
Task1: Alive!
…
こうなる可能性もあったが、その点は
改善され、仕様を守れるようになった。
一方、スタックを強制的に切替える
という危険な真似もしていて、
プロセッサによっては問題があるかも
しれない。
2003-10-13 22:24
Updated by:
m-arai
Comment
Reply
Logged In: YES
user_id=1822
よく考えたら、例えhospac_cre_ctx_asmと現在のスタックが干渉しな
くても、ext_tskの最後のmexe_dspで折角作ったコンテキストが無効
なコンテキストで破壊されてしまうのだった。
即ち、
> 2. 呼び出す瞬間のスタックの伸びが十分でない
これはあまり関係無い。
2003-10-14 21:54
Updated by:
m-arai
File
735: zomb_2.diff.bz2
is attached
Comment
Reply
Logged In: YES
user_id=1822
3版:
hospac_swi_ctxの引数の順番を変え、hospac_chg_ctxとコードを
共有できるようにした。
その他細かい点にゆいて整理を試みた。
h83n/arm/sh/ia32についても作業してみた。動作確認をとったのは、
相変わらずh83のみ。armはほぼ間違い無く、ia32は確実に動かない。
2003-10-20 19:13
Updated by:
m-arai
Comment
Reply
Logged In: YES
user_id=1822
4版:
自コンテキストに対するcre_ctx対策として、ctx_entryでcre_ctxで
潰される分スタックを進めておく案。無駄にスタックを消費するが、
一方で実行中のスタックを強引に切り替える真似はしなくても済む。
2003-10-20 19:13
Updated by:
m-arai
File
742: zomb_3.diff.bz2
is attached
2003-11-01 07:31
Updated by:
m-arai
File
750: mext_stu.diff
is attached
Comment
Reply
Logged In: YES
user_id=1822
修正4版のsrc/mknl/sys/mext_stu.c部分差替え:
mknl_ext_startup()内の
hospac_swi_ctx(&dmy_ctx, &mtcb->ctxinf);
あるいは
hospac_swi_ctx(&dmy_ctx, &mknl_idlctx);
は、何ら初期化しないdmy_ctxから取得した不定の値をスタック
ポインタとし、そこに現コンテキストの保存を行ってしまっている。
幸運に恵まれていると問題にならないが、致命的な結果をもたらす
可能性がある。
swi_ctx->chg_ctxでこの不具合は回避できる。
2004-10-20 23:14
Updated by:
hamayan
Comment
Reply
Logged In: YES
user_id=1818
ゾンビ3の日立H8ノーマルモード(src/h83/htc)向けパッチで、
pacctxn.srcの.
EXPORT _hospac_chg_ctxの参照先のラベルが抜けている様です。
2006-01-16 20:59
Updated by:
m-arai
Priority
Update from
5 - Medium
to
9 - Highest
2006-04-21 00:11
Updated by:
m-arai
Comment
Reply
Logged In: YES
user_id=1822
本件に添付されているパッチには数々の問題が有ります。
それぞれについての追加修正はおそらく行われません。
別の方向性は見えつつあるようなので、そう遠くない将来、
改めて出したいと考えています。
特に削除せず残しておきますが、あくまで参考の為です。
本件に関する議論は、
https://sourceforge.jp/forum/forum.php?thread_id=3528&forum_id=696
2006-05-06 00:10
Updated by:
m-arai
Ticket Close date
is changed to
2006-05-06 00:10
Status
Update from
Open
to
Closed
Resolution
Update from
None
to
Invalid
Comment
Reply
Logged In: YES
user_id=1822
本件に関しては、Bugsへ
[ #8378 ] act_tskキューイング時ext_tskで自スタックを破壊
htpps://sourceforge.jp/tracker/index.php?func=detail&aid=8378&group_id=183&atid
=778
当トラッカーアイテムは放棄されました。
Attachment File List (
5
)
Attachment File List
ext_tsk.diff
(2KB)
修正差分1版
zomb.diff
(7KB)
修正差分2版
zomb_2.diff.bz2
(6KB)
修正差分3版
zomb_3.diff.bz2
(6KB)
修正差分4版
mext_stu.diff
(904bytes)
修正4版のsrc/mknl/sys/mext_stu.c部分差替え
Edit
Add Comment
You are not logged in.
I you are not logged in, your comment will be treated as an anonymous post. »
Login
Add Comment
Preview
Submit
1. 起動要求がキューイングされている
2. 呼び出す瞬間のスタックの伸びが十分でない
場合、深刻な問題が生じる場合がある。
確認の手段
CRE_TSK(TID_ACTER, {TA_HLNG|TA_ACT, 1, Task1, 1, 256,
NULL});
CRE_TSK(TID_EXTER, {TA_HLNG|TA_ACT, 1, Task2, 2, 256,
NULL});
void Task1(VP_INT exinf)
{
Sci_Puts("Task1: Start.\r\n");
/* Task2 (ext_tsk onlyなタスク)を起動要求する */
Sci_Puts("Task1: act_tsk(TID_EXTER)\r\n");
act_tsk(TID_EXTER);
/* 但し,既にREADYであるため,キューイングされる。*/
/* 1秒間眠る */
Sci_Puts("Task1: dly_tsk(1000)\r\n");
dly_tsk(1000);
/* この眠りによってTask2へのディスパッチが起こる */
/* 生存を主張し続ける */
for (;;) {
Sci_Puts("Task1: Alive!\r\n");
dly_tsk( 5000);
} /* システムが落ちていなければ,約5秒ごとに表示が出る */
}
void Task2(VP_INT exinf)
{
/* いきなりext_tskする */
Sci_Puts("Task2: Start and Exit.\r\n");
ext_tsk();
/* CRE_TSKの段階でTA_ACTなので,Task1でact_tskされてい
る分,
起動要求が1回分キューイングされている。
従って,ここでext_tskしても,1度はすぐ再び起動される筈
である。
ここでシステム死ぬことは,ext_tskのバグの証明に他なら
ない */
}
なるプログラムの実行で、Task1が死なないこと、Task2が2度起
動する
ことが確認されれば問題なし。
添付のパッチはこの問題を解決する。