プロが教えるわが家の防犯対策術!

itron等のRTOSではタスク登録すれば
while(1){
処理;
}
という無限ループを抜けられるじゃないですか?
いったいどういう仕組みで抜けているのでしょうか?

ソフト的にはどうあがいても無限ループなわけで・・。

どなたか教えてください。

A 回答 (3件)

一箇所間違っていました。



> 非タスクコンテキストへの切り替えでは、周期ハンドラを抜けたことにはなりません。

非タスクコンテキストへの切り替えでは、無限ループを抜けたことにはなりません。
    • good
    • 1

何を持って無限ループを抜けるといわれているのか分かりませんが、μITRONの場合、タスクディスパッチや周期ハンドラのような非タスクコンテキストへの切り替えでは、周期ハンドラを抜けたことにはなりません。

どんなに他のコンテキストに切り替わっても、元のコンテキストに戻ってくれば、依然として無限ループの中だからです。

無限ループを抜ける可能性があるのは、次の場合に限られます。
・ter_tskで無限ループに入ったタスクを強制終了させる。
・ras_texまたはiras_texでタスク例外処理ルーチンを起動し、その中からlongjmpで無限ループの外に抜け出す。
・ras_texまたはiras_texでタスク例外処理ルーチンを起動し、その中でext_tskまたはexd_tskを呼び出すことでタスクを終了させる。
・プログラムを実行時に書き換える。
・ウォッチドッグタイマーのオーバーフロー等、何らかの方法でシステムにリセットがかかる。
・exitやabort等の終了関数がサポートされている場合にそれらを呼び出す。
・その他、カーネルの実装依存の機能や、カーネルの管理外の機能を用いて脱出する可能性あり。
    • good
    • 0

詳しい状況がわからないため「自信なし」にします。



RTOSのタスクスイッチングで、キューを自らリリースして
次キューに移らせるものと、TSS(timesharing system)時分割処理システムがあります。

後者であれば、ソース上無限ループでも一定時間になると
タスクのスィッチングを行うはずです。


まずはOSの仕様を御覧になられたほうがよいかと思います。
または、コンフィグレーションのご確認も手段の1つだと思います。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!