Previous: 3.6.5. vTaskDelayUntil |
Up: 3. タスク管理 |
Next: 3.8. 優先度の変更 |
サンプルプログラム |
freertos_IdleHook |
freertos_vTaskDelay_bothの例のように、カーネル登録されたすべてのタスクがBlocked状態になることがあります。このときにカーネル上ではタスクが一つも動作していないかというとそうではなく、Idleタスクというタスクが動作しています。Idleタスクは、その名の通り、「何もしない」「何の目的もない」タスクです。ソフトウェアでカーネルに登録されたタスクが一つでもあれば、Idleタスクはそのタスクに必ず劣後し、Ready状態になります。
Idleタスクが「何もしない」タスクですので、Idleタスクそのものの動作を指定することはできません。もっとも、Idleタスクが起動する際に、別に定めた一定の処理を実行させることができます。これがIdle Hook機能です。
Idle Hook機能が何のためにあるかというと、まず、Idleタスクが起動するということは、その間に起動するタスクが無い、つまりCPUの処理能力が空いているということになります。そこでIdleタスクが起動している時間を計測することにより、そのアプリケーションでのCPUの使用率(不使用率)を計測することができます。これでそのアプリケーションにもっと多くの機能を盛り込むことができるかということの判断の一助となります。またCPUの処理時間が空いているのであれば、マイコンの処理速度を落としても同様の処理が実現できる可能性があります。そこで、可能な場合には、クロック周波数を落とすなどしてマイコンの消費電力を抑えることができます。
このサンプルプログラムでは、Idle Hook機能を利用して、Idleタスク内部のループの回数を計測しています。
Idle Hook機能を利用する場合にはまずFreeRTOSConfig.h中でconfigUSE_IDLE_HOOKを1と定義しておきます。これでIdle Hook機能が有効になります。変更後はライブラリの再コンパイルを忘れないようにしてください。
#define configUSE_IDLE_HOOK???????????? 1 |
Idle Hook機能を使用しないプログラムを実行するときには、0に戻しておかないと”undefined reference to ‘vApplicationIdleHook’”というコンパイルエラーが発生しますので注意しましょう。
Idle Hook機能を有効にした場合、Idleタスクが起動して、Idleタスク内での無限ループが1サイクル繰り返される毎にvApplicationIdleHook関数が呼び出されます。vApplicationIdleHookはFreeRTOSの内部では定義されていません。ユーザーがアプリケーション中でvApplicationIdleHook関数を定義して必要な処理を記述すれば、Idle Hook時に希望の処理を行わせることができます。
サンプルプログラムでは、以下のように単純にvApplicationIdleHook関数が呼び出された回数をカウントしています。
void vApplicationIdleHook(void) { ? //configUSE_IDLE_HOOK in FreeRTOSConfig.h must be set to 1 to use this function ? idle_count++; } |
5ms毎に変数idle_countの内容を出力するようにしているので、実行結果は以下のようになります。
0 4598 9012 13427 17759 22091 .... |
この結果から見ると、このサンプルでは1msあたり900サイクル分ぐらいの空きがあるようです。vTaskDelay関数を使用すれば、タスクを何も実行しない場合のCPUの処理能力を計測することもできるでしょう。こういった数値を把握しておくと、アプリケーションを実際に組んだときに同じように余剰サイクル数を計測すれば、CPUの使用率を計算することができます
Previous: 3.6.5. vTaskDelayUntil |
Up: 3. タスク管理 |
Next: 3.8. 優先度の変更 |