Forums: Help (Thread #13392)

dly_tsk() で mknl_idl_loop() にディスパッチされてコケる? (2007-01-12 23:49 by Anonymous #27085)

こんにちは。
HOSで次のような症状に見舞われていて、悩み始めているところです。
もし似た症状の方や情報をお持ちの方いらっしゃいませんでしょうか?

(1) 実行中のタスクから dly_tsk(); をコール
(2) 直後に、ディスパッチが発生し mknl_exe_dsp() がコールされる。
(3) このとき運悪く、実行可能状態 READY が存在しないことで、実行可能タスクが見つからなかったら mknl_idl_loop() がコールされアイドルループに入ります。
(4) このアイドルループにある、mknl_unl_sys() で割り込みロックなどが解除された直後くらい (つまり、割り込みが解除された後で、再び割り込みが入るなどしたとき) にメモリ を一部壊している? ようで動作不良に陥る。

[ターゲットCPU] ARM (ARM7TDMI) ベースのカスタム品
[開発環境]は GCC 4.0.2 (GNUARM) + Cygwin 環境です。
独自なCPU + 社内で設計したボード という怪しい環境でやってますため、少々細かい情報が出しにくい状況ですが、何か情報をお持ち、または似た現象の人はいらっしゃいませんでしょうか?


<参考ソース>
ソースコードとしては 次のような大変シンプルなものです。

---------------------------------------------
CRE_TSK(1,{TA_HLNG|TA_ACT,0,task1,1,0x2000,NULL});
---------------------------------------------
int main(){
sta_hos();
}

void task1(VP_INT exinf)
{
initMyTimer()
ena_int( MyTimerVECTOR );
for(;;){
dly_tsk(12345); // ←コールされた直後に症状発生。
}
}
---------------------------------------------

Reply to #27085×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) Login

RE: dly_tsk() で mknl_idl_loop() にディスパッチされてコケる (2007-01-14 15:17 by ryuz #27107)

お世話になります。Ryuzと申します。

ARM環境が手元にないので追試できないのですが、メモリ破壊とのことですので、コンフィギュレータの HOS_IDL_STK や HOS_INT_STK で、アイドルタスクや割込みコンテキストのスタックを増やしてみていただけないでしょうか。

ARMは実装ごとに割込みコントローラのアーキテクチャが変わってきますので対応状況もあまりよくない状況です。FIQのことはほとんど考慮してませんし...

よろしくお願いいたします。
Reply to #27085

Reply to #27107×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) Login

RE: dly_tsk() で mknl_idl_loop() にディスパッチされてコケる (2007-01-15 11:00 by Anonymous #27120)

ryuz さん(いや ryuz 先生) ありがとうございます。

HOS_INT_STK でスタックサイズを 128byte → 256byte に増やすだけで一発解決となりました。

ps. 会社でこっそり空き時間にHOSをARM上でうごかしているのですが、HOS って、他の商用製品と同等もしくはそれ以上の使いやすさに感動しています (^-^) 感謝
Reply to #27085

Reply to #27120×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) Login

RE: dly_tsk() で mknl_idl_loop() にディスパッチされてコケる (2007-01-15 22:32 by ryuz #27130)

無事動いたようで何よりです。

次世代版も頑張ってますんで、リリース時にはよろしくお願いします(次はマニアックな仕様になりそうですが)。

次世代版起してる過程で気がついた現行版のバグも幾つかあって、直さねばとは思ってるんですが、もうちょっと整理できてからかなと思ってます(特に多重割込み関連は危険かも)。

今後ともよろしくお願いいたします。
Reply to #27120

Reply to #27130×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) Login

RE: dly_tsk() で mknl_idl_loop() にディスパッチされてコケる (2007-01-16 22:46 by Anonymous #27149)

> (特に多重割込み関連は危険かも)。
^^; やはりそうですか...
多重割込では、ちょいと動作が気になっていたので、(強引にも) hosarm.c の中で 多重割込を禁止して使用していました。

↓こんな感じ...
-------------------------------
/* IRQ割り込み処理開始 */
INTNO hos_arm_sta_irq(void)
{
... 割り込み番号の検索を行う ...

mknl_loc_cpu(); // ←多重割込禁止
return intno;
}

/* IRQ割り込み処理終了 */
void hos_arm_end_irq(void)
{
mknl_unl_cpu(); // ←割込許可
}

-------------------------------
Reply to #27130

Reply to #27149×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) Login

RE: dly_tsk() で mknl_idl_loop() にディスパッチされてコケる (2007-01-17 08:57 by ryuz #27155)

IRQの多重割込み禁止は、実施されてる方法で正解と思っています(さすが良くわかってらっしゃる)。
# loc_cpuされた状態で割込みハンドラに入りますね。

で、危ないと言ってるのは実はそこではなかったりします (^^;
IRQのみでの多重割り込みはそれほど危険ではないです。
# まあ、ARMの場合IRQの多重割り込みは、割込みコントローラが対応しているか、ソフトでやるかなのでそこの作りこみ依存ではありますが。

実はIRQ発生時にCPU的にFIQを禁止してくれないのが最大の問題でして、IRQハンドラ内で割り禁する前にFIQが掛かるとヤバイです。
同じことがSHやH8にもいえます。
# これも、自分より高レベルの割り込みはマスクしてくれません。

CVSの中にだけある次世代版(HOS-V4 Advance)では対策済みなのですが、現行版にどう反映させたものやらというのは、悩んでいる部分です。
# 興味があればCVSリポジトリでも覗いて頂ければ幸いです。

よろしくお願いいたします。

Reply to #27149

Reply to #27155×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) Login

RE: dly_tsk() で mknl_idl_loop() にディスパッチされてコケる (2007-01-18 09:56 by Anonymous #27187)

なるほど。ありがとうございます。

HOS-V4 Advance の FIQ 実装も参考に、どうやって実装しようか考えてみます。

Reply to #27155

Reply to #27187×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) Login