Previous: 3.11. タスクの削除(自身の削除) |
Up: 3. タスク管理 |
Next: 4. キュー |
サンプルプログラム |
freertos_task_delete_vTaskList |
FreeRTOSには、デバックの便宜のため、ある時点で起動しているタスクの一覧を表示させる機能があります。
この機能を利用するためには、予めFreeRTOS.hでconfigUSE_TRACE_FACILITYを1と定義しておきます。変更後ライブラリを再コンパイルしましょう。
#define configUSE_TRACE_FACILITY?????? 1 |
またこの機能を利用するためにはsyscall.cを一緒にコンパイルしておく必要があります。FreeRTOSにはオープンソースのsyscall.cが同梱されており、またサンプルプログラムのフォルダにも同じものを収録してありますので、これも一緒にコンパイルしておいてください。本書のmakefileを使用している場合には、プロジェクトのルートフォルダやsrcフォルダにsyscall.cをコピーしておけば、自動的にコンパイルされます。
サンプルプログラムを実行すると、以下のように表示されます。表示されたタスク名のリストは、左から、名称、状態、優先度、スタック領域の残量、FreeRTOSが管理する際のタスク番号を表しています。名称はxTaskCreate関数の引数pcNameで指定した名称です。登録したタスクの名称タスクの状態はRがReady状態、SがSuspended状態、BがBlocked状態、DがDeleted状態です。Suspended状態というのは、タスクの実行を一時停止させる命令であるvTaskSuspend関数によって一時停止させられている状態のことです。Deleted状態というのは、vTaskDelete関数でタスクが削除されて、カーネル上から登録が抹消される直前の状態のことです。スタック領域の残量については後述のメモリ管理の項を参照してください。
Hellow Cortex-M3/STM32 and FreeRTOS World! Expand your creativity and enjoy making.
Running:A
TaskA?????????? R?????? 3?????? 145???? 0 TaskB?????????? R?????? 2?????? 189???? 1 TaskC?????????? R?????? 1?????? 189???? 2 IDLE??????????? R?????? 0?????? 117???? 3 Running:B
TaskB?????????? R?????? 2?????? 161???? 1 TaskC?????????? R?????? 1?????? 189?? ??2 IDLE??????????? R?????? 0?????? 117???? 3 TaskA?????????? B?????? 3?????? 23????? 0 Running:C
TaskC?????????? R?????? 1?????? 145???? 2 IDLE??????????? R?????? 0?????? 117???? 3 TaskA?????????? B?????? 3?????? 23????? 0 TaskB?????????? B?????? 2????? ?23????? 1 Running:A TaskB deleted. Running:C
TaskC?????????? R?????? 1?????? 23????? 2 IDLE??????????? R?????? 0?????? 102???? 3 TaskA?????????? B?????? 3?????? 23????? 0 Running:A TaskC deleted.
TaskA?????????? R?????? 3?????? 23????? 0 IDLE?????????? ?R?????? 0?????? 102???? 3 TaskC?????????? D?????? 1?????? 23????? 2
|
このようなタスクの一覧を出力するためには、vTaskList関数を使用します。
関数名 |
vTaskList関数 |
|
関数プロトタイプ |
void vTaskList( portCHAR *pcWriteBuffer )
|
|
動作 |
タスクの一覧を出力します。 |
|
引数 |
*pcWriteBuffer |
出力を格納するバッファのポインタを指定します。 |
戻り値 |
無し。 |
vTaskList関数はそれ自体ではターミナル等への出力機能を持っていません。出力を一旦保管するバッファ(変数)を用意しておき、このバッファを指定してvTaskList関数を実行します。その後バッファの内容をターミナル等に出力すればよいわけです。
サンプルプログラムでは、以下のように、優先度の高いTaskAがTaskBとTaskCを削除しながら、その都度vTaskList関数でタスクのリストを出力しています。
cprintf(pcTaskName); vTaskList((signed portCHAR*)TxBuffer); cprintf(TxBuffer); vTaskDelay(30); cprintf(pcTaskName); vTaskDelete(xTaskBHandle); cprintf("TaskBdeleted.\r\n"); vTaskDelay(30); cprintf(pcTaskName); vTaskDelete(xTaskCHandle); cprintf("TaskCdeleted.\r\n"); vTaskList((signedportCHAR*)TxBuffer); cprintf(TxBuffer); vTaskDelete(NULL); |
このプログラムでは以下のように、vTaskList関数の出力を格納するための変数TxBufferを宣言しています。変数TxBufferを引数としてvTaskList関数を実行した時点で、変数TxBufferにタスクの一覧が格納されています。あとは、変数TxBufferの内容をcprintf関数等で出力すればよいだけです。ここではターミナルに表示させていますが、たとえばSDカードスロットを接続している場合には、SDカード内のテキストファイルに出力するということもできるでしょう。
int8_t TxBuffer[255]; |
Previous: 3.11. タスクの削除(自身の削除) |
Up: 3. タスク管理 |
Next: 4. キュー |