タスク生成

[API]

Modules
* xTaskCreate タスクの生成
* vTaskDelete  タスクの削除

詳細な記述

xTaskHandle
task. h

タスク参照型
例えば、 xTaskCreate へのコールで(ポインタによって)パラメータとしてxTaskHandle 変数を返します。これは vTaskDelete でタスクを削除するために使用することができる。


xTaskCreate タスクの生成

[Task Creation]

task.h

portBASE_TYPE xTaskCreate( 
                            pdTASK_CODE pvTaskCode, 
                            const portCHAR * const pcName, 
                            unsigned portSHORT usStackDepth, 
                            void *pvParameters, 
                            unsigned portBASE_TYPE uxPriority, 
                            xTaskHandle *pvCreatedTask 
                          );

 新しいタスクを作成し、準備完了タスクリストに加える。
 もしFreeRTOS-MPU を使っているなら、 xTaskCreate() の代わりに xTaskCreateRestricted() を使うことを推奨します。 FreeRTOS-MPU で xTaskCreate() はPrivileged 及びユーザモードで実行可能なタスクの作成をします(下の uxPriority の記述参照)。 特権モード・タスクの場合、全メモリマップへのアクセス権を持ちます、またユーザモードが使われるとき、タスクは自身のスタックだけのアクセス権を持つ。 両方のケースで、標準的な FreeRTOS スタックオーバフロー探知スキームは使えるが、 おそらく、MPU は自動的にスタックオーバフローをとらえる事は出来ない。
xTaskCreateRestricted() の方がより柔軟性があります。

パラメータ:

pvTaskCode   タスク関数のエントリー・ポインタ。
 タスクは決して retun する事なく(すなわち継続するループで)実行されなくてはなりません。

pcName   タスクの説明的な名前。
 これは主にデバッグすることを容易にするために使われます。 名前の最大長はconfigMAX_TASK_NAME_LEN によって定義されます。

usStackDepth  タスクスタックの大きさ−バイト量ではなく、スタックで使用される変数の量。 例えば、もしスタックが幅16ビットで usStackDepth が100と定義されるなら、200バイトがスタック記憶装置に割り当てられる。 スタック幅とスタック深さの積はタイプ size_t の変数が表現できる最大値を超えてはなりません。

pvParameters   、作成されるタスクのパラメータとして使用するポインタ。

uxPriority   タスクが走るべきである優先権。

優先度パラメータのビット portPRIVILEGE_BIT をセットすることによって、 システムはMPU サポートを含む特権(システム)モード・オプションとしてタスクを作成することができます。 例えば、優先度2でプリビリッジ(特権を与えられた)タスクを作成するために、 uxPriority パラメータは(2| portPRIVILEGE_BIT)にセットする。

pvCreatedTask    これによって作成されたタスクを参照することができまるハンドルを返す。

returns:    もしタスクの生成が成功し実行可能リストへ追加したならpdPASSが返る、さもなければファイル projdefs. hで定義されたエラーエラーコードが返る。

使用例

// Task to be created.
void vTaskCode( void * pvParameters )
{
  for( ;; )
  {
    // Task code goes here.
  }
}

// Function that creates a task.
void vOtherFunction( void )
{
static unsigned char ucParameterToPass;
xTaskHandle xHandle;

  // Create the task, storing the handle. Note that the passed parameter ucParameterToPass
  // must exist for the lifetime of the task, so in this case is declared static. If it was just an
  // an automatic stack variable it might no longer exist, or at least have been corrupted, by the time
  // the new task attempts to access it.
  xTaskCreate( vTaskCode, "NAME", STACK_SIZE, &ucParameterToPass, tskIDLE_PRIORITY, &xHandle );
  // Use the handle to delete the task.
  vTaskDelete( xHandle );
}

vTaskDelete タスクの削除

[Task Creation]

task.h

void vTaskDelete( xTaskHandle pxTask );

INCLUDE_vTaskDelete はこの機能を利用可能とするために1と定義しなければならない。 もっと多くの情報を得るにはにコンフィグレーション・セクションを見てください。

タスクを RTOS リアルタイムカーネルマネジメントから取り除く。
全ての実行可能、ブロック、サスペンド及びイベント・リストから、このタスクを削除する。

ノート:
 アイドル・タスクはデリートされたタスクがアサインしていたメモリをカーネルから取り除く責任があるので注意。 アプリケーションが vTaskDelete () へのコールをする時、アイドル・タスクがマイクロコントローラーの実行時間を得るようにすることは、そのために重要です。
 タスクのコードによって割り当てられたメモリは自動的には解放されません、従って、タスクをデリートする前に、解放しなければならない。

vTaskDelete () のサンプルコードのためのデモアプリケーションファイル death. cを参照してください。

パラメータ: pxTask   削除すべきタスクのハンドル。タスクをデリートされると呼び出し側にはNULLが返る。

使用例:

void vOtherFunction( void )
{
xTaskHandle xHandle;

  // Create the task, storing the handle.
  xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY,  &xHandle );
  
  // Use the handle to delete the task.
  vTaskDelete( xHandle );
}