コンテキスト切り替え時間
コンテキスト切り替え時間
embOSは高速コンテキストスイッチを実行するように設計されています。このセクションでは、優先順位の高いタスクに優先順位の低いタスクからのコンテキストスイッチの実行時 間を計算するために二つの異なる方法を説明します。
最初の方法はポート端子を使用し、オシロスコープが必要です。第二の方法は高分解能の測定機能を使用しています。両方のメソッドのサンプルプログラムは、提供されているサンプルのembOS出荷のディレクトリ。
SEGGERはベンチマークembOSのパフォーマンスにこれらのプログラムを使用している。あなたはベンチマークの結果を評価するためにこれらの例を使用することができます。実際の業績は、(CPU、クロック速度、ツールチェーン、メモリモデル、最適化、設定、等)多くの要因に依存していることに注意、
次の表は、メモリの種類に応じて、コンテキストスイッチの時間のばらつきについての概要と得られるCPUのモード:
ターゲットの | OSバージョン | メモリ | CPUモード | タイム |
---|---|---|---|---|
ATMEL AT91SAM7S256 | 3.50b | フラッシュ | 親指 | 7.562us |
ATMEL AT91SAM7S256 | 3.50b | フラッシュ | ARM | 7.875us |
ATMEL AT91SAM7S256 | 3.50b | RAM | ARM | 5.896us |
ATMEL AT91SAM7S256 | 3.50b | RAM | 親指 | 6.187us |
ATMEL AT91SAM7S256が48 MHzのクロック速度で実行されている:次のセクションのすべての名前の例のパフォーマンス値は、次のシステム構成で決定されます。すべてのソースは、高レベルの最適化と親指またはアームモードを使用して、IAR Embedded Workbenchはバージョン4.40Aでコンパイルされます。
ポート端子とオシロスコープで測定
コンテキストの切り替え時間は、LEDのオンとオフを切り替えるまでの時間です。LEDはアクティブHigh信号でオンになっている場合は、コンテキストの切り替え時間は、信号の立ち上がりと立ち下がりエッジ間の時間です。LEDはアクティブロー信号によってスイッチオンされている場合は、信号の極性が逆になっています。
信号は、オンとオフ、LEDのスイッチングのオーバーヘッドが含まれているため、実際のコンテキストの切り替え時間は、短いです。このオーバーヘッドの時間も、タスク切り替え時の表示の前に小さなピークの右側のようにオシロスコープに表示され、表示されたコンテキスト切り替え時間から減算する必要がありますされています。下の写真は、アクティブローのLED信号(LEDの低い手段が点灯している)と簡略化されたオシロスコープの信号を示しています。決定するためにスイッチングポイントがあります。
- = LEDは、オーバーヘッドの測定のためにオンに切り替えられます
- B = LEDがオーバーヘッドの測定のためにオフになります
- C = LEDは、低PRIOのタスクのコンテキストスイッチの前に右に切り換わります
- D = LEDが右高PRIOのタスクのコンテキストスイッチの後にオフになっています
サブルーチン内のLEDのオンとオフを切り替えるために必要な時間は時間としてマークされているトンAB。サブルーチン内のLEDのオンとオフを切り替えるために必要な時間は時間としてマークされているを含む完全なコンテキストスイッチに要する時間tのCD。
コンテキスト切り替え時間は、t CSは次のように計算されます:トンCS = T CD - T AB
例の測定値のAT91SAM7S、RAMでARMコード
:タスクの切り替え時間は、以下のパラメータで測定された
embOSバージョンV3.50b
アプリケーションプログラム:MeasureCST_Scope.c
ハードウェア: 48MHzのとAT91SAM7S256プロセッサ
プログラムがRAMで実行されて
使用されているARMモード
コンパイラの使用:IAR V4.40A
CPU周波数(f CPU):47.9232MHz
CPUクロックサイクル(t サイクル):トンサイクル = 1 / F 、CPU = 1 / 47.9232MHz = 20866 ns
測定トンABとt CD
コンテキストのスイッチング時間とサイクル数の結果
、純粋なコンテキストスイッチのために必要な時間ですが:
tContextSwitch = トンCD - トンAB = 298Cycles - 15Cycles => 283Cycles(5.9us @ 48MHz)。
FLASHでの測定例のAT91SAM7S、Thumbコード
:タスクの切り替え時間は、以下のパラメータで測定された
embOSバージョンV3.50b
アプリケーションプログラム:MeasureCST_Scope.c
ハードウェア: 48MHzのとAT91SAM7S256プロセッサ
プログラムはFLASHで実行されて
使用されるThumbモード
コンパイラに使用:IAR V4.40A
CPU周波数(f CPU):47.9232MHz
CPUクロックサイクル(t サイクル):トンサイクル = 1 / F 、CPU = 1 / 47.9232MHz = 20866 ns
測定トンABとt CD
コンテキストのスイッチング時間とサイクル数の結果
純粋なコンテキストスイッチのために必要な時間ですが,
tContextSwitch = トンCD - トンAB = 384Cycles - 21Cycles => 363Cycles(7.56us @ 48MHz)。
テストと比較して時間測定を切り替え私たちのコンテキストを確認するために以下のサンプルプロジェクトをダウンロード:
embOSのコンテキストの切り替えの時間のサンプル
説明 | コンパイラ | ダウンロード |
---|---|---|
AT91SAM7S - EK用embOS測定 | IAR Embedded Workbenchは4.41A | embOS_Measurement |
ポート端子とオシロスコープで測定
例のファイルのMeasureCST_Scope.cは使用して LED.cポートのピンの設定とクリアを行うモジュールを。これはオシロスコープでコンテキストスイッチの時間を測定することができます。次のソースコードはからの抜粋ですMeasureCST_Scope.c:
/ /タスクスタック静的OS_TASK TCBHP、TCBLP; / /タスク制御ブロックを/*****#"RTOS.hは"#"LED.h"静的OS_STACKPTR INT StackHP [128]、StackLP [128]に含まれて含まれています************************************************** ************** * * HPTask * /静的ボイドHPTask(ボイド){しますwhile(1){OS_Suspend(NULL); / /サスペンド優先順位の高いタスクLED_ClrLED0(); / /ストップ測定}} /*********************************************** ********************** * * LPTask * /静的ボイドLPTask(ボイド){(1){OS_Delay(100)一方、/ /同期するためティックするLED_ClrLED0(); / /測定OS_Resume(&TCBHP)[スタート]; / / / /測定/ / LED_SetLED0()の実行を強制する/ /優先順位の高いタスクを再開してタスクスイッチ/ / / /ディスプレイ計測のオーバーヘッド/ / LED_SetLED0()ジッタを避ける}} /*********************************************** ********************** * *メイン* / int型メイン(ボイド){OS_IncDI(); / /初期状態で無効に割り込みOS_InitKern(); / /初期化OS OS_InitHW(); / / OS LED_Initのためのハードウェアを()初期化/ / LEDポートOS_CREATETASKを初期化(&TCBHP、"HPのタスク"、HPTask、100、StackHP); OS_CREATETASK(&TCBLP、"LPのタスク"、LPTask、99、StackLP) ; OS_Start(); / /戻り値0をマルチタスク開始;}
オシロスコープの分析
高分解能タイマーで測定
コンテキストスイッチの時間は、高分解能タイマーで測定されることがあります。
例MeasureCST_HRTimer_embOSView.cは、優先順位の低いタスクから優先順位の高いタスクへのコンテキストスイッチの時間を測定する高分解能タイマーを使用し、embOSViewに結果が表示されます。
/ /タスクスタック静的OS_TASK TCBHP、TCBLP; / /タスク制御ブロック静的OS_U32 _time; / /#"RTOS.hは"#"stdio.hに"静的OS_STACKPTR INT StackHP [128]、StackLP [128]ありタイマー値/*********************************************** ********************** * * HPTask * /静的ボイドHPTask(ボイド){しますwhile(1){OS_Suspend(NULL); / /優先順位の高いタスクをサスペンドOS_Timing_End(&_time); / /ストップ測定}} /************************************** ******************************* * * LPTask * /静的ボイドLPTask(ボイド){char型acBuffer [100]; / /出力バッファOS_U32 MeasureOverhead、測定オーバーヘッドOS_U32 V用/ /時間、時間測定のための/ / / /測定オーバーヘッド我々はそれを/ / OS_Timing_Start(&MeasureOverhead)を差し引くことにより/ /このアカウントに取ることができるように、OS_Timing_End(&MeasureOverhead); / / / /同期/ / / /(1){OS_Delay(100)しながら無限ループで測定を実行します。(&_time)ジッタOS_Timing_Startを避けるために、目盛りに、/ /スタート測定OS_Resume(&TCBHP); / /タスクスイッチV = OS_Timing_GetCycles(&_time)強制的に優先順位の高いタスクを再開 - OS_Timing_GetCycles(&MeasureOverhead)、V = OS_ConvertCycles2us(1000 * V); ;}} OS_SendString(acBuffer);:/ /(、V / 1000、V%1000 acBuffer、"%Uと%.3 U usecrコンテキストスイッチの時間")はsprintfナノ秒のサイクルを変換する
サンプルプログラムでは、計算と測定のオーバーヘッド自体を減算し、これこれを実行する必要はありません。結果はembOSViewに送信される、例のembOSViewにUART通信をサポートしているすべてのターゲット上で実行されるように。プログラム例のMeasureCST_HRTimer_Printf.cは、 サンプルプログラムと同じですMeasureCST_HRTimer_embOSView.c だと、結果を表示printf()の端子の出力のエミュレーションをサポートしているデバッガのための機能。