Main Content

非同期タスクにおけるタイマー

割り込みサービス ルーチン (ISR) を含むブロックの S-Function は、絶対時間のソースを設定できます。これを行うには、関数 ssSetTimeSource を呼び出します。ssSetTimeSource を呼び出す前に、ssSetOutputPortWidth を呼び出して出力端子の端子幅を取得します。そうしないと、プログラムが停止し、エラー メッセージが返されます。ssSetTimeSource には次のオプションがあります。

  • 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 ベースのコードの機能) 内の未使用のフィールドを省略しています。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 ブロックの実装を参照してください。

関連する例

詳細