私が理解しているように、RTCは時間を追跡するために必要です。ただし、Raspberry Piにはそれがなく、NTPサーバーを使用して時刻を同期しています。
すべては問題ありませんが、1ミリ秒または1秒が経過したことをPiはどのようにして知るのでしょうか。Piは時間の経過をどのように認識していますか?
私が理解しているように、RTCは時間を追跡するために必要です。ただし、Raspberry Piにはそれがなく、NTPサーバーを使用して時刻を同期しています。
すべては問題ありませんが、1ミリ秒または1秒が経過したことをPiはどのようにして知るのでしょうか。Piは時間の経過をどのように認識していますか?
回答:
RaspberryPiに欠けているのは、バッテリーでバックアップされたRTC(リアルタイムクロック)です。メインコンピューターとは独立して動作し、電源がオフのときでも経過時間を追跡できるデバイスです(これが独自のバッテリーを備えている理由です)。非常に単純な方法で機能する可能性があります。既知の周波数発振器が接続されており、発振器のすべてのパルスで、内部タイマー/カウンターをインクリメントします。周波数はわかっているので、カウンターに基づいて経過時間を計算するのは簡単です。また、デバイスにはバッテリーが搭載されているため、外部電源がオフの場合でも動作を継続できます。
一部のRTCデバイスはより洗練されている場合があります。たとえば、プログラム可能な頻度またはアラームモード(将来の特定の時刻または毎日の特定の時刻などに設定)で割り込みを作成できます。これは、システム時間の維持には関係がなく、オプションです。
コンピュータは、起動時にRTCに何時か(正確には-カウンタ値は何であるか)を尋ね、この値に基づいて内部の日付/時刻を設定できます。ただし、これ以降、コンピュータはRTCに毎秒/ミリ秒/マイクロ秒の時間を要求しなくなります。代わりに、通常は独自のタイマー/カウンターを使用して、独自の時計(システム時間と呼ばれます)を実行します。RTCと同様に、タイマー/カウンターは既知の周波数でクロックが供給されるため、経過時間を簡単に計算できます。
システムのクロックをRTCデバイスと(両方向に)同期させることができますが、要求されるまで発生しません。システムによっては、シャットダウン時やNTP同期後などに、システム時刻をRTCに保存するように構成されています。
RaspberryPiは、多くの安価なシングルボードコンピューターと同様に、外部RTCデバイスを備えていません。つまり、起動時に現在の時刻を要求することはできません。しかし、すでに述べたように、他のソース(NTPなど)から日付/時刻を取得できれば問題ありません。唯一の欠点は、RTCとは異なり、早期の起動時にNTPを要求できないことです(最初にネットワーク接続が必要になるため)。
だからあなたの質問に直接答えるために-RaspberryPi(または他のコンピューター)がRTCを持っているかどうかに関係なく、ほぼすべてのコンピューターシステムで利用可能でほぼすべての種類を実行する必要がある内部タイマー/カウンターデバイスを使用して時間を追跡しますオペレーティングシステムの。
Linuxのユーザースペースアプリケーションcalendar time
は、システムコールを呼び出すgettimeofday()
関数を使用して、いわゆる(現実の世界では時間です)を判別できclock_gettime()
ます。Linuxカーネルが持つ多くの高度な機能(名前空間など)により、今は少し複雑になっています。ただし、基本は、カーネルがに基づいて時間を維持することですjiffies
。実際には、カーネルの内部の変数(通常は64ビット幅)であり、システムが起動してからのティック数をカウントします。
ティックは、ハードウェアタイマーによってによって生成されますinterrupts
。jiffies
値は、そのような割り込みごとにインクリメントされます。ハードウェアタイマーは、このような割り込みを定期的に生成するように構成されています。間隔は、HZ
カーネル構成パラメーターの値に従って、ブート時に構成されます。
カーネルはいつでも、ブート(jiffies
変数)から生成されたティックの数を知っています。毎秒生成されるティックの数(構成HZ
オプション)を知っているため、前回のブートから経過した時間を簡単に計算できます。
つまり、要約すると、カーネルは起動時に(とも呼ばれます)RTC
について尋ねるので、システムが起動した実際の時刻がわかります。その後、ユーザースペースアプリケーションがシステムコールを使用している時間を尋ねるたびに、これに値を追加します。calendar time
wall clock
jiffies/HZ
clock_gettime
ハードウェアタイマー/カウンターは非常にシンプルなデバイスです。クロックティックをカウントするカウンターレジスタがあります。クロックティックは通常、外部oscillator
(反復信号を生成する電子回路)によって作成され、既知の周波数(通常、数kHzから数百MHzの範囲)です。これは、カウンター値を発振器の周波数で割ることにより、経過時間を簡単に計算できることを意味します。
タイマーデバイスは、さまざまなことを実行するようにプログラムできます。上方向および下方向にカウントでき、カウンターレジスタをある値と比較します。たとえば、外部信号を作成し、カウンターレジスタが特定の値のときに最初からカウントを開始できます。このように、タイマーデバイスを構成して、発振器よりもはるかに低い周波数である一定の間隔でこのような外部信号を作成できます。この信号は、CPUの割り込みイベントとして使用できます。
タイマーデバイスの代わりに発振器を直接使用できることに注意してください。タイマー/カウンターデバイスが発振器と異なる点は、プログラムできることです。したがって、タイマー/カウンターデバイスをはるかに洗練された発振器と考えることができます。