翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
タスクプールライブラリ
重要
これは、FreeRTOS リリース 202012.00 で使用する FreeRTOS ユーザーガイドのアーカイブ版です。このドキュメントの最新バージョンについては、FreeRTOS ユーザーガイドを参照してください。
概要
FreeRTOS では、FreeRTOS タスクプールライブラリでのタスク管理がサポートされます。タスクプールライブラリでは、バックグラウンドタスクをスケジュールでき、安全な、非同期のタスクスケジューリングおよびキャンセルができます。タスクプール API を使用して、パフォーマンスとメモリフットプリントとのトレードオフが最適になるように、アプリケーションのタスクを設定できます。
タスクプールライブラリは、タスクプールとタスクプールジョブという 2 つの主要なデータ構造上に構築されています。
タスクプール (IotTaskPool_t
)
タスクプールには、実行するジョブキューを管理するディスパッチキューが含まれていて、ジョブを実行するワーカースレッドを管理します。
タスクプールジョブ (IotTaskPoolJob_t
)
タスクプールジョブは、バックグラウンドジョブとして、または定期のバックグラウンドジョブとして実行できます。バックグラウンドジョブは先入れ先出しの順序で開始され、時間の制約はありません。定期のジョブはタイマーに従って、バックグラウンド実行がスケジュールされます。
注記
タスクプールでは、定期のジョブが、特定の時間内ではなく、タイムアウトが経過した後に実行されることのみが保証されます。
依存関係と要件
タスクプールライブラリには以下の依存関係があります。
-
スケジュールされたタスクプールと進行中のタスクプールのオペレーションのデータ構造を維持するためのリニアコンテナ (リスト/キュー) ライブラリ。
-
ログ記録ライブラリ (
IOT_LOG_LEVEL_TASKPOOL
構成設定がIOT_LOG_NONE
ではない場合)。 -
スレッド管理、タイマー、クロック関数などのために、オペレーティングシステムへのインターフェイスを提供するプラットフォームレイヤー。

機能
タスクプールライブラリ API を使用して、実行できる内容は以下のとおりです。
-
ライブラリのノンブロッキング API 関数で、即時のジョブと遅延ジョブをスケジュールします。
-
静的および動的に割り当てられたジョブを作成します。
-
システムのリソースに基づいて、ライブラリを設定し、パフォーマンスとフットプリントをスケールします。
-
動的にジョブを作成するとき、低いメモリオーバーヘッドに合わせてキャッシュをカスタマイズします。
トラブルシューティング
タスクプールライブラリ関数は、IotTaskPoolError_t
列挙値としてエラーコードを返します。各エラーコードの詳細については、タスクプール C SDK API リファレンスの IotTaskPoolError_t
列挙データ型のリファレンスドキュメントを参照してください。
使用制限
タスクプールライブラリは、割り込みサービスルーチン (ISR) からは使用できません。
ブロックオペレーション、特に、無期限ブロックオペレーションを実行するタスクプールユーザーのコールバックを使用しないことを強くお勧めします。長期にわたるブロックオペレーションは、実質的にタスクプールのスレッドを盗み、デッドロックまたはスタベーションが発生する可能性を生み出します。
初期化
アプリケーションは、タスクプールを使用する前に、IotTaskPool_CreateSystemTaskPool
を呼び出して、システムタスクプールのインスタンスを初期化する必要があります。アプリケーションは、ライブラリでタスクプールが使用される前、およびアプリケーションコードによりタスクプールにジョブが投稿される前の起動シーケンスで十分な初期に、システムレベルのタスクプールが初期化されることを確認する必要があります。起動直後に、システムですべてのライブラリが共有する単一のシステムレベルのタスクプールが初期化されます。初期化後、タスクプールハンドルを取得して、IOT_SYSTEM_TASKPOOL
API で使用できます。
注記
IotTaskPool_CreateSystemTaskPool
を呼び出しても、タスクプールデータ構造と状態を保持するためにメモリは割り当てられませんが、タスクプールのスレッドのような、依存エンティティとデータ構造を保持するためのメモリが割り当てられる場合があります。
API リファレンス
完全な API リファレンスについては、タスクプール C SDK API リファレンスを参照してください。
使用例
AWS IoT Device Defender メトリクスの定期的なコレクションをスケジュールする必要があり、タイマーを使用して MQTT 接続、サブスクライブ、パブリッシュ APIs。次のコードは、MQTT 接続から切断される切断コールバックを使用して、MQTT 全体の AWS IoT Device Defender メトリクスを受け入れるコールバック関数を定義します。
/* An example of a user context to pass to a callback through a task pool thread. */ typedef struct JobUserContext { uint32_t counter; } JobUserContext_t; /* An example of a user callback to invoke through a task pool thread. */ static void ExecutionCb( IotTaskPool_t * pTaskPool, IotTaskPoolJob_t * pJob, void * context ) { ( void )pTaskPool; ( void )pJob; JobUserContext_t * pUserContext = ( JobUserContext_t * )context; pUserContext->counter++; } void TaskPoolExample( ) { JobUserContext_t userContext = { 0 }; IotTaskPoolJob_t job; IotTaskPool_t * pTaskPool; IotTaskPoolError_t errorSchedule; /* Configure the task pool to hold at least two threads and three at the maximum. */ /* Provide proper stack size and priority per the application needs. */ const IotTaskPoolInfo_t tpInfo = { .minThreads = 2, .maxThreads = 3, .stackSize = 512, .priority = 0 }; /* Create a task pool. */ IotTaskPool_Create( &tpInfo, &pTaskPool ); /* Statically allocate one job, then schedule it. */ IotTaskPool_CreateJob( &ExecutionCb, &userContext, &job ); errorSchedule = IotTaskPool_Schedule( pTaskPool, &job, 0 ); switch ( errorSchedule ) { case IOT_TASKPOOL_SUCCESS: break; case IOT_TASKPOOL_BAD_PARAMETER: // Invalid parameters, such as a NULL handle, can trigger this error. case IOT_TASKPOOL_ILLEGAL_OPERATION: // Scheduling a job that was previously scheduled or destroyed could trigger this error. case IOT_TASKPOOL_NO_MEMORY: // Scheduling a with flag #IOT_TASKPOOL_JOB_HIGH_PRIORITY could trigger this error. case IOT_TASKPOOL_SHUTDOWN_IN_PROGRESS: // Scheduling a job after trying to destroy the task pool could trigger this error. // ASSERT break; default: // ASSERT*/ } /* ................................. */ /* ... Perform other operations ... */ /* ................................. */ IotTaskPool_Destroy( pTaskPool ); }