共有メモリ ドライバを使用して、GPS 受信機から NTP に時刻をプッシュしたいと考えています (注 1)。ホスト OS は Linux で、NTP 4.2.6p5 を使用しています。ドキュメントによると、共有メモリに次の構造を設定する必要があります。
struct shmTime {
int mode; /* 0 - if valid set
* use values,
* clear valid
* 1 - if valid set
* if count before and after read of
* values is equal,
* use values
* clear valid
*/
int count; /* See documentation for "mode" on the site */
time_t clockTimeStampSec; /* external clock */
int clockTimeStampUSec; /* external clock */
time_t receiveTimeStampSec; /* internal clock, when external value was received */
int receiveTimeStampUSec; /* internal clock, when external value was received */
int leap; /* ??? */
int precision; /* Precision of the timestamp, in 2^precision seconds */
int nsamples; /* Set by NTPD - do not populate */
int valid; /* Shared memory is valid */
int dummy[10];
};
欠落している主要なフィールドは、「タイムスタンプ」と「リープ」の正確な定義です。タイムスタンプはUTCのUnix時間だと思いますが、うるう秒に合わせてどのように調整するのですか?これは「うるう」フィールドとどのように相互作用しますか? shmpps.cなどのインターフェースを使用する標準的な例は、実際には質問に答えていません。
(注 1: このプロジェクトでは、生の観測量に基づいて独自の GPS ソリューションと時間を処理しているため、NMEA や他の GPS プロトコルを使用していません。PPS は GPIO ライン経由で提供され、ATOM ドライバーを使用してlinuxpps 経由でこれをキャプチャします)