(toppers-users 884) SH3 dispatcher バグ?
Honda Hiroki
hhonda @ ipflex.com
2003年 6月 12日 (木) 10:54:48 JST
アイピーフレックス株式会社の本田です。
config/sh3/cpu_support.S の dispatcher に「sleep して割り込み待ち」す
るところがあります。
dispatcher_2:
ldc r9,sr /* 割り込みの許可 */
sleep /* 割込み待ち */
ldc r8,sr /* 割り込み禁止 */
これは、次のようなシナリオの時に破綻しないでしょうか?
(1) システムが快調に動いていて、たまたま「ready タスクが
なく、running タスクが孤独に実行中」という状態になった。
(2) running タスクが slp_tsk() や wai_sem() 等の待ち系
システムコールを呼んだため、JSP カーネルが loc_cpu()
して dispatch を呼んだ。
(3) dispatch はコンテキストセーブして dispacher に飛んだ。
(4) dispatcher は「schedtsk == NULL だから sleep しよう」
と判断し、dispatcher_2 に飛んだ。
(5) 上記 (3)(4) の間に外部割り込みが発生したのだが、
CPU ロック状態なので受け付けが延期されていた。
(6) dispatcher_2 が ldc r9,sr を実行したところで割り込みが
受け付けられ、割り込みハンドラに制御が移った。
[戻り先 PC = sleep 命令]
(7) 割り込みハンドラが iwup_tsk() だか isig_sem() だかを
呼んで、どこかのタスクを起こした。
(8) 割り込みハンドラからリターンし、割り込み前の処理の
続きを行うべく、sleep 命令のところに戻った。
(9) sleep 命令を実行し、CPU は寝てしまう。
あれれ? 割り込みハンドラによってどこかのタスクが
起こされたんだからそのタスクを実行すべきなのでは…!
(9) で不当に寝てしまっても、何らかの割り込み (タイムティック割り込み等)
がかかれば目覚めるので、システムがハングしてしまうことはありませんが、
RTOS としての面目はつぶれてしまいます。
# 「タイムティック割り込みを含むほとんどの割り込みを chg_ipm() でマス
# クして、単発の最高優先割り込みだけを待つ」という (いささか行儀悪い)
# アプリケーションのときに上記シナリオが発生すると、システムがハング
# してしまいます。
この問題は、割り込み許可と sleep が atomic でないことに起因します。
m68k の stop 命令なら問題ありません。
「ldc r9,sr の効果は ldc の次命令実行後に発効」というんなら問題ありま
せんが、SH3 の仕様書を見る限りそのようなことはなさそうです。
どうなんでしょうか?
====
アイピーフレックス株式会社
R&D センター
本田広樹 (hhonda @ ipflex.com)