<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
このビデオ・プレゼンテーションは、 MQX RTOSアプリケーション開発のエッセンシャル ・トレーニング・コースの第3回です。このセッションでは、MQX タスク・スケジューラーについて紹介します。タスクのスケジュール方法、スケジュール・ポリシーの選択方法、およびシステムのタスク優先度レベルの設定方法について学習します。
このトレーニングは、フリースケールがスポンサーとなり、実績のあるパートナーである Embedded Access Inc.によって作成されました。
|
- OSchedulingポリシー
- スケジューラのしくみ
- タスクの優先度レベルの選択
- タスクテンプレートリスト
- システムでのタスクの使用
| - 優先度ベースのスケジューリングの実装
- スケジューラーの理解: ラウンドロビン vs プライオリティ ベースのスケジューリング
- ユーザー・インターフェースへのコマンドの追加
|
セッション3:ラボ課題まず、セッション3:タスク管理とスケジューラのビデオをご覧ください。
その後、以下のインタラクティブなラボ課題に進んでください。
はじめに
セッション 1 のラボでは、ラウンドロビン スケジューリングを使用し、タスクが CPU 時間を効率的に共有する方法を確認しました。このラボでは、優先度ベースのスケジューリングに切り替え、このスケジューリング ポリシーを使用して CPU 時間を効率的に共有する方法について説明します。次に、最終的にアプリケーションにコードを追加し始め、最初に開始するタスクはユーザーインターフェイスタスクです。ここでは、シリアルポートを介したインターフェースを追加し、ユーザーがシステム内にCANタスクのインスタンスをいくつ存在させるかを指定します。インターフェースは、ユーザーがCANタスクを破棄、中止、および再起動できるように拡張され、タスク作成APIを体験できます。
目的
このラボの目的は次のとおりです。
- タスクテンプレートリストを理解する
- _task_createを使用してタスクを動的に作成する
- _task_destroy、_task_abort、_task_restartの違いを使用し、理解する
これらの目標は、次のコマンドを受け入れるように UI タスクを変更することで達成されます。
- 作成コマンド - 指定した数のCANタスクを作成します。各 CAN タスクは、CAN タスクのインスタンスを一意に識別するパラメータを使用して開始する必要があります。
- Destroy コマンド - すべての CAN タスクを破棄します。
- Restart command - すべてのCANタスクを再開します。
CANタスクを次のように変更する必要があります。
- 終了ハンドラのインストール
- 開始時に初期メッセージを出力する
- 定期的なメッセージ (初期メッセージとは異なる) を 1 秒に 1 回印刷します
使用する新しい関数/構造:
_time_delay、_task_create、_task_destroy、_task_abort、_task_restart、_task_set_exit_handler
割り当て
優先度ベースのスケジューリングを実装する
- 現在、すべてのタスクは優先度レベル 9 に設定されており、これによりラウンドロビン スケジューリングが呼び出されましたが、優先度ベースのスケジューリングに切り替えたいと思います。タスクの優先度を再編成して、優先度の高いタスク、優先度が中程度のタスク、および優先度の低いタスクを設定します。タスクを相対的な優先度に割り当てる場合、ディスプレイの更新が一瞬遅れてもユーザーは気にしないか気にしないため、ユーザー情報タスクは通常優先度が低いことに注意してください。一方、よりタイムクリティカルなタスクは、可能な限り応答性を確保するために優先度を高くする必要があります。各タスクに割り当てる優先度レベルについて考え、次に推奨される優先度のリストを確認します。


- タスクテンプレートリストの優先度レベルを更新して、選択した優先度を反映します。数値が小さいほど実際には優先度が高く、優先度レベルにギャップを残すと、不必要により多くのメモリを使用することに注意してください。優先度が最も高いタスクをレベル 9 に、中程度からレベル 10 に、優先度の低いタスクをレベル 11 に割り当てます。
- コードを実行し、ターミナルで出力を確認します。実行を一時停止し、TAD の Ready キューを確認します。






スケジューラの理解
- ラウンドロビンスケジューリングでは、アクティブタスクからのスケジュールの譲歩により、準備完了キューの次のタスクを実行できることがわかりました。ただし、優先度が異なるタスクがあり、優先度の高いタスクが優先度の低いタスクにCPUを譲る唯一の方法は、ブロック状態に入ることである場合、これは機能しません。ですから、以前は時間遅延を使用していたことは、結局のところそれほど悪い考えではありませんでした。ヘルスタスクのsched_yieldコールを1秒の遅延に変更して、何が起こるかを確認します。ヘルスタスクのtime_delayにブレークポイントを置かないと、印刷物に追いつくことができない場合があります。


- これで、優先度の高いタスクと中程度のタスクを実行する手段ができたため、これを拡張して、優先度の低いタスクも実行できるようにする必要があります。現在、ブロッキングコールのブロックを解除する手段は時間遅延以外にないため、今のところはそれを維持する必要がありますが、これらはすべて最終的に置き換えられます。すべてのタスクを今すぐ更新して、スケジュールの歩留まりの代わりに 1 秒の遅延を使用します。次に、どのような結果が得られるかを確認します。


ユーザーインターフェースの更新
- 今、私たちはついに私たちのタスクの1つに肉を追加することができます。次のステップは、ユーザーから CAN タスクを作成するコマンド ("c" を入力)、すべての CAN タスクを破棄 ("d" を入力)、または使用可能なコマンドのヘルプを取得 ("h" を入力) のいずれかのコマンドを受け入れるように UI タスクをアップグレードすることです。ユーザーがCANタスクを作成する場合は、作成するタスクの数を入力します(最大10個)。task_create() 関数は、CAN タスクを作成するために使用されます。その他の要件は次のとおりです。
- タスクの作成: CANタスクを作成するときは、ID番号を渡します。たとえば、最初のCANタスクはID番号0を取得し、次のCANタスクはID番号1を取得します。結果を確認するために、CANタスクを更新して、作成されたことを示すメッセージを印刷し、1秒に1回、それがどのCANタスクであるかを識別するメッセージを出力する必要があります。他のタスクからの定期的なプリントアウトがこのインターフェイスに干渉しないようにするには、printf ステートメントをコメント アウトするか、while (1) ループの上に移動することができます。最後に、UIタスクはCANタスクを作成するため、MQXの起動時に自動生成されるべきではないため、これをタスクテンプレートリストに反映する必要があります。
- タスクの破棄: このコマンドの動作を確認するには、printf を使用して、破棄されている CAN タスクを識別するメッセージを出力します。
- ヘルプ: 使用可能なコマンドを識別するために、一連のメッセージを出力します。たとえば、「c - CANタスクの作成」、「d - CANタスクの破棄」などです。






- 変更を試すには、新しいインターフェースを使用していくつかのCANタスクを作成し、プログラムを一時停止します。要求された数のCANタスクがTADのタスクサマリーウィンドウに存在することを確認します。インターフェースを使用してすべてのCANタスクを削除し、タスクサマリーウィンドウから削除されていることを確認します。


- 次に、ユーザーが「a」を入力してCANタスクを破壊する代わりに中止できるように、UIにコマンドを追加します。abort 関数を使用すると、終了するタスクが終了前に終了ハンドラを実行できるため、CAN タスクに終了ハンドラを追加します。終了ハンドラは can_task() 関数の外部にある別の関数であり、CanTask.c に配置する必要があります。今のところ、終了ハンドラが行うのは、タスクがシャットダウンしているというメッセージを出力することだけです。終了ハンドラにアクセスするには、CAN タスクは、task-set-exit-handler() 関数を使用して、初期化コードに終了ハンドラをインストールする必要があります。
- コードを実行し、abort コマンドが入力されると、すべての CAN タスクでシャットダウン メッセージが出力されますが、destroy メッセージが使用されるとこのメッセージは出力されないことを確認します。


- 最後に、「r」を入力してCANタスクを再起動するためのコマンドをUIにもう1つ追加します。タスクがいつ開始されたかを確認するには、CAN タスク コードの初期化セクションに、CAN タスクに渡された ID パラメータを使用してタスクが開始したことを示す printf を追加します。




さらにサポートが必要ですか?このラボの完全なソース コードは、こちらの 'Lab Source Code' フォルダーにあります。