在Windows XP上开发微秒级实时数据采集系统是否可行?

3
为了我的一个项目,我需要开发一款软件,该软件需要在从应用程序接收触发信号后的100毫秒内从并行端口获取2000个数据。这意味着并行端口需要以50微秒的间隔进行读取。数据频率设置为10千赫兹。因此,这个采集过程应该是实时的,具有微秒级时间精度。
我正在尝试用Java编程。到目前为止,我已经能够从并行端口获取数据,但是很难保持时间间隔。
我的问题是:在Windows XP环境下是否真的可以以微秒级精度完成?如果是,请指点我一些指南/资源?
非常感谢您的任何帮助。

2
实时数据采集在垃圾回收语言中总是会很困难,除非你仔细管理内存... - Mitch Wheat
我认为你只能在内核模式驱动程序中接近实现这一点。即使如此,系统管理(模式)中断(SMI)可能会破坏定时,因为它们对操作系统完全透明,并在BIOS中处理。 - Alexey Frunze
大家好,感谢你们的回答! @Alex:你认为编写内核模式驱动程序并获取数据存储在缓冲区中,然后在我的程序中使用这些数据,可以接近我想要实现的目标吗? - Zihad
@user644614:编写内核模式驱动程序并不容易,我也不太确定如何解决SMM/SMI问题(我不知道在操作系统和/或BIOS中要禁用什么来防止它们)。 - Alexey Frunze
中断可以通过使用asm指令cli/sti来禁用。当然,这属于“愚蠢的事情”,因为它会使稳定性受到风险的影响。此外,由于操作系统本身将ISR安装到IDT中,因此中断对操作系统并不透明,因此那里的代码是自定义的,并且实际上可以在IDT上进行HOOK(至少在Win x32上适用于Vista及更高版本),对于旧版本也是可能的。 - LordDoskias
显示剩余3条评论
4个回答

3

这取决于您的软件是否需要可靠运行还是只需在大多数情况下正常运行。

使用普通的Java虚拟机,您无法预测垃圾回收器的行为,因此基本上没有办法防止虚拟机随意中断您的软件执行。

使用支持“实时规范Java”(JSR-1)扩展的VM,可以在Java中实现实时软件,但据我所知,在Windows上没有这样的实现,因为Windows本身没有实时功能。Sun的原始参考实现(现在由Oracle维护)可以在Solaris和启用了实时功能的Linux版本上运行,并且还有其他适用于嵌入式系统的实现。


感谢您的评论!嗯...这个软件将用于神经传导研究(http://en.wikipedia.org/wiki/Nerve_conduction_study)。因此,在获取数据方面必须是可靠的。实际上,原始程序现在在DOS操作系统下运行良好。我的工作是现代化该程序并为Windows开发相同的东西。 如果无法保持微秒精度,至少我需要确保在获取这2000个数据时不会有任何中断。 - Zihad

0

System.nanoTime() 甚至以纳秒时间精度返回时间,您也可以将其用于微秒。


3
但那并不能解决缺失数据采样时刻的问题。 - Alexey Frunze
Alex是正确的。只要您无法确保其他Windows进程在数据采集期间不会中断,它就没有太大帮助。 - Zihad

0

如果您不一定要使用Windows,添加一些额外的硬件可能会很有效。虽然硬件可以像FPGA那样复杂,但您可能可以使用简单的8位微控制器,例如Arduino板和IDE中使用的Atmega328来完成。通过这种方式,您可以对输入进行采样,缓冲数据,并驱动并口连接到PC,微控制器充当实时数据源和接近实时PC数据消耗之间的FIFO。

Atmega328只有2K的RAM,因此您需要确定是否足以覆盖PC的死时间。如果不够,有类似的具有更大RAM的微控制器。

Arduino UNO可用于

如果您不熟悉微控制器,那么皮下没有操作系统引入的不确定性。没有正在“隐形”维护的系统问题。编写代码更像是编写内核驱动程序(因为您需要了解实时考虑因素、中断处理和维护CPU状态的完整性),但周围的系统尽可能简单。

-- Carl


0

有第三方实时扩展程序可用于Windows。这是其中之一:http://www.directinsight.co.uk/products/venturcom/rtx.html

他们声称可以提供硬实时性能。现在,Java是否适合进行实时编程是一个很大的难题。有垃圾回收,JIT编译可能会妨碍...我建议-对于时间关键部分(信号收集),请使用本机代码,为漂亮的GUI构建与Java的接口。

C ++在概念上与Java非常不同,但至少语法相近。

RTX团队明确将自己定位为定制硬件的替代品,声称基于通用主板的Intel CPU可以提供实时处理。然而他们的东西并不免费。如果您想要免费的话,可以选择嵌入式Linux版本。或者选择QNX


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接