Piはどのように時間間隔を追跡しますか?


8

私が理解しているように、RTCは時間を追跡するために必要です。ただし、Raspberry Piにはそれがなく、NTPサーバーを使用して時刻を同期しています。

すべては問題ありませんが、1ミリ秒または1秒が経過したことをPiはどのようにして知るのでしょうか。Piは時間の経過をどのように認識していますか?


RTCは、Pi(または任意のプロセッサ)の電源がオフのときのために(バッテリー付きで)本当に存在します。
タコ

Piには、あなたが言ったように、インターネット上にあるときはいつでもNTPによって設定される内部時計があります。絶対的なRTCではなく、それとその後の時間の経過を追跡するソフトウェアです。標準のLinuxコマンドは、必要なときにいつでもその情報を取得できます。だから、あなたの質問に答えるために、それが「知っている」のは、それが最も最近に設定された時間であり、それからそれから何ティックに達したかです。これはこの件に関する興味深い記事です。: blog.remibergsma.com/2013/05/12/...
SDsolar

回答:


16

RTCオペレーション

RaspberryPiに欠けているのは、バッテリーでバックアップされたRTC(リアルタイムクロック)です。メインコンピューターとは独立して動作し、電源がオフのときでも経過時間を追跡できるデバイスです(これが独自のバッテリーを備えている理由です)。非常に単純な方法で機能する可能性があります。既知の周波数発振器が接続されており、発振器のすべてのパルスで、内部タイマー/カウンターをインクリメントします。周波数はわかっているので、カウンターに基づいて経過時間を計算するのは簡単です。また、デバイスにはバッテリーが搭載されているため、外部電源がオフの場合でも動作を継続できます。

一部のRTCデバイスはより洗練されている場合があります。たとえば、プログラム可能な頻度またはアラームモード(将来の特定の時刻または毎日の特定の時刻などに設定)で割り込みを作成できます。これは、システム時間の維持には関係がなく、オプションです。

RTCの使用方法

コンピュータは、起動時にRTCに何時か(正確には-カウンタ値は何であるか)を尋ね、この値に基づいて内部の日付/時刻を設定できます。ただし、これ以降、コンピュータはRTCに毎秒/ミリ秒/マイクロ秒の時間を要求しなくなります。代わりに、通常は独自のタイマー/カウンターを使用して、独自の時計(システム時間と呼ばれます)を実行します。RTCと同様に、タイマー/カウンターは既知の周波数でクロックが供給されるため、経過時間を簡単に計算できます。

システムのクロックをRTCデバイスと(両方向に)同期させることができますが、要求されるまで発生しません。システムによっては、シャットダウン時やNTP同期後などに、システム時刻をRTCに保存するように構成されています。

RTCの欠如

RaspberryPiは、多くの安価なシングルボードコンピューターと同様に、外部RTCデバイスを備えていません。つまり、起動時に現在の時刻を要求することはできません。しかし、すでに述べたように、他のソース(NTPなど)から日付/時刻を取得できれば問題ありません。唯一の欠点は、RTCとは異なり、早期の起動時にNTPを要求できないことです(最初にネットワーク接続が必要になるため)。

だからあなたの質問に直接答えるために-RaspberryPi(または他のコンピューター)がRTCを持っているかどうかに関係なく、ほぼすべてのコンピューターシステムで利用可能でほぼすべての種類を実行する必要がある内部タイマー/カウンターデバイスを使用して時間を追跡しますオペレーティングシステムの。

Linuxでの時間

Linuxのユーザースペースアプリケーションcalendar timeは、システムコールを呼び出すgettimeofday()関数を使用して、いわゆる(現実の世界では時間です)を判別できclock_gettime()ます。Linuxカーネルが持つ多くの高度な機能(名前空間など)により、今は少し複雑になっています。ただし、基本は、カーネルがに基づいて時間を維持することですjiffies。実際には、カーネルの内部の変数(通常は64ビット幅)であり、システムが起動してからのティック数をカウントします。

ティックは、ハードウェアタイマーによってによって生成されますinterruptsjiffies値は、そのような割り込みごとにインクリメントされます。ハードウェアタイマーは、このような割り込みを定期的に生成するように構成されています。間隔は、HZカーネル構成パラメーターの値に従って、ブート時に構成されます。

カーネルはいつでも、ブート(jiffies変数)から生成されたティックの数を知っています。毎秒生成されるティックの数(構成HZオプション)を知っているため、前回のブートから経過した時間を簡単に計算できます。

つまり、要約すると、カーネルは起動時に(とも呼ばれます)RTCについて尋ねるので、システムが起動した実際の時刻がわかります。その後、ユーザースペースアプリケーションがシステムコールを使用している時間を尋ねるたびに、これに値を追加します。calendar timewall clockjiffies/HZclock_gettime

ハードウェアタイマー/カウンターデバイス

ハードウェアタイマー/カウンターは非常にシンプルなデバイスです。クロックティックをカウントするカウンターレジスタがあります。クロックティックは通常、外部oscillator(反復信号を生成する電子回路)によって作成され、既知の周波数(通常、数kHzから数百MHzの範囲)です。これは、カウンター値を発振器の周波数で割ることにより、経過時間を簡単に計算できることを意味します。

タイマーデバイスは、さまざまなことを実行するようにプログラムできます。上方向および下方向にカウントでき、カウンターレジスタをある値と比較します。たとえば、外部信号を作成し、カウンターレジスタが特定の値のときに最初からカウントを開始できます。このように、タイマーデバイスを構成して、発振器よりもはるかに低い周波数である一定の間隔でこのような外部信号を作成できます。この信号は、CPUの割り込みイベントとして使用できます。

タイマーデバイスの代わりに発振器を直接使用できることに注意してください。タイマー/カウンターデバイスが発振器と異なる点は、プログラムできることです。したがって、タイマー/カウンターデバイスをはるかに洗練された発振器と考えることができます。


内部タイマーについてより多くの詳細が提供されていれば、より役立つでしょう。
AppleGrew 2013年

@AppleGrew:どんな詳細に興味がありますか?
Krzysztof Adamski 2013年

あなたが言及したタイマーに名前を付けることはできますか?それらについてもっと読むことができるように。「内部CPUタイマー」をグーグル表示しても、何も関連がないようです。そこから何を学びたいのか正確にはわかりませんが、まだ明確さが欠けているように感じます。
AppleGrew 2013年

@AppleGrew:質問に背景情報を追加しました。お役に立てれば。
Krzysztof Adamski 2013年

ところで、タイプミスを修正したいかもしれません-「Linuxでの時間」セクションの3番目のパラグラフの「サック」。
AppleGrew 2013年

1

CPUクロックは水晶から生成されます。通常、クロック精度には10〜20百万分の1が期待できます(年間約5〜10分)。


0

とにかく、RTCをPIに追加する手順とともに、はるかに簡単な方法で質問に答えるために、下にリンクを挿入します。inet / ntpの方法を使用して時間を伝える以外に信頼できる方法が必要か、非常に正確な方法が必要かによって、「クロノドット」RTCを使用することをお勧めします。それ以外の場合、ブレイクアウトボードRTCは問題なく機能し、非常に簡単に設定でき、PIがRTCと通信するためのI2Cをセットアップするだけで済みます。リンク情報/資料

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.