Nios® V プロセッサー・ソフトウェア開発者ハンドブック

ID 743810
日付 7/08/2024
Public
ドキュメント目次

7.7.3. タイムスタンプ・ドライバー

HAL システム・クロック・ティックよりも高い精度で時間間隔を測定することが必要な場合があります。HAL は、タイムスタンプ・ドライバーを使用して高解像度のタイミング関数を提供します。タイムスタンプ・ドライバーは、タイミング情報を取得するためにサンプリングできる、単調に増加するカウンターを提供します。HAL は、システムで 1 つのタイムスタンプ・ドライバーのみをサポートします。

BSP 設定を調整することで、ハードウェア・タイマー・ペリフェラルをタイムスタンプ・デバイスとして指定します。インテルが提供するタイムスタンプ・ドライバーでは、指定したタイマーを使用します。

タイムスタンプ・ドライバーが存在する場合は、次の関数を使用できます。

  • alt_timestamp_start()
  • alt_timestamp()

alt_timestamp_start() を呼び出すと、カウンターの実行が開始されます。後続の alt_timestamp() の呼び出しでは、タイムスタンプ・カウンターの現在の値が返されます。alt_timestamp_start() を再度呼び出すと、カウンターが 0 にリセットされます。カウンターが (使用されるタイマー・パラメーター化に応じて 232 - 1 または 264 - 1) に到達した際のタイムスタンプ・ドライバーの動作は未定義です。

alt_timestamp_freq() 関数を呼び出すことで、タイムスタンプ・カウンターがインクリメントするレートを取得できます。一般的にこのレートは、通常は毎秒数百万サイクルである Nios® V プロセッサー・システムのハードウェア周波数です。タイムスタンプ・ドライバーは、alt_timestamp.h ヘッダーファイル内で定義されます。

タイムスタンプを使用したコード実行時間の測定

#include <stdio.h> #include "sys/alt_timestamp.h" #include "alt_types.h" int main(void) { alt_u32 time1; alt_u32 time2; alt_u32 time3; if (alt_timestamp_start() < 0) { printf("No timestamp device available\n"); } else { time1 = alt_timestamp(); func1(); /* first function to monitor */ time2 = alt_timestamp(); func2(); /* second function to monitor */ time3 = alt_timestamp(); printf("time in func1 = %u ticks\n", (unsigned int)(time2 - time1)); printf("time in func2 = %u ticks\n", (unsigned int)(time3 - time2)); printf("Number of ticks per second = %u\n", (unsigned int) alt_timestamp_freq()); } return 0; }