組み込みで使用するOSとしてRTOSを使用している場合、割り込みには「OS管理割り込み」と「OS管理外割り込み」の2種類存在します。
今回はその「OS管理割り込み」と「OS管理外割り込み」のそれぞれの特徴と使い分けの方法についてまとめていきます。
「OS管理割り込み」と「OS管理外割り込み」の特徴
OS管理割り込みの特徴は以下の通りになります。
- OSのシステムコールを使用できる
(割り込み中で使用できるものに限る) - 割り込み時に発生するオーバーヘッドが大きい
(割り込み発生時と終了時にOSのカーネル処理が必要になる)
一方、OS管理外割り込みはこれの反対の特徴を持ちます。
- OSのシステムコールが使用できない
- 最短で割り込み処理が実施できる
結局のところOS管理割り込みでは、割り込みでOSのシステムコールを使用できるようにした分、システムコールを使用するための準備が必要となるため、処理に時間がかかるということになります。
ここにもう一つ、OS管理割り込みよりもOS管理外割り込みの方の割り込みの優先度を高くしなければならないという制約事項もあります。
OS管理割り込みよりも低い優先度のOS管理外割り込みが発生した場合に、OS機能の整合性が取れなくなるのだと思われます。
割り込みの使い分け方
それでは2つの割り込みの使い分けについて見ていきましょう。
と言っても、基本的にはOS管理割り込みを使用してください。
OS管理外の割り込みを使用する条件は以下に限られます。
- 割り込みの頻度が高い場合
- 割り込みの周期が短い場合
これらはどちらもOS管理割り込みで発生するオーバーヘッドが許容できないケースとなります。
割り込みの頻度が高い場合
割り込みの頻度が高いというのは、(組み込みの設計における処理の周期によりますが)例えば1秒という長い周期の中で割り込みが大量に発生するケースとなります。
周期がそこまで短くなかったとしても、割り込み回数分のオーバーヘッドが発生した場合に全体のパフォーマンスを圧迫する恐れがあります。
ですので、パフォーマンス改善のためにOS管理外の割り込みを使用するという選択肢が出てきます。
(シリアル通信であれば、DMA転送などを使用するという選択肢もあります。)
割り込みの周期が短い場合
割り込みの周期が短い場合に発生する問題点は、割り込みのオーバーヘッドによって割り込み処理が短い周期に間に合わなくなることです。
通常、割り込みが発生してから次の割り込みが発生するまでに1つ目の割り込み処理を完了する必要があります。
しかし、周期が短すぎて処理が完了できない場合、割り込み処理がどんどん遅れていき、データの取りこぼしなどが発生する可能性があります。
対策としては、割り込み内の処理を軽くするというのが基本方針ではありますが、周期が短い場合はOS管理割り込みのオーバーヘッドが問題になる可能性も少なくありません。
ですので、周期が短い場合もOS管理外割り込みを使用する選択肢となり得ます。
OS管理外割り込みでタスクへの通知を行う方法
通常のパターンとしては、割り込みが発生してそれをトリガとしてタスクの処理を実施するというものが多いです。
しかし、上で書いたように、OS管理外割り込みではOSのシステムコールを使用することができないので、タスクへの通知を行うことができません。
こういった場合の1つの解決方法として、0秒タイマを使用するという方法があります。
例えば、OS管理外割り込みが複数回発生し、最後の割り込みでタスクへの通知を行いたい場合、最後の割り込みのタイミングであらかじめ0秒に設定したタイマをスタートさせます。
0秒に設定されているので、タイマがスタートされたらすぐにタイマ割り込みが発生します。
このタイマ割り込みがOS管理割り込みであればOSのシステムコールを使用することができるので、ここでタスクへの通知を行うという方法になります。
タイマが余っている場合にしか使用できない方法ですが、有効な方法ではあるので、あらかじめこの用途のためにタイマを確保しておくのも良いかと思います。
まとめ
OS管理割り込みとOS管理外割り込みの違いと使い分けについてまとめました。
使い分けの方針としては、
- 通常はOS管理割り込みを使用する
- 頻度が高い場合や周期が短い場合は、パフォーマンスと相談しながらOS管理外割り込みの使用を検討する
となります。
組み込みでパフォーマンスが厳しい場合に考慮しなければいけないものになりますので、組み込み開発をされる方はいつでも思い出せるように頭の片隅にでも入れておいてほしいと思います。