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

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

4.4.3.1.1. システム・クロック・タイマー

システム・クロック・タイマー・リソースは、定期的なイベント (アラーム) をトリガーするために使用されます。また、システム・クロック・ティックをカウントするクロックデバイスとしても使用されます。 Nios® V プロセッサー・サブシステムのデフォルトのシステム・クロック・タイマーは、 Nios® V プロセッサーの内蔵内部タイマーです。システム・クロック・タイマーは、プラットフォーム・デザイナーシステム内の他のタイマー・ペリフェラルに設定できます。

注: BSP ライブラリーで識別できるシステム・クロック・タイマー・サービスは、1 つだけです。HAL 提供のルーチンのみがタイマーにアクセスします。

hal.sys_clk_timer 設定は、システム・クロック・タイマーの BSP プロジェクト・コンフィグレーションを制御します。この設定は、プラットフォーム・デザイナーのデザインで使用可能なタイマーの 1 つをシステム・クロック・タイマーとして構成します。

インテルは、アプリケーション・レベルのシステムクロック機能用およびアラーム生成用に独立した API を提供します。

アプリケーション・レベルのシステムクロック機能は、HAL 固有の API と Unix ライクな API の 2 つの異なるクラスの API によって提供されます。インテル関数の alt_nticks() は、経過したクロックティック数を返します。alt_ticks_per_second() 関数によって返された値で割ることで、この値を秒に変換できます。ほとんどのエンベデッド・アプリケーションでは、基本的な時刻管理にはこの関数で十分です。

POSIX ライクな gettimeofday() 関数は、Unix ワークステーションと HAL とでは異なる動作をします。バッテリー・バックアップされたリアルタイム・クロックを備えたワークステーションでは、この関数は絶対時間値を返します。値 0 は協定世界時 (UTC) 1970 年 1 月 1 日 00:00 を表しますが、HAL では、これは関数は、システムの電源投入から始まる時間値を返します。デフォルトでは、関数はシステムの電源投入が 1970 年 1 月 1 日に発生したと想定します。settimeofday() 関数を使用して、HAL gettimeofday() 応答を修正します。 times() 関数も同様の動作の違いを示します。

システムクロック・タイマーを実装する前に、以下の一般的な問題および重要なポイントを考慮します。

  • システムクロックの分解能 — タイマーの周期値は、HAL BSP プロジェクトがシステム・クロック・カウンターの内部変数をインクリメントするレートを指定します。アプリケーションのシステムクロックの増加が遅すぎる場合は、プラットフォーム・デザイナーでタイマーの周期を減らすことができます。
  • ロールオーバー — (リセット以降の) システム・クロック・カウント数を格納する内部グローバル変数は、64 ビットの符号なし整数です。この変数には、ロールオーバー保護は提供されません。したがって、システムでロールオーバー・イベントが発生するタイミングを計算し、それに応じてアプリケーションを計画してください。
  • パフォーマンスへの影響 — クロックティックごとに、割り込みサービスルーチンが実行されます。このルーチンを実行すると、パフォーマンスがわずかに低下します。システム・ハードウェアで短いタイマー周期が指定されている場合、累積的な割り込みレイテンシーがシステム全体のパフォーマンスに影響を与えます。

アラームAPI を使用すると、アラームクロックが動作するのと同じように、イベントをシステム・クロック・タイマーに基づいてスケジュールできます。APIは、アラームを登録する alt_alarm_start() 関数と、登録されたアラームを無効にする alt_alarm_stop() 関数で構成されます。

アラームを実装する前に、以下の一般的な問題および重要な点を考えてください。

  • 割り込みサービスルーチン (ISR) コンテキスト — よくある間違いは、アラーム・コールバック関数をプログラムして、割り込みが有効であることに依存するサービス (printf() 関数など) を呼び出すことです。この間違いは、アラーム・コールバック関数が割り込みコンテキストで発生し、割り込みが無効になっている間にシステムがデッドロックする原因となります。
  • アラームのリセット — コールバック関数は、0 以外の値を返すことでアラームをリセットできます。内部的には、alt_alarm_start() 関数は、この値でコールバック関数によって呼び出されます。
  • チェインalt_alarm_start() 関数は、それぞれが独自のコールバック関数とアラームまでのシステムクロックのティック数を持つ、1 つ以上の登録されたイベントを処理することができます。
  • ロールオーバー — アラーム API は、登録されたアラーム用のクロックのロールオーバー状態をシームレスに処理します。

ほとんどのエンベデッド・システムに適したタイマー周期は 50 ミリ秒です。この値は、ほとんどのシステムイベントに対して十分な値であり、パフォーマンスに深刻な影響を与えたり、システム・クロック・カウンターをあまりに速くロールオーバーしたりすることはありません。タイマー周期を短くしすぎると、 Nios® V プロセッサーはタイマー割り込みハンドラーを継続的に処理し、他のタスクを無視します。