ミリ秒とミリ秒があり、一方は簡単で、もう一方は難しいです。
ソリッドラスターで動作する必要があるもの(モーター制御など)を処理する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が原子時計グレードのタイミングであるとは限りません。ミッキーマウスでもありません。時計グレード。あなたが本当にその精度を必要とするなら、あなたはそれを間違っています。