Previous: 4.4. 複数の送信用タスクからのデータの受け取り |
Up: マイコン徹底入門:RTOS編:フリーのリアルタイムOS活用法 |
Next: 5.1. バイナリセマフォ |
マイコンでは割込み活用して処理を行うことが必須です。RTOSを使用する場合でも、割込み処理に適切に対応できる必要があります。
FreeRTOSは、コンテキストスイッチ自体は割込みを使用して行っていますが、そこから実行されるタスクはmainルーチンと同じ優先順位で実行されています。つまりFreeRTOSのタスクが実行中であっても、割込みが発生すれば、割込み処理が優先して処理されることになります。FreeRTOS内での優先順位がどれだけ高くても、割込みハンドラによる処理は、FreeRTOSのタスクよりも優先して処理されます。
そのためFreeRTOSを使用したい場合でも、割込みハンドラに希望の処理を記述していさえすれば、その処理を実行させることができます。
もっとも割込みハンドラとFreeRTOSを連携させることにより、より柔軟な処理が可能になります。たとえば、
・一つの割込み原因から複数のタスクを起動させる
←通常の割込みでは一つの割込みで処理できるルーチンは一つだけです
・割込みで発生した複数のタスクを並行して動作させる
←通常の割込みでは実行されるのはもっとも優先度が高い割込みだけです
・割込みで起動したタスクと割込み以外のタスクを並行して動作させる
←通常の割込みでは、割込み処理が常に割り込まれた側のルーチンに優先するので、割込み処理と割り込まれた側のルーチンが並行して動作することはありません。
といったことが可能になります。
特にある割込み原因から複数のタスクを起動できるという点は重要です。ある単一の割込み原因から発生する処理でも、優先度が高い処理と優先度が低い処理があり得ます。複数のタスクが起動できれば、それぞれのタスクに異なった優先順位を設定できます。
図 5?1 一つの割込みから優先度の異なるタスクを生成する
安全装置付きの石油ストーブを例に考えてみましょう。このストーブには、転倒したり衝撃を感じたりしたときに直ちに消火すると同時に、「緊急消火案内ランプ」を点滅する機能と一酸化炭素発生を検知したときに、「一酸化炭素発生。危険ですから換気してください。」という音声案内を繰り返す機能が備わっているとします。転倒と一酸化炭素発生を同時に検知したときに、優先順位が高いのは消火をすることです。そのため、CPU固有の割込み機能を使っているのであれば、転倒検知の割込みの優先順位を、一酸化炭素検知の割込みよりも優先順位が高くすることになります。
一方転倒検知後の「緊急消火案内ランプ」の点滅中に一酸化炭素の発生を検知したら、ランプ点滅よりも一酸化炭素発生の音声案内を優先して行わないといけません。しかし、転倒検知の割込みの優先順位の方が一酸化炭素発生検知の割込みよりも優先順位が高いので、転倒検知の結果行っているランプ点滅作業の優先順位の方が、一酸化炭素発生の音声案内よりも優先してしまいます。
そこで①消火、②「緊急消火案内ランプ」の点滅、③一酸化炭素発生の音声案内をRTOS上の別々のタスクとして構成し、割り込み優先度を①は「高」、②は「低」、③は「中」とします。タスク①と②は転倒検知割込みから起動され、タスク③は一酸化炭素検知割込みから起動します。すると転倒を検知してタスク①が実行された後、タスク②の実行中に、一酸化炭素発生を検知すれば、タスク③はタスク②に優先して実行されることになります。
そこでFreeRTOSが用意する、割込みとOSとの連携方法を見てみましょう。
Previous: 4.4. 複数の送信用タスクからのデータの受け取り |
Up: マイコン徹底入門:RTOS編:フリーのリアルタイムOS活用法 |
Next: 5.1. バイナリセマフォ |