使用inp()和outp()访问I / O寄存器有更快的方法吗?

时间:2016-03-13 21:46:18

标签: c io dos intel cpu-registers

我的应用程序在DOS下运行,计算机上的Intel Atom Z520PT处理器运行频率为1.333GHz,时钟脉冲约为0.75ns。我在VisualStudio 2010中使用C编译器。

我使用许多inp()和outp()命令来访问处理器的I / O寄存器。 每个命令大约需要2.2μs。从I / O设备获取特定于应用程序的数据阵列需要40到50个outp()和inp()调用,因此我每ms只能执行10次这样的操作。

有没有办法更快地访问I / O寄存器?为什么这些命令花了这么多时间?我可以使用asm而不是C来加快速度吗?

1 个答案:

答案 0 :(得分:4)

您不太可能更快地访问这些寄存器。您没有说明设备是什么,而是从古老的x86 I / O访问任何寄存器或ISA总线设备将非常慢。经验法则是1μs访问次数的量级。所以你的数字是正确的。

传统x86 I / O总线的I / O本质上很慢。加速它是一个硬件问题(不同的总线,不同的接口等),而不是软件问题。< / p>

编辑:您没有说明您正在使用的编译器, MSVC 2010无法为DOS编译但是可以非常安全地假设任何一个可以的16位编译器将类似。例如,在Open Watcom中,outp()inp()无论如何都只是汇编器原语的函数包装器。函数调用开销大​​约是1-2个时钟,因此与inp()或outp()将需要的数千个周期相比可以忽略不计。 所以Inline Assembler根本不会提供帮助。

根据硬件的不同,唯一可能提高速度的机会是如果还有其他一些访问方法,例如PCI总线主DMA。