時計を作ろうと思っています。実際の時計であり、Windows 用のものではありません。しかし、今はほとんどのコードを書けるようになりたいと思っています。PIC16F628A を使用してクロックを駆動します。これには、アクセスできるタイマーがあります (実際には、組み込みのクロックに加えて 3 つがあります)。ただし、Windows にはこの機能がないようです。現在の時刻を更新できるように、時計の経過時間を知る必要があるため、時計を作成するのは少し難しくなります。そのため、Windows でパルスを取得する方法を知る必要があります (1Hz、1KHz は、それがどれほど速いかを知っている限り、実際には問題ではありません)。
2 に答える
Windows で使用できるタイマー オブジェクトは多数あります。おそらく、目的に応じて最も使いやすいのはマルチメディア タイマーですが、これは推奨されていません。それでも動作しますが、Microsoft は新しいタイマー タイプのいずれかを使用することをお勧めします。
アプリケーションが Windows Vista、Server 2008、またはそれ以降で実行されることがわかっている場合は、スレッドプール タイマーを使用することをお勧めします。Windows XP をサポートする必要がある場合は、Timer Queue タイマーを使用してください。
これらの API には多くの機能がありますが、一般的な使い方は非常に簡単です。Windows タイマー キュー API の使用に関する記事で (C# で) それらを使用する方法を示しました。コードはほとんどが API 呼び出しなので、理解して変換するのに問題はないと思います。
LARGE_INTEGERは、上位部分と下位部分に分割された 8 バイトのメモリ ブロックです。アセンブリでは、次のように定義できます。
MyLargeInt equ $
MyLargeIntLow dd 0
MyLargeIntHigh dd 0
ASM について学びたい場合は、Google で [x86 アセンブリ言語のチュートリアル] を検索してください。そうすれば、お得な情報がたくさん得られます。
待機可能なタイマーオブジェクトを使用できます。Windows はリアルタイム OS ではないため、パルスを見逃さないように十分な長さの期間を設定する必要があります。ほとんどの場合、10 分の 1 秒が安全なはずです。
追加:
const LARGE_INTEGER
SetWaitableTimer に渡す必要があるものは、NASM で簡単に実装できます。これは 8 バイトの定数です。
period: dq 100 ; 100ms = ten times a second
のアドレスをperiod
2 番目の引数として SetWaitableTimer に渡します。