[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
(toppers-users 885) Re: SH3 dispatcher バグ?
- To: toppers-users at ertl jp
- From: SHUKUGUCHI Masahiro <ms89019 at mms co jp>
- Date: Thu, 12 Jun 2003 13:57:59 +0900
宿口です。
良く分からないので、質問させてください。
解っていないので、的外れなことを言っているかもしれませんが、
ご容赦ください。
アイピーフレックス株式会社の本田さん:
>
> config/sh3/cpu_support.S の dispatcher に「sleep して割り込み待ち」す
> るところがあります。
>
> dispatcher_2:
> ldc r9,sr /* 割り込みの許可 */
> sleep /* 割込み待ち */
> ldc r8,sr /* 割り込み禁止 */
>
> これは、次のようなシナリオの時に破綻しないでしょうか?
** Cut quoted 6 lines by the mail filter. **
ここは、カーネル内部処理用の lock_cpu() ですね。
> (3) dispatch はコンテキストセーブして dispacher に飛んだ。
> (4) dispatcher は「schedtsk == NULL だから sleep しよう」
> と判断し、dispatcher_2 に飛んだ。
> (5) 上記 (3)(4) の間に外部割り込みが発生したのだが、
> CPU ロック状態なので受け付けが延期されていた。
> (6) dispatcher_2 が ldc r9,sr を実行したところで割り込みが
> 受け付けられ、割り込みハンドラに制御が移った。
> [戻り先 PC = sleep 命令]
確かに、この割込みの戻りPCは sleep命令だと思いますが。。。
> (7) 割り込みハンドラが iwup_tsk() だか isig_sem() だかを
> 呼んで、どこかのタスクを起こした。
> (8) 割り込みハンドラからリターンし、割り込み前の処理の
> 続きを行うべく、sleep 命令のところに戻った。
何故、ここに戻るのでしょうか?
割込み終了処理で、タスクスケジューラが実行されるので、起床させた
タスクに切り替わるのではありませんか?
割込みが発生していない状況でのsleep命令実行時は READY状態のタスクが
無い状態ですからから、割込みハンドラで起床させたタスクの優先度に
関わらずタスクスケジューリングが実行されると思うのですが。。。
割込みでどのタスクも起床させていないのなら、READY状態のタスクが存在
しない状態が継続されますから、sleep に戻るのが妥当だと思います。
> (9) sleep 命令を実行し、CPU は寝てしまう。
> あれれ? 割り込みハンドラによってどこかのタスクが
> 起こされたんだからそのタスクを実行すべきなのでは…!
そうなるように思いますが、実行されないと考えられた理由は何でしょうか?
私の割込みハンドラの終了処理の解釈が間違っていますか?
> (9) で不当に寝てしまっても、何らかの割り込み (タイムティック割り込み等)
> がかかれば目覚めるので、システムがハングしてしまうことはありませんが、
> RTOS としての面目はつぶれてしまいます。
タスクスイッチが起こらないとするなら、最大タイムティック間隔だけ起床
が遅れますね。
よろしくお願いいたします。
宿口雅弘