main ループ、RTOS の機能と実行
この RTOS は TCB(Task Context Block) に関連する機能のみを提供します。TCB に関連する機能は ClSimpleTCB クラスに纏めてあります。
ディレー・中断・再開の機能をタスクにもたらすために、クラス ClSimpleTCB を継承したタスク・クラスを作ります。これにより以下の機能をタスクが使用できるようになります。
- タスクの生成消滅 -- C++ プログラム・コードではコンストラクタとデストラクタで生成と消滅を行わせている
- タスクの開始と、終了
- wait 機能(C++ のデフォルト引数を使い、wait(.) のみで delay と suspend の両方の機能を持たせる)。
- wait 状態のタスクの再開
タスクの複数が集まって、タスク・リストを作ります。タスク・リストへの追加や取り外しは ClSimpleTCB のコンストラクタ、デストラクタが行います。
タスク・リストに対しポーリング処理、ディレー処理、タスクへのコンテキスト・スイッチ処理が必要となります。RTOS はこれらへのインターフェースを用意します。実際に動作させるのはユーザーが記述する main ルーチン、main ループです。ClSimpleTCB が動作する環境はユーザーが記述します。
- main ルーチンはユーザーが記述します
- main ループもユーザーが記述します。 RTOS は main ループの存在を前提としています。
- 割り込みルーチンはユーザーが記述します。この RTOS はタイマー処理も含めて、一切の割り込みコードを記述しません。
- ClSimpleTCB が行うディレー処理、ポーリング処理は main ループの中から、それらに関連する処理を呼び出すことで実行されます。
- 、main ループを実行する度に、タスクのポーリングを呼び出すことで、タスクのポーリングは実行されます。
- 具体的には void ClSimpleTCB::pollingTCBList() 関数を呼び出します。
- ディレーで必要となる処理は、ユーザーが一定タイミング毎にディレー処理を呼び出すことでおこないます。
- 具体的には void ClSimpleTCB::tickTCBList() 関数を呼び出します。この関数はタイマー・割り込みルーチンの中から直接呼び出してはいけません。
- レディー状態になったタスクを実行するために main ルーチンのたびに下の関数を呼び出します。ユーザーがこの関数を明示的に呼び出さないと、タスクは実行されません。
- void ClSimpleTCB::executeReadyTCBList() 関数
RTOS を動かす main ルーチン、ベース・プログラムはユーザーが記述します。これが記述されていないと、この RTOS は動作しません。
main ルーチン
初期化
main loop
│個々のタスクに備えた void pollingTCBList();───────┐
│polling 関数の呼び出し │
│ ↓
│ディレー値の減算処理 void tickTCBList(); ───────┐
│ ↓
│レディ状態のタスクを void executeReadyTCBList()─────┐
│実行する │
│ │
│ ┌──────────────┤
│ │ │
│ ↓ ↓
loopend task 1 task N
┌──────────┐ ┌──────────┐
│TCB instanse 1 │ │ TCB instans N │
└──────────┘ └──────────┘
┌──────────┐ ┌──────────┐
│polling routine 1 │ │ polling routine N │
└──────────┘ └──────────┘
┌──────────┐ ┌──────────┐
│task delay 1 │ │ task delay N │
└──────────┘ └──────────┘
この RTOS が今までの RTOS との際立った違いは次の点です。
- タスク・ポーリング関数を導入する
- 割り込みルーチンからのタスク制御を禁止する
これらによって TCB のデータ構造を単純化できるようになります。そして RAM の消費が少ない、ワンチップ・マイコンでの RTOS が実現できます。