c - 有没有更快的方法使用 input() 和 output() 访问 I/O 寄存器?

标签 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() 调用,因此我每毫秒只能执行 10 次。

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

最佳答案

您不太可能更快地访问这些寄存器。您没有说明设备是什么,但可以通过古老的 x86 I/O 访问任何寄存器否则 ISA 总线设备将会非常慢。经验法则是访问时间约为 1μs。所以你的数字大约是正确的。

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

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

根据硬件的不同,只有存在其他访问方法(例如 PCI 总线主控 DMA)时才能获得更好的速度。

关于c - 有没有更快的方法使用 input() 和 output() 访问 I/O 寄存器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35976260/

相关文章:

java - 如何修改声音文件Java的音高?

c - 在 C 中直接操作字符串中的 long 值

assembly - 我可以将 al 插入 TASM 中的堆栈吗?

assembly - 操作系统是抽象的吗?

c - 除以零中断错误 "using float variables"

c - fscanf 不读取任何内容

sql - 在 C 中连接字符串以组成 SQL 查询

golang - 使用 io.Copy 将奇怪的字符从 bufio.Reader 复制到 STDOUT

java - 将 Selenium 作为预构建事件运行时,Visual Studio 2010 挂起

c++ - VS 社区 2013 : cannot open include file 'winres.h'