我打算做一个时钟。一个真正的时钟,不是 Windows 的东西。但是,我希望现在能够编写大部分代码。我将使用 PIC16F628A 来驱动时钟,它有一个我可以访问的计时器(实际上,除了它内置的时钟之外,它还有 3 个)。但是,Windows 似乎没有此功能。这使得制作时钟有点困难,因为我需要知道它已经过了多长时间,这样我才能更新当前时间。因此,我需要知道如何在 Windows 中获得脉冲(1Hz、1KHz,只要我知道它有多快,这并不重要)。
2 回答
Windows 中有许多可用的计时器对象。可能最容易用于您的目的是多媒体计时器,但已被弃用。它仍然可以工作,但 Microsoft 建议使用其中一种新的计时器类型。
如果您知道您的应用程序将在 Windows Vista、Server 2008 或更高版本下运行,我建议您使用线程池计时器。如果您必须支持 Windows XP,请使用Timer Queue timer。
这些 API 有很多,但一般用途非常简单。我在文章Using the Windows Timer Queue API中展示了如何使用它们(在 C# 中) 。代码主要是 API 调用,所以我认为您理解和转换它不会有问题。
LARGE_INTEGER只是一个 8 字节的内存块,分为高部分和低部分。在汇编中,您可以将其定义为:
MyLargeInt equ $
MyLargeIntLow dd 0
MyLargeIntHigh dd 0
如果您想学习 ASM,只需在 Google 上搜索 [x86 汇编语言教程]。这会给你带来很多很好的信息。
您可以使用可等待的计时器对象。由于 Windows 不是实时操作系统,因此您需要确保将周期设置得足够长,以免错过脉冲。大多数时候十分之一秒应该是安全的。
额外的:
您需要传递给 SetWaitableTimer在const LARGE_INTEGER
NASM 中很容易实现,它只是一个八字节常量:
period: dq 100 ; 100ms = ten times a second
将地址period
作为第二个参数传递给 SetWaitableTimer。