FreeRTOS之xTaskCreateStatic()

xTaskCreateStatic()関数の分析

task. h

 BaseType_t xTaskCreate(    TaskFunction_t pvTaskCode,
                            const char * const pcName,
                            configSTACK_DEPTH_TYPE usStackDepth,
                            void *pvParameters,
                            UBaseType_t uxPriority,
                            TaskHandle_t *pxCreatedTask
                          );

まとめ

新しいタスクインスタンスを作成します。
各タスクは、タスクの状態(タスク制御ブロック、またはTCB)を保存するためにRAMを必要とし、タスクによってそのスタックとして使用されます。タスクがxTaskCreate()を使用して作成された場合、FreeRTOSヒープからRAMを自動的に割り当てる必要があります。xTaskCreateStatic()を使用してタスクを作成する場合、アプリケーション作成者はRAMを提供します。これにより、2つの追加の関数パラメーターが生成されますが、コンパイル時に静的RAMを割り当てることができます。
新しく作成されたタスクは、最初は準備完了状態ですが、優先度の高いタスクを実行できない場合は、すぐに実行中のタスクになります。
タスクは、スケジューラーの開始前と開始後に作成できます。

パラメータ

パラメータ 機能
pvTaskCode タスクは終了しない単純なC関数であるため、通常は無限ループとして実装されます。pvTaskCodeパラメータは、タスクを実装する関数(実際には関数名)へのポインタにすぎません。
pcName タスクの説明的な名前。これは主にデバッグを容易にするために使用されますが、タスクハンドルを取得するためにxTaskGetHandle()を呼び出すために使用することもできます。アプリケーション定義の定数configMAX_TASK_NAME_LENは、名前の最大長をnullターミネーターを含めて文字数で定義します。指定された文字列の長さがこの最大値を超えると、文字列は自動的に切り捨てられます。
ulStackDepth puxStackBufferパラメータは、StackType_t変数の配列をxTaskCreateStatic()に渡すために使用されます。ulStackDepthは、配列内のインデックスの数に設定する必要があります。
pvParameters タスク関数は、タイプ "void to void"(void *)のパラメーターを受け入れます。pvParametersに割り当てられる値は、タスクに渡される値になります。このパラメーターのタイプは「voidを指すポインター」であり、タスクパラメーターが強制的に任意のタイプのパラメーターを効果的かつ間接的に受け取ることができるようにします。たとえば、タスクの作成時に整数型をvoidポインターに変換し、タスク関数定義自体でvoidポインターパラメーターを整数に戻すことで、整数型をタスク関数に渡すことができます。
uxPriority タスク実行の優先度を定義します。優先度は0(最低の優先度)から(configMAX_PRIORITIES-1)(最高の優先度)まで割り当てることができます。configMAX_PRIORITIESは、ユーザー定義の定数です。configUSE_PORT_OPTIMISED_TASK_SELECTIONが0に設定されている場合、使用可能な優先度の数に上限はありません(使用されるデータタイプの制限と使用可能なRAMマイクロコントローラーを除く)。ただし、メモリの浪費を避けるために必要な最低限の優先度を使用することをお勧めします。上記のuxPriority値(configMAX_PRIORITIES-1)を渡すと、タスクに割り当てられた優先度が有効な最大値に暗黙的に制限されます。
puxStackBuffer 少なくともulStackDepthインデックスを持つStackType_t変数の配列を指す必要があります(上記のulStackDepthパラメータを参照)。配列は、作成されたタスクのスタックとして使用されるため、永続的である必要があります(関数によって作成されたスタックフレーム、またはアプリケーションの実行時に正当に上書きできる他のメモリでは宣言できません)
pxTaskBuffer StaticTask_t型の変数を指す必要があります。この変数は、作成されたタスクのデータ構造(TCB)を保存するために使用されるため、永続的である必要があります(関数によって作成されたスタックフレームや、アプリケーションの実行時に合法的に上書きできる他のメモリでは宣言しないでください)の)。

戻り値

戻り値 意味
なし puxStackBufferまたはpxTaskBufferが空であるため、タスクを作成できません
その他の値 null以外の値が返される場合、タスクが作成され、戻り値は作成されたタスクのハンドルです。

ルーチンを使用する

/* Task to be created. */
void vTaskCode( void * pvParameters )
{
    /* The parameter value is expected to be 1 as 1 is passed in the
    pvParameters value in the call to xTaskCreate() below. 
    configASSERT( ( ( uint32_t ) pvParameters ) == 1 );

    for( ;; )
    {
        /* Task code goes here. */
    }
}

/* Function that creates a task. */
void vOtherFunction( void )
{
BaseType_t xReturned;
TaskHandle_t xHandle = NULL;

    /* Create the task, storing the handle. */
    xReturned = xTaskCreate(
                    vTaskCode,       /* Function that implements the task. */
                    "NAME",          /* Text name for the task. */
                    STACK_SIZE,      /* Stack size in words, not bytes. */
                    ( void * ) 1,    /* Parameter passed into the task. */
                    tskIDLE_PRIORITY,/* Priority at which the task is created. */
                    &xHandle );      /* Used to pass out the created task's handle. */

    if( xReturned == pdPASS )
    {
        /* The task was created.  Use the task's handle to delete the task. */
        vTaskDelete( xHandle );
    }
}

解説

FreeRTOSConfig.hでは、configSUPPORT_DYNAMIC_ALLOCATIONを1(動的メモリアプリケーションをサポート)に設定するか、この関数を使用可能にするために単に未定義にする必要があります。

フリートスはもっとエキサイティング

公開された163元の記事 ウォンの賞賛183 ビュー120 000 +

おすすめ

転載: blog.csdn.net/qq_31339221/article/details/102648040