このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
非同期タスクにおけるタイマー
ISR によって、絶対時間のソースが設定されます。これは、関数 ssSetTimeSource
を使用して実行されます。関数 ssSetTimeSource
を、関数 ssSetOutputPortWidth
を呼び出す前に呼び出すことはできません。先に呼び出した場合、プログラムは休止し、エラー メッセージが表示されます。ssSetTimeSource
には次の 3 つのオプションがあります。
SS_TIMESOURCE_SELF
:生成された各 ISR は、独自の絶対時間カウンターを維持します。このカウンターは、システム内の周期的な基本レートまたはサブレート カウンターとは異なります。カウンター値とタイマー分解能値 (Async Interrupt ブロックのブロック パラメーター [タイマー分解能 (秒)] で指定) が下流のブロックによって使用され、ブロックの計算に必要な絶対時間値が指定されます。SS_TIMESOURCE_CALLER
:ISR は、呼び出し側で維持されているカウンターの時間を読み取ります。時間の分解能は、呼び出し側の分解能と同じです。SS_TIMESOURCE_BASERATE
:ISR は、モデルの周期的な基本レートから絶対時間を読み取ります。したがって、時間の分解能は、基本レートの分解能と同じです。
メモ
このトピックに示されているオペレーティング システムの統合手法では、Interrupt Templates ブロック ライブラリのブロックを使用します。そのライブラリのブロックは、特定のターゲット環境でカスタム ブロックを開発するのに役立つ例となります。
既定の設定では、カウンターは、リアルタイム モデル構造体の Timing
サブ構造体の 32 ビット符号なし整数メンバーとして実装されます。rtModel
データ構造体をサポートするターゲットでは、関数 ssSetAsyncTimeDataType
を使用して時間データ型が設定されていない場合、カウンターのワード サイズはモデル コンフィギュレーション パラメーター [アプリケーションのライフスパン (日)] の設定で決定されます。次の例を参照してください (ERT ターゲット コード)。
/* Real-time Model Data Structure */ struct _RT_MODEL_elapseTime_exp_Tag { const char *errorStatus; /* * Timing: * The following substructure contains information regarding * the timing information for the model. */ struct { uint32_T clockTick1; uint32_T clockTick2; } Timing; };
この例では、Timing
データ構造体の未使用のフィールドが省略されています (ERT ターゲット コードの機能が GRT では見つかりません)。rtModel
データ構造体をサポートするターゲットでは、カウンターのワード サイズはモデル コンフィギュレーション パラメーター [アプリケーションのライフスパン (日)] の設定で決定されます。
既定では、RTOS 例 (VxWorks®) のライブラリ ブロックは、vxlib1
システム呼び出し tickGet
を使用して、タイマー ソースを SS_TIMESOURCE_SELF
に設定し、カウンターを更新します。関数 tickGet
は、RTOS カーネルによって維持されているタイマー値を返します。タイマーの最大ワード サイズは、UINT32
です。次の例は、tickGet
に対して生成された呼び出しを示しています。
/* VxWorks Interrupt Block: '<Root>/Async Interrupt' */ void isr_num2_vec193(void) { /* Use tickGet() as a portable tick counter example. A much higher resolution can be achieved with a hardware counter */ rtM->Timing.clockTick2 = tickGet(); . . .
関数 tickGet
の呼び出しは、例としてのみ使用しています。この関数は、より適切な分解能をもつタイミング ソースで置き換えることができます (多くのインスタンスでは、置き換える必要があります)。RTOS 例 (VxWorks) 以外の RTOS のカスタム非同期ブロックを実装する場合、ターゲット RTOS と同等の呼び出しを生成するか、コードを生成して、ターゲット ハードウェアのタイマー レジスタを読み取ります。
ターゲット コンピューターのタイミング ソースの分解能と一致するように、Async Interrupt ブロックのブロック パラメーター [タイマー分解能 (秒)] の設定を変更します。
カウンターは、割り込みレベルで更新されます。この値は、ISR の最新の実行時のタイミング ソースの目盛りの値を表します。このタイミング ソースのレートは、モデルのサンプル レートとは関係ありません。実際、通常は、このレートはモデルの基本レートよりも速くなります。タイマー ソースを選択し、Async Interrupt ブロックのサービス対象となる割り込みの予測レートに基づいてレートと分解能を設定します。
タイマー コードの生成の例については、Async Interrupt ブロックの実装を参照してください。