我正在尝试使用java在并行端口上创建方波。到目前为止,我已经实现了。
public class Wave extends Thread {
public Wave() {
super();
setPriority(MAX_PRIORITY);
}
@Override
public void run() {
Wave.high();
LockSupport.parkNanos(20000000);
Wave.low();
LockSupport.parkNanos(20000000);
}
public static native void high();
public static native void low();
}
使用JNI实现了high()和low()(共享的C库控制并行端口)。它运作良好;它会产生一个周期约为40ms的方波。使用示波器,计算机空闲时,标准偏差看起来约为10微秒。当计算机闲置时,标准偏差会变得更大。我认为这是因为发生了更多的上下文切换,并且线程在等待状态下停留的时间太长,无法准确地达到指定的20 ms。
有没有办法使我的实现更准确?我知道我可以为此使用硬件,但是我想知道我是否也可以使用软件来做到这一点。
是否可以选择“监听”时钟并执行定时到毫秒的操作?
最佳答案
仅仅“监听”时钟并不能解决上下文切换引起抖动的问题。
如果您可以为此指定一个核心:
System.nanoTime()
或 RDTS
/ RDTSCP
),并在适当时调用high()
/ low()
。 这样,您应该能够实现非常低的抖动。
当然,如果任务是简单地产生方波,则这对计算资源的使用效率很低。