[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

(toppers-users 885) Re: SH3 dispatcher バグ?



宿口です。

良く分からないので、質問させてください。
解っていないので、的外れなことを言っているかもしれませんが、
ご容赦ください。

アイピーフレックス株式会社の本田さん:
> 
> 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 としての面目はつぶれてしまいます。

タスクスイッチが起こらないとするなら、最大タイムティック間隔だけ起床
が遅れますね。


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

宿口雅弘