情報はハードウェア ホームから取得されます:情報の概要 - FreeRTOS リアルタイム オペレーティング システム コース (マルチタスク管理)
目次
1. タスク通知の概念
1.コンセプト
FreeRTOS はバージョン V8.2.0 からタスク通知機能を提供しています。各タスクには 32 ビットの通知値があります。ほとんどの場合、タスク通知はバイナリ信号の代わりに使用できます。セマフォ、イベント グループ、および長さ 1 のキューを置き換えることもできます (32 ビット整数またはポインター値を保持できます)。
FreeRTOS カーネルによって通信されるリソースを使用するときにキュー、バイナリ セマフォ、カウント セマフォ、またはイベント グループを作成する必要があった以前の状況と比較すると、タスク通知の使用は明らかにより柔軟です。 FreeRTOS 関係者によると、タスク通知を使用すると、セマフォなどの ICP 通信方法を使用してタスクのブロックを解除するより 45% 高速および< a i=3 >RAM メモリ領域を節約し、タスク通知を使用するためにキューを作成する必要はありません。タスク通知を使用するには、FreeRTOSConfig.h のマクロ定義configUSE_TASK_NOTIFICATIONS を 1 に設定する必要があります。実際、FreeRTOS のデフォルトは 1 なので、タスク通知はデフォルトで利用可能です。
2. タスクに通知を送信する方法
> タスクに通知を送信します。未読の通知がある場合、通知の値は上書きされません。
> タスクに通知を送信し、通知値を直接上書きします。
>タスクに通知を送信し、通知値の 1 つ以上のビットを設定し、イベント グループとして使用できます。
> タスクに通知を送信し、通知値を増加させ、セマフォとして使用できます。
上記のタスク通知メソッドを合理的に使用することにより、FreeRTOS セマフォ、キュー、イベント グループなどを特定の状況で置き換えることができます。
3. タスク通知の利用制限
もちろん、すべてに長所と短所があります。メッセージ通知は処理が速く、RAM オーバーヘッドが少なくなりますが、次の制限もあります。 :
>通知を受け取るタスクを指定する必要があるため、通知メッセージを受け取ることができるタスクは 1 つだけです。
>通知を待っているタスクのみをブロックできます。通知を送信するタスクは、いかなる状況でも通知を送信し損なうことはありません。
そしてブロッキング状態に入ります。
2. タスク通知の動作仕組み
タスク通知はタスクに関連付けられたリソースであるため、タスクが作成されると、タスク通知も初期化されます。キューとセマフォを使用する前に、キューとセマフォは次のことを行う必要があることがわかっています。セマフォの目的は、xQueueCreate() 関数を使用してキューを作成したり、xSemaphoreCreateBinary() 関数を使用してバイナリ セマフォを作成したりするなど、キュー データ構造を作成することです。タスク通知をもう一度見てみましょう。タスク通知のデータ構造はタスク制御ブロックに含まれているため、タスクが存在する限り、タスク通知データ構造は作成されており、直接使用できるので、非常に便利です
タスク通知では、タスク内の指定されたタスクに通知を送信したり、割り込み内の指定されたタスクに通知を送信したりできます。 FreeRTOS の各タスクには 32 ビットの通知値があり、タスク制御ブロックのメンバー変数ulNotifiedValue が通知値です。通知を待機できるのはタスク内のみであり、割り込み内では待機できません。タスクが待機している通知が一時的に無効な場合、タスクはユーザーが指定したブロッキング タイムアウトに従ってブロッキング状態になります。通知を待っているタスクはコンシューマコンシューマとみなすことができます。 ;他のタスクと割り込みは、通知を待機しているタスクに通知を送信できます。通知を送信するタスクと割り込みサービス関数は、プロデューサーと見なすことができます。 .他のタスクまたは割り込みがこのタスクにタスク通知を送信し、タスクが通知された後、タスクはブロッキング状態から解放されます。これは、FreeRTOS のカーネルの他の通信メカニズムと一致します。
3. タスク通知のAPI関数
1. タスク通知のデータ構造
タスク通知はタスク制御ブロックのリソースであり、タスク制御ブロック内のメンバ変数に属します。
ulNotifiedValue: タスク通知値。32 ビット整数またはポインタ値を保存するために使用されます
ucNotifyState: タスクの通知ステータス。タスクの通知ステータスを識別するために使用されます。
2. よく使われるAPI関数
① バイナリセマフォとカウンティングセマフォを置き換える
タスク通知を送信します。
xTaskNotifyGive()
vTaskNotifyGiveFromISR()
タスク通知を取得します。
ulTaskNotifyTake()
②キューとイベントグループを長さ1に置き換えます。
タスク通知を送信します。
xTaskNotify()
vTaskNotifyFromISR()
タスク通知を取得します。
ulTaskNotifyWait()
3. 関数 xTaskNotifyGive()
①関数プロトタイプ
関数は次のとおりです。タスク内の指定されたタスクに通知を送信し、タスク通知値が 1 増加します。このメソッドはセマフォに使用されます。
②仮パラメータの説明
仮パラメータ 1: タスクハンドル
仮パラメータ 2: タスク通知値、0 として扱われます。
仮パラメータ 3: インクリメント操作を実装するタスク制御ブロック内の変数 ulNotifiedValue を示します。
形参4:空
③戻り値
タイムアウト機構はなく、常に pdPASS が返されます。
4. 関数ulTaskNotifyTake()
①関数プロトタイプ
関数は次のとおりです。 タスク内の通知を取得します。 xTaskNotifyGive() と組み合わせて使用され、バイナリ セマフォとカウント セマフォを置き換えるために使用されます。
②仮パラメータの説明
仮パラメータ 1: 終了時にカウントをクリアするかどうか。 pdTRUE->クリア、pdFALSE->1減算
仮パラメータ 2: タイムアウト時間、単位はシステムビート
③戻り値
タスク前のタスク通知値を返します。
5. 関数 xTaskNotify()
①関数プロトタイプ
機能は次のとおりです。タスク内の指定されたタスクに通知を送信し、eAction の値に基づいてさまざまな操作を完了します。
②仮パラメータの説明
仮パラメータ 1: タスクハンドル
仮パラメータ2:タスク通知値
仮パラメータ 3: 次の図
形参4: 空
③戻り値
上記仮引数第 3 の説明によれば、eSetValueWithoutOverwrite に設定した場合は pdFALSE を返すことができ、それ以外の場合は pdPASS を返すことになります。
6. 関数ulTaskNotifyWait()
①関数プロトタイプ
関数は次のとおりです。 タスク内の通知を取得します。xTaskNotify() と組み合わせて使用され、長さ 1 のキューとイベント グループを置き換えるのに使用されます。
②仮パラメータの説明
仮パラメータ 1: 関数開始時にクリアされるビット -> 0: 変更なし 1: 対応するビットをクリア
仮パラメータ 2: 関数終了時にクリアされるビット -> 0: 変更なし 1: 対応するビットをクリア
仮パラメータ 3: 通知値の保存
仮パラメータ 4: タイムアウト時間、単位はシステムビート
③戻り値
pdTRUE: タスク通知を正常に取得しました
pdFALSE: タスク通知の取得に失敗しました
7. 使用上の注意
4.タスク通知はバイナリセマフォを置き換えます
5. タスク通知はカウントセマフォを置き換えます
6. タスク通知がキューを置き換える
7. タスク通知がイベント グループに置き換わります