我正在尝试移植我收到的一些旧 Pascal 代码,其目的是控制一个数字 I/O 卡,但我遇到了一个涉及等待函数的障碍。每当发送信号时,程序员都会做这样的事情
[Set the port status]
LoopDelay([a long integer])
[Set the next port status]
LoopDelay([next long integer])
etc.
LoopDelay 看起来像这样:
procedure loopdelay(looping:longint);
var
counter,count : longint;
begin
for counter:=1 to looping do
inc(count);
end {loopdelay};
在我看来,他好像根据处理器速度做了一些数学运算,并计算出他需要迭代多少次循环才能等待一定的时间。我怎样才能知道等待了多长时间?
附加信息: 该处理器是 80 年代末/90 年代初的 486(根据维基百科,频率在 20 到 66 MHz 之间)。计算机运行 DOS 或早期的 Windows,代码是用 Turbo Pascal 7 编译的。传递给 loopdelay 的两个常量是 1266 和 6328。
我应该很快就会去参观这台机器,希望到时候我能找到确切的处理器。理想情况下,我想要一个可以插入时钟速度的公式。
最佳答案
在实际的 Pascal 实现中,您可以使用延迟程序,无需延迟循环。但是应该延迟多久呢?我可以想到四种获取此信息的方法。
最终您可以找到卡的文档或其中列出了必要延迟的部分。
您可以找到一台旧 PC 并测量一个计数非常大的延迟循环。
你反汇编 loopdelay 程序,查找 486 手册并手动计算循环所需的时间。
尝试错误并增加良好的安全边际。
关于io - 对为旧计算机编写的延迟函数进行逆向工程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22664714/