最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

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

ISR によって、絶対時間のソースが設定されます。これは、関数 ssSetTimeSource を使用して実行されます。関数 ssSetTimeSource を、関数 ssSetOutputPortWidth を呼び出す前に呼び出すことはできません。先に呼び出した場合、プログラムは休止し、エラー メッセージが表示されます。ssSetTimeSource には次の 3 つのオプションがあります。

  • SS_TIMESOURCE_SELF:生成された各 ISR は、独自の絶対時間カウンターを維持します。このカウンターは、システム内の周期的な基本レートまたはサブレート カウンターとは異なります。カウンター値とタイマー分解能値 (Async Interrupt ブロックのブロック パラメーター [Timer resolution (seconds)] で指定) が下流のブロックによって使用され、ブロックの計算に必要な絶対時間値が指定されます。

  • SS_TIMESOURCE_CALLER:ISR は、呼び出し側で維持されているカウンターの時間を読み取ります。時間の分解能は、呼び出し側の分解能と同じです。

  • SS_TIMESOURCE_BASERATE:ISR は、モデルの周期的な基本レートから絶対時間を読み取ります。したがって、時間の分解能は、基本レートの分解能と同じです。

メモ

この節に示されているオペレーティング システムの統合手法では、vxlib1 ライブラリの 1 つ以上のブロックを使用します。これらのブロックは、ターゲット環境でカスタム ブロックを開発するのに役立つ開始点の例を提供します。

既定の設定では、カウンターは、リアルタイム モデル構造体の Timing サブ構造体の 32 ビット符号なし整数メンバーとして実装されます。rtModel データ構造体をサポートするターゲットでは、関数 ssSetAsyncTimeDataType を使用して時間データ型が設定されていない場合、カウンターのワード サイズはモデル コンフィギュレーション パラメーター [アプリケーションのライフスパン (日)] (Simulink) の設定で決定されます。次の例を参照してください (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 データ構造体をサポートするターゲットでは、カウンターのワード サイズはモデル コンフィギュレーション パラメーター [アプリケーションのライフスパン (日)] (Simulink) の設定で決定されます。

既定では、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 ブロックのブロック パラメーター [Timer resolution (seconds)] の設定を変更します。

カウンターは、割り込みレベルで更新されます。この値は、ISR の最新の実行時のタイミング ソースの目盛りの値を表します。このタイミング ソースのレートは、モデルのサンプル レートとは関係ありません。実際、通常は、このレートはモデルの基本レートよりも速くなります。タイマー ソースを選択し、Async Interrupt ブロックのサービス対象となる割り込みの予測レートに基づいてレートと分解能を設定します。

タイマー コードの生成の例については、Async Interrupt ブロックの実装を参照してください。

関連する例

詳細