私はWi-Fi(Arduino IDEを使用して開発された80MHz ESP8266ベース)を使用した組み込みシステムを持っています。 )、使い捨ての2つのツール、すなわちインターネットとそれ自身の内部タイマーを使用します。ローカルタイマーベースの時間とNTP時間を定期的に同期させる方法
課題:
- プロセッサクロックがそう表向き 予測可能な方法で、時間をかけてドリフトします。
- NTPはUDPを使用しているため、返された時刻のパケットは、 の順番で返されたり、設定された間隔で返されたり、 を返します。
- 戻り値NTPパケットの遅延は、 100ms未満から(潜在的に)数秒まで、時間とともに大きく変化します。
- DNSの遅延は、100ms未満から 数秒まで、時間の経過とともに大きく変化します(タイムアウトを制御できません)。 NTPサーバープールのIPアドレスを上にするには、DNSが必要です。代わりに、
- システムは、特定の時間と 間隔に基づいてさまざまなアクションを取るので、私は不 逃したか、複製する行為を引き起こして、継続的に前方と後方、それ を設定し、時間を過剰に制御する必要はありません(またはこれらの条件のすべてを処理するプログラム を複雑にする - 時々失敗するか、 重複はミッションクリティカルではありません)。
- たまにNTPサーバが間違った時間を返します時には昔と浮遊リターンパケットがちょうど到着します
- (例えば、 pool.ntp.orgは時折検出するための簡単な である、1900年以来、0秒を返します) が現在の要求からの戻りパケットより先に送信されます。
現在のアプローチ:
- ISRを使用してインクリメントローカルデバイス時間を維持毎0.1 秒を引き起こし。
- NTPサーバー(プール)は、定期的にポーリングします(現在は6分ごとですが、実際にはこれが ではありません)。
- 短い間隔で応答がない場合はもう一度お試しください(現在は1 秒ですが、これは通常より短いですが、ほとんどのリクエストは で150ms以内に戻ります)。
- 各試行でNTPサーバー(プール)を変更し、負荷を分散させ、平均応答時間とサービスエラーを にします。
- 時間を最も近い0.1秒に抽出します(通常、受信待ち時間は です)。
- NTP時間がローカルデバイスの時刻から 秒を超えて離れている場合は、ローカルデバイスの時刻をクリティカルセクションで更新します。
- プロセスのネットワーク要素である、失敗した のタイムアウト、再試行、再初期化(該当する場合)。ほとんどの希望の後に依頼を放棄してください が失われ、次回にもう一度お試しください。
この時間同期を行うために、より良い、標準的な、またはベストプラクティスの方法がありますか?私が逃している他の要因やアプローチはありますか?
私はもちろんRTCと考えましたが、私はこれらのデバイスの多くを持っていますが、これは商用プロジェクトではないので、私は単価を最小限に抑えたいと考えています。私はESP8266(WiFi付き)を、付属または外部のインターネット機能を備えた他のプロセッサのほんの一部分で購入することができます。これらは組み込みのデータ収集デバイスなので、展開すると、それらを抽出して何か手作業で行うのは非常に不便です。私は同じデザイン制約の大部分が、2つの異なる時間ソースから同期しようとしているどのシステムにも当てはまると思います。 – pseudon