RTOS使用時に図を使って設計する
RTOSを使用してアプリケーション(製品)を設計する場合、まずアプリケーションを複数のタスク(スレッドとも呼ばれる)に分割し、各タスクがアプリケーションの担当部分を処理するようにします。私がRTOSを使い始めた当初は、図1に示すように、各タスクとISRの関係を図で表す手法を学びました。このようなタイプの図は、アプリケーション全体を把握し、タスクとISRの相互作用を明確にするのに役立ちました。本稿では、この概念について紹介します。
図1. 血圧モニタにおけるタスクとISRの相互作用
この図は、医療用アプリケーションとKinetis ARM Cortex-M4 MCUについて書かれたに『μC/OS-III』という本(ISBN 978-0-9823375-2-3)から引用したものです。この本のPDF版はhttps://www.weston-embedded.com/micrium-booksから無料でダウンロードできます。また、書籍はAmazon.comで購入できます。
この図ではタスクが円で示されており、ISRが楕円、外部ハードウェアが長方形、MCUの内部ハードウェアが角丸長方形で示されています。情報の流れと、必要な操作を実行するのに使われる関数と変数の一部は矢印で示されています。砂時計型の記号は、RTOS API呼び出しのタイムアウトまたは時間遅延を表します(つまりスリープ)。さらに、カッコ内の数字は、別途記載のこの図の説明文を参照するために使われます。どの程度の情報をこの図に示すかは設計者次第です。この図に基づいてアプリケーションを設計する場合は、自身で必要と思うできる限りの詳細を示すべきであるというのが私の考えです。
たとえば図2は、タスク名、優先度、およびそのタスクに必要と思われるスタックスペースなどの情報を書き込めることを示しています。ここでは慣例に従い、タスク名の上にタスクの優先度を、下の角カッコの中にスタックサイズを示しています。角カッコはスタックが配列であることを示しています。このような図を使って設計を行う場合、手始めにタスク優先度とスタックサイズの実際値を書き込むことで、設計の手がかりを得ることができます(というより得る必要があります)。これにより、優先度の割当て方法や必要なスタックスペース(およびRAM)について検討しやすくなります。但しスタックサイズについては、バイト数ではなく、スタック要素数で表すことをお奨めします。スタック要素は、使用するCPUに応じて1バイト、2バイト、4バイト、または8バイト幅とすることができます。したがって32ビットCPUの場合、[256]は1024バイトを表します。
図2. タスクの表現(実際値を使用)
最終的にこれらの実際値は、図3に示すように#define定数に置き換えることができます。また、タスク名にはサフィックスを使用することを推奨します。これは、タスクコード自体(NameTask())を、TCB(NameTCB)やタスクスタック(NameStk[])などのタスク関連オブジェクトと識別するためです。以下に例を挙げます(μC/OS-IIIの場合)。
#define NAME_TASK_PRIO 10
OS_TCB NameTCB;
CPU_STK NameStk[NAME_STK_SIZE];
void NameTask (void *p_arg)
{
// Task initialization
while (1) {
// Task Body
}
}
図3. タスクの表現(識別子を使用)
ISRについても同様に、図4に示すようにISRの名前やハードウェア優先度、割込みデバイスに対応するベクトル番号などの情報を示すことができます。この場合も、アプリケーション全体を十分に理解できた後、それらの定数を#defineに置き換えることができます。
図4. ISRの表現
上図でタスクとISRを色分けしたように、オブジェクトを色分けすれば、より多くの情報を盛り込むことができます。図に使用できる他のRTOSオブジェクトの例を図5に示します。もちろん、色分けをするかどうかは任意であり、使用しているRTOSでさらに多くのオブジェクトを追加できる場合は、より多くのアイコンが必要になります。
図5. 追加できるRTOSオブジェクト
私は通常、大きな紙と鉛筆、そして消しゴムを使って原案を描き始めます。紙と鉛筆の代わりにiPadとApple Pencilを使えば、図を追加したり便利な作画機能を使用することができます。先ずI/OデバイスとISR、そしてタスクのみを配置します。電気配線図と同じように入力とISRは左側、出力は右側に配置し、フローは左から右、上から下に向かって描きます。図にテキストを書き込むのは、アプリケーションを十分に理解できてからです。テキストは図を補完するために使用します。
図の情報は細か過ぎず、過不足のないようにすることが大事です。経験を積んでいくうちに、あなたとチームにとってどの程度が最適なのかがわかってくるでしょう。図を参照するのがあなただけなのか、それとも、あなた以外のチームメンバも使うのかによって、手書きの図をそのまま使うのか、あるいは清書して長期的に使用するかを決めてください。非常に単純な図もありますが、コード作成時に参考にしたり、アップデートしながら使うこともあるでしょう。
著者について
本稿は、RTOSを使用したアプリケーション開発をテーマとしたシリーズの一部です。
Jean Labrosse(ジーン・ラブロス)氏は、Micriumの創設者であり、広く普及しているuC/OS-IIおよびuC/OS-IIIカーネルの作成者です。組込みソフトウェアのuC/ラインの発展のために積極的に取り組んでいます。
組込みシステム市場での豊富な経験を有し、市場を知り尽くしているLabrosse氏は、Weston Embedded Solutionsの主席アドバイザおよびコンサルタントとして、現行のRTOS製品の将来的な方向性の策定に尽力しています。Weston Embedded Solutionsは、Micriumのコードベースから生まれた信頼性の高いCesium RTOSファミリー製品のサポートと開発を専門としています。