ウインドリバー 組込みとモバイルソフトウェアの世界的なリーダー
南角先生の組込み講座
ブックマーク/共有
ホーム : ウインドリバースクエア : 南角先生の組込み講座 : 第3回 割り込みとRTOS
南角先生の組込み講座 南角 茂樹 大阪電気通信大学 准教授

第3回 割り込みとRTOS

こんにちは。今回はソフトウェアによる排他制御の話をする予定でしたが、その前にまずRTOSと割り込みの関係をお話ししたほうがよいと思い予定を変更します。

OSはタスクを並行に動作させる機能を提供しますが、どのようにして実行させるタスクを決定しているのでしょうか?研究ベースではない、実際に製品に使われているほとんどのRTOSは、タスクをどのような順番で走らせるかを決めるスケジューリング方式として、優先度ベースのプリエンプティスケジューリング方式を採用しています。優先度はシステムを動作させる前に決めておく方式で、静的スケジューリングとも呼ばれています。
図1はVxWorksの一世代前の統合開発環境であるTornadoのWIND VIEWというアドオンツールですが、タスクの動作を視覚的に見ることができます。
図では優先度が低いtTaksAタスク実行中に優先度が中のtTaskBタスクが実行可能になったため、それに制御が移り、さらに優先度が高いtTaskCに制御が移っていき、それぞれのタスクの終了によりそれぞれ一時停止刺されたタスクが再開する様子を示しています。優先度は処理の重要度に応じてあらかじめタスクに与えておきます。また処理に応じて優先度を実行中に変更することも可能です。


図1 VxWorksの統合開発環境Tornadoのツールの一つであるWIND VIEW

では実行しているタスクがRTOSによって実行を切り替えられるとしても、実行中のタスクからRTOSに制御が切り替わらなければこれは実現できないことになります。このタスクの実行からRTOSの実行への制御の切り替えはどのような仕組みで実現しているのでしょうか?
実はこれも割り込みを使用しています。

前回、CPUひいてはRTOSが現実世界の変化を知るのには3種類のやり方があるという話をしました。その中では割り込みのみがあるプログラムが動いている最中に、強制的にほかのプログラムに切り替えることが出来ます。アプリケーションプログラムを実行する主体である、タスク実行中にも、実は図2に示すように定期的に外部割り込みをいれて、それにより定期的にRTOSを起動しています。


図2 RTOSとシステムクロックの関係

OSを実装するうえで、システムクロックと呼ばれる定期的な割り込みが必要です。図に示すように、タスク実行中もシステムクロック割り込みにより絶えずOSに制御が移っています。OSに制御が移る(言い換えるとOSが呼び出される)タイミングは、外部割り込みを終了するときやSVC(スーパーバイザーコール、OSがアプリケーションに提供するサービス、システムコール、サービスコールとも呼ぶ)を呼び出した場合などがありますが、これらはシステム構成や、システムの実行状態によっては長期間呼び出されないことも考えられます。そこでOSが呼び出される最長の(最低限の)周期を作り出すものが、OSのための割り込み、システムクロック(システムティックとも呼ばれています)で、OSはこれをベースに内部の時間管理を行います。これはUnixやWindowsだと通常1秒間に60回程度、RTOSで1秒間に数百回程度周期的にCPUに入れるタイマー割り込みです。スリープなど時間指定の待ちはこのシステムクロックを基準に実行されるため、待ち時間はシステムクロックの整数倍になります。
インダストリアル分野のNC装置などでは、もっと早い周期でサーボアンプにデータを送らなければならないため、最優先の周期割り込みはサーボ通信割り込みで、システムクロック割り込みは重要ではなく、システムクロック割り込みの優先度もそれほど高く設定していませんでした。
しかしシステムクロック割り込みをシステム全体の動きの基準として用いる場合は、システムクロック割り込みの優先度もそれなりに高く設定すべきでしょう。RTOSはCPUのドライバの側面もあるという話は聞かれたことはあるとは思いますが、このようにRTOS自身もいわばシステムクロック割り込みハンドラとしての側面も持っていることも知っておいてください。
ところで、VxWorksには標準では周期起動割り込みの仕組みは提供されていませんが、これは定期割り込みを発行できるタイマーハードウェアを利用すれば簡単に実現できるので、特に不便に思ったことはありません。逆に周期起動が提供されている場合は、それを利用する複数の周期起動ハンドラ間の関係や、システムクロックの割り込みレベルなどが見えないため、かえって厳密な設計がしにくくなると思います。

話だけではイメージがつかみにくいと思うので、割り込みハンドラとスケジューラのフローチャートを示します。VxWorksなど現役のRTOSのフローを示すのは差し障りがあると困るので、この連載の第1回で紹介した元祖RTOSと呼べるmtosのものを示すことにします。(なお実はmtosはその後C言語で書き直されて別のRTOSとして再登場しているのですが、ここではそれには触れないことにします)。


図3 割り込みハンドラ


図4 スケジューラ(ディスパッチャー)

図3に割り込みハンドラの図を、図4にスケジューラの図を示します。mtosは割り込みに関しては割り込みの要求のみキューイングしておき、その実行はスケジューラの最初にタスクを起動する前に実行するという方式で少し複雑です。これはmtosの特徴で、VxWorksとは似ている面も異なっている面もあります。
図3、図4には割り込みコントロールブロックという言葉が出てきますが、これが割り込み処理部(アドレス)をキューイングするための物です。
図3の割り込みハンドラの構造で重要なのは、割り込みが発生した時に実行されていたのがタスクの場合はスケジューラに飛び、それ以外の場合はスケジューラを経由ぜず割り込まれた場所に直接戻ることです。これはほとんどのRTOSで共通の仕組みです。
この理由はなんでしょうか?
これは宿題にしましょう、考えてみてください。
図3から見て取れるように、RTOSのスケジューラはシステムクロック割り込みだけでなく、ほとんどのハードウェア割り込みからも呼び出されます。
次回は今回の宿題の解答とともに、並行処理とは切っても切れない関係にある排他制御に関して説明したいと思います。

第3回おわり

コラム ? HWのシステムクロックとOSのシステムクロック

システムクロックとは、説明したようにOSの基準クロックとして使われるものの呼び方ですが、他にCPUの動作の基準として使われるものもやはりシステムクロックと呼ばれる場合があります。このCPUのシステムクロックとは、例えばCore i7のクロックが2GHzとか3GHzとよばれるもののことです。組込みシステムに使われるCPUは必ずしもそれほど速いクロックを使うとは限りませんが、比較的性能が低いものでも20MHz程度はある場合が多く、OSのシステムクロックが10ms周期つまり100Hzだとして、少なくとも速さは20万倍以上違うわけです。どちらのシステムクロックのことを言っているのかは話の流れの中で判断してください。もちろん本章では、このコラムに出てくる以外のシステムクロックはすべてOSのシステムクロックのことです。
なお上記の紛らわしさを避けるため、OSに供給するシステムクロックはシステムティックと呼ぶことも多いです。またタイムティックとよぶRTOSもあります。

■著者プロフィール

南角 茂樹(なんかく しげき)

大阪電気通信大学 総合情報学部 メディアコンピュータシステム学科 准教授、同大学院総合情報学研究科(コンピュータサイエンス専攻)、エイシップ・ソリューションズ株式会社 研究顧問。
慶應義塾大学工学部数理工学科卒業後、大手電機会社を経て現職。組み込みシステムおよびリアルタイムOSを専門とし、著書、解説記事、発表・講演、登録特許等多数。

南角先生の組込み講座 »
ページの先頭へ戻る »