3

我正在尝试移植一些交给我的旧 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(根据 wikipedia 在 20 和 66 MHz 之间)。计算机运行 DOS 或早期的 Windows,代码使用 Turbo Pascal 7 编译。传递给 loopdelay 的两个常量是 1266 和 6328。

我应该很快就会访问这台机器,所以希望那时我能够找到确切的处理器。理想情况下,我想要一个可以插入时钟速度的公式。

4

2 回答 2

0

使用实际的帕斯卡实现,您可以使用延迟过程,不需要延迟循环。但是延迟应该多长时间?我可以想到四种获取这些信息的方法。

  1. 最终,您可以找到卡的文档或其中列出了必要延迟的部分。

  2. 您可以找到一台旧 PC 并测量一个计数非常大的延迟环路。

  3. 你拆解 loopdelay 程序,查找 486 手册,然后手动计算循环所花费的时间。

  4. 尝试和错误并增加良好的安全边际。

于 2014-11-23T15:50:55.607 回答
0

循环延迟是我过去遇到过几次的事情。它们看起来像是糟糕的编程习惯。我使用旧的 DOS 终止并保持驻留,将其重写为中断例程,或者插入由实时时钟读取和比较触发的事件循环。这可能是您可以改进代码的地方。

于 2020-10-19T02:12:37.110 回答