FreeRTOS ソフトウェア タイマー | FreeRTOS Thirteen

目次

例証します:

1. タイマーの概要

1.1. タイマー

1.2. ソフトウェアタイマー

1.3. ハードウェアタイマー

1.4. FreeRTOS ソフトウェアタイマー

1.5. ソフトウェアタイマーサービスタスクの機能

1.6. ソフトウェアタイマーコマンドキュー

1.7. ソフトウェアタイマー関連の設定

1.8. ワンショットタイマーと周期タイマー

1.9. ソフトウェアタイマーの構造

2. ソフトウェアタイマー関連のAPI関数

2.1. ソフトウェアタイマー機能の作成

2.2. ソフトウェアタイマー機能を有効にする

2.3. ソフトウェアタイマー機能の停止

2.4. リセットソフトウェアタイマー機能

2.5. ソフトウェアタイマータイムアウト機能の変更

2.6. ソフトウェアタイマー機能の削除


例証します:

内容について:

        1) 以下の内容は主に概念的な理解とステップ分析です。

        2) 個人的なサンプルコードはまだありませんので、FreeRTOS の公式サンプルコードを使用します。

        3) テスト用コードを移植したい場合は、以下のコンテンツに個人的なテスト用サンプルコードはありませんので、他を探してください。

その他について:

        1) オペレーティングシステム: win10

        2) プラットフォーム: keil 5 mdk

        3) 言語: C 言語

        4) ボード:STM32シリーズをFreeRTOSに移植

1. タイマーの概要

1.1. タイマー

        指定した時間から開始し、指定した時間が経過するとタイムアウト イベントがトリガーされ、ユーザーはタイマー期間をカスタマイズできます。

1.2. ソフトウェアタイマー

        タイミングを設定できるタイミング機能を備えたソフトウェアのことで、指定した時間になるとコールバック関数(タイムアウト関数とも呼ばれます)が呼び出され、ユーザーはコールバック関数内の情報を処理します

アドバンテージ:

        1) ハードウェア タイマーの数は限られており、理論的には、十分なメモリがある限り、複数のソフトウェア タイマーを作成できます。

        2) 使いやすく、低コスト。

欠点:

        1) ソフトウェア タイマーはハードウェア タイマーほど正確ではありません (システム クロックに基づいており、システム クロックの割り込み優先順位が最も低く、割り込みされやすいため)。高い精度が必要な場合には、ソフトウェアタイマーの使用はお勧めしません。

1.3. ハードウェアタイマー

チップ自体にタイマー モジュールが付属しています。ハードウェア タイマーは非常に高い精度を持っています (ソフトウェア タイマーよりも高い)。タイマーが到着するたびに、自動的に割り込みがトリガーされます。ユーザーは割り込みサービス関数        で情報を処理します

1.4. FreeRTOS ソフトウェアタイマー

特徴:

        1) カット可能 ソフトウェア タイマーはカット可能で設定可能な機能です。ソフトウェア タイマーを有効にしたい場合は、マクロ定義を設定する必要があります: configUSE_TIMERT 設定項目を 1 に設定します (使用しない場合は 0 に設定します)。

        2) 単一および周期的なソフトウェア タイマーは、単一タイマーまたは周期的タイマーの設定をサポートします。

注意点:

        1) ソフトウェアタイマのタイムアウトコールバック関数は、ソフトウェアタイマサービスタスクから呼び出されます ソフトウェアタイマのタイムアウトコールバック関数自体はタスクではないため、コールバック関数内でタスクブロッキングの原因となる API 関数を使用することはできません。

        2) ソフトウェア タイマー サービス タスク: vTaskStartScheduler()関数を呼び出してタスク スケジューラを起動すると、ソフトウェア タイマーを管理するタスクが作成されます (これを --> ソフトウェア タイマー サービス タスクと呼びます)。

1.5. ソフトウェアタイマーサービスタスクの機能

        1) ソフトウェアタイマータイムアウトの論理的判断を担当します。

        2) タイムアウト ソフトウェア タイマーのタイムアウト コールバック関数を呼び出します。

        3) ソフトウェアタイマーコマンドキューを処理します。

1.6. ソフトウェアタイマーコマンドキュー

        FreeRTOS は、ソフトウェア タイマーに関連する多くの API 関数を提供します。これらの API 関数のほとんどは、メッセージをタイマー キューに書き込みます (基本的にコマンドの送信)。このキューはソフトウェア タイマー コマンド キューと呼ばれ、FreeRTOS に提​​供されます。ソフトウェア タイマーによって使用され、アクセスできませんユーザーから直接。

例: タスクを定義してタイマーを開始します (API 関数がソフトウェア タイマー コマンド キューにメッセージを書き込み、コマンドを送信します) --> ソフトウェア タイマー コマンド キュー --> ソフトウェア タイマー タスクがソフトウェア タイマー コマンド キュー メッセージを読み取ります (コマンドを受信)。

1.7. ソフトウェアタイマー関連の設定

        1) ソフトウェアタイマーを有効にしたい場合は、マクロ定義: configUSE_TIMERT 設定項目を 1 に設定する必要があります (使用しない場合は 0 に設定します) タスクスケジューラの起動時に、サービス/デーモンタスク prvTimerTask()ソフトウェアタイマーは自動的に作成されます。

        2) ソフトウェア タイマー サービス タスクの優先度は configTIMER_TASK_PRIORITY=31 (最大タスク優先度) です。

        3) タイマーのコマンドキューの長さは configTIMER_QUEUE_LENGTH=5 です。

注意点:

        1) ソフトウェア タイマーのタイムアウト コールバック関数は、ソフトウェア タイマー サービス タスクで呼び出されます。サービス タスクは特定のタイマーの処理専用ではありません。他のタイマーも処理するため、タイマー コールバック関数 --> 他のタイマーには影響しません。つまり、タスクをブロックする API 関数 (vTaskDelay() など) を呼び出さないでください。

        2) ゼロ以外のブロッキングタイムでキューまたはセマフォにアクセスする API 関数は呼び出すことができません。

ソフトウェアタイマーのステータス:

        1) スリープ状態: ソフトウェア タイマーはハンドルを通じて参照できますが、実行されていないため、タイムアウト コールバック関数は実行されません。

        2) 実行状態: 実行状態のタイマーが指定された時間に達すると、タイムアウト コールバック関数が呼び出されます。

注: 新しく作成されたソフトウェア タイマーは休止状態、つまり実行されていません。

では、ソフトウェアタイマーをスリープ状態から実行状態に変更するにはどうすればよいでしょうか?

        コマンドキューを送信してください!

1.8. ワンショットタイマーと周期タイマー

        1) シングル タイマー: シングル タイマーがタイムアウトすると、ソフトウェア タイマー タイムアウト コールバック関数が 1 回実行され、タイマーは自動的に再起動されませんが、手動で再起動できます。

        2) 定期タイマー: 定期タイマーは一度開始されると、コールバック関数の実行後に自動的に再起動され、それによってソフトウェア タイマー コールバック関数が定期的に実行されます。

1.9. ソフトウェアタイマーの構造

構造体のメンバー:

    typedef struct tmrTimerControl                
    {         const char * pcTimerName;                           ListItem_t xTimerListItem;                          TickType_t xTimerPeriodInTicks;                    void * pvTimerID;                                   TimerCallbackFunction_t pxCallbackFunction;         #if ( configUSE_TRACE_FACILITY == 1 )             UBaseType_t uxTimerNumber;                      #endif         uint8_t ucStatus;                              xTIMER;









意味:

名前、pcTimerName、意味: ソフトウェア タイマー名

名前、xTimerListItem、意味: タイマー リスト項目

名前、xTimerPeriodInTicks、意味: ソフトウェア タイマー期間

名前、pvTimerID、意味: ソフトウェア タイマー ID --> 異なるタイマーを区別する

名前、pxCallbackFunction、意味: ソフトウェア タイマー コールバック関数

名前、uxTimerNumber、意味: ソフトウェア タイマー番号、デバッグに使用されます。

名前、ucStatus、意味: ソフトウェア タイマーのステータス

2. ソフトウェアタイマー関連のAPI関数

2.1. ソフトウェアタイマー機能の作成

関数実装を動的に作成します。

        TimerHandle_t xTimerCreate( const char * const pcTimerName,
                                    const TickType_t xTimerPeriodInTicks,
                                    const UBaseType_t uxAutoReload,
                                    void * const pvTimerID,
                                    TimerCallbackFunction_t pxCallbackFunction );

パラメータの意味:

名前、pcTimerName、意味: ソフトウェア タイマー名

名前、xTimerPeriodInTicks、意味: スケジュールされたタイムアウト時間、単位: システム クロック ビート

名前、uxAutoReload、意味: タイマー モード、pdTRUE: 定期タイマー、pdFALSE: 単発タイマー

名前、pvTimerID、意味: ソフトウェア タイマー ID。コールバック関数を共有するときに複数のソフトウェア タイマーを区別するために使用されます。

名前、pxCallbackFunction、意味: ソフトウェア タイマー タイムアウト コールバック関数

戻り値の意味:

戻り値、NULL、意味: ソフトウェア タイマーの作成に失敗しました

戻り値、その他の値、意味: ソフトウェア タイマーが正常に作成され、ハンドルが返される

2.2. ソフトウェアタイマー機能を有効にする

コード:

BaseType_t xTimerStart( TimerHandle_t xTimer, TickType_t xTicksToWait );

パラメータの意味:

名前、xTimer、意味: 開始されるソフトウェア タイマーのハンドル

名前、xTicksToWait、意味: ソフトウェア タイマー コマンド キューにコマンドを送信するための最大待機時間

戻り値の意味:

戻り値、pdPASS、意味: ソフトウェア タイマーが正常に開始されました

戻り値、pdFAIL、意味: ソフトウェア タイマーの開始に失敗しました

2.3. ソフトウェアタイマー機能の停止

コード:

BaseType_t xTimerStop( TimerHandle_t xTimer, TickType_t xTicksToWait );

パラメータの意味:

名前、xTimer、意味: 停止するソフトウェア タイマーのハンドル

名前、xTicksToWait、意味: ソフトウェア タイマー コマンド キューにコマンドを送信するための最大待機時間

戻り値の意味:

戻り値、pdPASS、意味: ソフトウェア タイマーが正常に停止しました

戻り値、pdFAIL、意味: ソフトウェア タイマーの停止に失敗しました

2.4. リセットソフトウェアタイマー機能

コード:

BaseType_t xTimerReset( TimerHandle_t xTimer, TickType_t xTicksToWait );

パラメータの意味:

名前、xTimer、意味: リセットされるソフトウェア タイマー ハンドル

名前、xTicksToWait、意味: ソフトウェア タイマー コマンド キューにコマンドを送信するための最大待機時間

戻り値の意味:

戻り値、pdPASS、意味: ソフトウェア タイマー リセット成功

戻り値、pdFAIL、意味: ソフトウェア タイマー リセットが失敗しました

例証します:

        この機能により、ソフトウェアタイマーによる計時再開が可能となり、リセット後、ソフトウェアタイマーは再び0時間単位からカウントを開始します。

2.5. ソフトウェアタイマータイムアウト機能の変更

コード:

BaseType_t xTimerChangePeriod( TimerHandle_t xTimer,
                                                           TickType_t xNewPeriod,
                                                           TickType_t xTicksToWait );

パラメータの意味:

名前、xTimer、意味: 更新されるソフトウェア タイマー ハンドル

名前、xNewPeriod、意味: 新しいスケジュールされたタイムアウト、単位: システム クロック ビート

名前、xTicksToWait、意味: ソフトウェア タイマー コマンド キューにコマンドを送信するための最大待機時間

戻り値の意味:

戻り値、pdPASS、意味: ソフトウェア タイマー タイムアウト時間が正常に変更されました

戻り値、pdFAIL、意味: ソフトウェア タイマー タイムアウト時間の変更に失敗しました

2.6. ソフトウェアタイマー機能の削除

コード:

BaseType_t xTimerDelete( TimerHandle_t xTimer, TickType_t xTicksToWait );

パラメータの意味:

名前、xTimer、意味: 削除されるソフトウェア タイマー ハンドル

名前、xTicksToWait、意味: ソフトウェア タイマー コマンド キューにコマンドを送信するための最大待機時間

おすすめ

転載: blog.csdn.net/qq_57663276/article/details/129015338