1

私は、ミリ秒の粒度でカレンダーと時計をサポートする必要があるプロジェクトを開発しています。チップの RTC を設定して時間管理を支援することができましたが、時間を表示するための正しいデータ型を見つけるのに苦労しています。

私はいつもtime_t(The Unix epoch) で作業していましたが、これは秒ベースであるため、うまくいきません。どうstruct timevalですか?この構造はstruct tm、プレゼンテーション (asctime) のコンテキストではサポートされていないようです。

組み込みシステムで時刻を表現するために推奨される方法は何ですか?

注: このシステムは、Java ベースのバックエンド サーバーに接続し、時刻を同期する必要があるため、いくつかの言語ですぐに使用できる構造を探しています。

4

2 に答える 2

1

ミリ秒単位の粒度と Java ベースの何かと対話する必要があることは、両方ともエポックからの 64 ビット時間が適切で簡単な選択であることを示唆しています。

今日のほとんどのコンパイラには 64 ビット型があります。そうでない場合は、ローカル エンディアンの適切な順序で 2 つの 32 ビット型の構造体として処理し、キャリーを処理するコードを挿入できます。

于 2012-12-01T21:51:38.183 に答える
0

ミリ秒とミリ秒があり、一方は簡単で、もう一方は難しいです。

ソリッドラスターで動作する必要があるもの(モーター制御など)を処理する1msのハードウェアタイマー割り込みループを実行します。このルーチン内からグローバル32ビットの「ティック」値をインクリメントします。これを使用して、1秒未満の間隔で発生する必要のあるものの時間を計測できます(EGは50ミリ秒ごとに何かをポーリングします)。

これは、マイクロのハードウェアタイマーを計時基準として使用することと同じではありません。このようなシステムでは、クロッククリスタルの精度から、さまざまなプリスケーラーすべて、割り込みレイテンシなど、あらゆるものの精度に問題があります。モーター制御ルーチンが1秒間に999回実行されるのか、1秒間に1001回実行されるのか、またはピンの状態を50ではなく49.5msごとにポーリングするのかは関係ありません。これは、十分に近いためです。重要なのは、タイムリーに。24時間の間に、1日のミリ秒よりも多くの「ティック」がロードされる可能性があり、これはひどい時計になります。

たとえば、クロックプリスケーラはNにカウントしてからリセットしますか、それともn-1でリセットしますか?すぐにリセットされますか、それとも1クロックサイクルかかりますか?この種の詳細は、マイクロでのタイミングの頭痛の種になります。

私はRTCを時刻の基準として使用し、msカウンターを秒の刻みに同期させます(1HzのRTC割り込みごとに「目盛り」を0にリセットします)。これは、ms値が非常に大きくなることを意味します。 RTCに比べてわずかに外れています。RTCの入力クロックレジスタを直接読み取って、RTCを実行するはるかに高速なクロック(通常は32.768kHzクロック)を抽出できる場合もあります。これは、1kHzタイマーのプリスケーラクロックレジスタからマイクロ秒の値を取得するために行います。これは完璧ではありません。時間を維持するために使用するのではなく、サブミリ秒のイベントをキャッチするためにのみ使用します。

または、アプリケーションに本当にミリ秒が必要かどうかを確認します。または、100ミリ秒以内の数値を作成して報告できる場合は、JSが原子時計グレードのタイミングであるとは限りません。ミッキーマウスでもありません。時計グレード。あなたが本当にその精度を必要とするなら、あなたはそれを間違っています。

于 2012-12-05T10:41:03.000 に答える