FreeRTOS (タスク通知)

情報はハードウェア ホームから取得されます:情報の概要 - FreeRTOS リアルタイム オペレーティング システム コース (マルチタスク管理)

目次

1. タスク通知の概念

1.コンセプト

2. タスクに通知を送信する方法

3. タスク通知の利用制限

2. タスク通知の動作仕組み

3. タスク通知のAPI関数

1. タスク通知のデータ構造

2. よく使われるAPI関数

3. 関数 xTaskNotifyGive()

4. 関数ulTask​​NotifyTake()

5. 関数 xTaskNotify()

6. 関数ulTask​​NotifyWait()

7. 使用上の注意

4.タスク通知はバイナリセマフォを置き換えます

5. タスク通知はカウントセマフォを置き換えます

6. タスク通知がキューを置き換える

7. タスク通知がイベント グループに置き換わります


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()

タスク通知を取得します。

ulTask​​NotifyTake()

②キューとイベントグループを長さ1に置き換えます。

タスク通知を送信します。

xTaskNotify()

vTaskNotifyFromISR()

タスク通知を取得します。

ulTask​​NotifyWait()

3. 関数 xTaskNotifyGive()

①関数プロトタイプ

 関数は次のとおりです。タスク内の指定されたタスクに通知を送信し、タスク通知値が 1 増加します。このメソッドはセマフォに使用されます。

②仮パラメータの説明

仮パラメータ 1: タスクハンドル

仮パラメータ 2: タスク通知値、0 として扱われます。

仮パラメータ 3: インクリメント操作を実装するタスク制御ブロック内の変数 ulNotifiedValue を示します。

形参4:空

③戻り値

タイムアウト機構はなく、常に pdPASS が返されます。

4. 関数ulTask​​NotifyTake()

①関数プロトタイプ

関数は次のとおりです。 タスク内の通知を取得します。 xTaskNotifyGive() と組み合わせて使用​​され、バイナリ セマフォとカウント セマフォを置き換えるために使用されます。

②仮パラメータの説明

仮パラメータ 1: 終了時にカウントをクリアするかどうか。 pdTRUE->クリア、pdFALSE->1減算

仮パラメータ 2: タイムアウト時間、単位はシステムビート

③戻り値

タスク前のタスク通知値を返します。

5. 関数 xTaskNotify()

①関数プロトタイプ

機能は次のとおりです。タスク内の指定されたタスクに通知を送信し、eAction の値に基づいてさまざまな操作を完了します。

②仮パラメータの説明

仮パラメータ 1: タスクハンドル

仮パラメータ2:タスク通知値

仮パラメータ 3: 次の図

形参4: 空

③戻り値

上記仮引数第 3 の説明によれば、eSetValueWithoutOverwrite に設定した場合は pdFALSE を返すことができ、それ以外の場合は pdPASS を返すことになります。

6. 関数ulTask​​NotifyWait()

①関数プロトタイプ

関数は次のとおりです。 タスク内の通知を取得します。xTaskNotify() と組み合わせて使用​​され、長さ 1 のキューとイベント グループを置き換えるのに使用されます。

②仮パラメータの説明

仮パラメータ 1: 関数開始時にクリアされるビット -> 0: 変更なし 1: 対応するビットをクリア

仮パラメータ 2: 関数終了時にクリアされるビット -> 0: 変更なし 1: 対応するビットをクリア

仮パラメータ 3: 通知値の保存

仮パラメータ 4: タイムアウト時間、単位はシステムビート

③戻り値

pdTRUE: タスク通知を正常に取得しました

pdFALSE: タスク通知の取得に失敗しました

7. 使用上の注意

4.タスク通知はバイナリセマフォを置き換えます

5. タスク通知はカウントセマフォを置き換えます

 

 

6. タスク通知がキューを置き換える

 

 

7. タスク通知がイベント グループに置き換わります

 

 

おすすめ

転載: blog.csdn.net/qq_57594025/article/details/132278825