STM32F103C8T6 を実験用 MCU として使用する FreeRTOS 学習ロード (2-1: タスク)

 学習パスは主に STM32F103 (STM32F103C8T6) 上の FreeRTOS オペレーティング システムのアプリケーションに関するもので、標準ライブラリ プログラミング手法が使用され、IDE は KEIL5 が使用されます。

知らせ!この学習パスは、STM32 最小システム ボードといくつかのアクセサリを購入することで学習することも、Proteus シミュレーションを通じて学習することもできます。

以降の記事は個人ブログ (jason1016.club) と CSDN に同時に公開されます。

動画はbilibiliで公開されます(UID:399951374)

1. タスクの概念 

FreeRTOS のいわゆるタスクの概念は、実行する操作を 1 つずつタスクに分割し、タスク スケジューラを通じて優先度に応じてタスクを割り当てることで、マルチタスクの展開管理を実現します。ベアメタルシステムと異なり、メイン機能にすべての操作が蓄積されるため、システムの冗長化が図られ、緊急時の操作は割り込みにより転用できますが、割り込みが頻繁に発生するとシステムの正常な動作に影響を与える可能性があります。そこで、FreeRTOS に実行タスクをオフロードさせます。

2. タスクのステータス

実行状態: 名前が示すとおり (一度に 1 つの実行状態のみ)

準備完了状態:実行条件は満たしているが、同じ優先度以上のタスクが実行中のため実行できない

ブロック状態: タスクは外部トリガー条件を待っています。条件が満たされると、状態が変更されます (遅延が完了するまで待機する必要がある vTaskDelay() 関数など) [タスクの実行時にタイムアウトが発生します。ブロック状態に入ります。このタイムアウト時間を超えると、待機中のイベントがまだ来ていなくても、タスクはブロック状態を終了します。

一時停止状態: タスクが一時停止状態に入ると、スケジューラから呼び出して実行状態にすることはできませんが、一時停止状態に入ったタスクにはタイムアウト期間がありません。

3. タスクの優先順位

各タスクには 0 ~ (configMAX_PRIORITIES-1) の優先度を割り当てることができます。

優先順位の数値が小さいほど優先順位の低いタスクを示し、0 が最も低い優先順位、configMAX_PRIORITIES-1 が最も高い優先順位になります。アイドル状態のタスクの優先度は最も低く、0 です。

FreeRTOS スケジューラは、準備完了状態または実行中の状態にある優先度の高いタスクがプロセッサの使用権を取得することを保証します。つまり、準備完了状態にある最も優先度の高いタスクのみが実行されます。

タスクの優先度が同じ場合はどうなるでしょうか?

準備完了状態で同じ優先度を持つタスクは、タイム スライス ラウンドロビン スケジューラを使用して実行時間を取得します。(ラウンドロビンスケジューラについては後述します)

4. タスクの作成と削除

タスクの作成は動的作成と静的作成に分けられます (違いは、動的作成では RAM タスク スタックが自動的に割り当てられるのに対し、静的割り当ては手動であることです) [以下では、主にタスク作成に動的メソッドを使用します]。タスク属性を保存するために使用されます。動的メソッド。タスク制御ブロックのアドレス。

タスクは主に次のいくつかの部分で構成されます。

1. pxTaskCode: タスク関数

2. pcName: タスク名。通常、追跡とデバッグに使用されます。タスク名の長さは configMAX_TASK_NAME_LEN を超えることはできません。

3. usStackDepth: タスクのスタック サイズ実際に適用されるスタックは usStackDepth の 4 倍であることに注意してください。アイドルタスクのタスクスタックサイズはconfigMINIMAL_STACK_SIZEであり、タスクスタック機能によりタスク中断時にシーンを保護(復元)することができます。

4. pvParameters: タスク関数に渡されるパラメータ

5. uxPriotiry: タスクの優先度、範囲 0~ configMAX_PRIORITIES-1

6. pxCreatedTask: タスク ハンドル。タスクが正常に作成されると、このタスクのタスク ハンドルが返されます。このハンドルは、実際にはタスクのタスク スタックです。このパラメータはタスク ハンドルを保存するために使用されます。他の API 関数がこのハンドルを使用する場合があります。

    //创建开始任务
    xTaskCreate((TaskFunction_t )start_task,            //任务函数
                (const char*    )"start_task",          //任务名称
                (uint16_t       )START_STK_SIZE,        //任务堆栈大小
                (void*          )NULL,                  //传递给任务函数的参数
                (UBaseType_t    )START_TASK_PRIO,       //任务优先级
                (TaskHandle_t*  )&StartTask_Handler);   //任务句柄              

タスク削除機能:

vTaskDelete( TaskHandle_t xTaskToDelete ) //参数为需要删除的任务函数

5. 業務の中断と再開

タスクの一時停止: タスクを一時停止状態に設定します。一時停止状態になったタスクは実行状態にはなりません。

void vTaskSuspend( TaskHandle_t xTaskToSuspend) //参数为需要挂起的任务函数

タスクの回復: タスクを一時停止状態から準備完了状態に再開します。

void vTaskResume( TaskHandle_t xTaskToResume) //参数为需要恢复的任务函数

BaseType_t xTaskResumeFromISR( TaskHandle_t xTaskToResume) //此函数是 vTaskResume()的中断版本,用于在中断服务函数中恢复一个任务

この記事は著者が独自に書いたものであり、このブログのすべてのオリジナル記事を私の許可なく商業目的や従来のメディアに使用することはできません。ネットメディアに転載する場合は出典を明示してください。明示しない場合は著作権侵害となります。

おすすめ

転載: blog.csdn.net/weixin_61908666/article/details/132012979