我正在尝试使用 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();
}
其中 high() 和 low() 是使用 JNI 实现的(共享 C 库控制并行端口)。它工作得很好;它产生一个周期约为 40ms 的方波。当计算机空闲时,使用示波器看起来标准偏差约为 10 微秒。当计算机不空闲时,标准偏差会变得更大。我认为这是因为发生了更多的上下文切换,并且线程在等待状态中停留的时间太长,没有准确达到指定的 20 毫秒。
有没有办法让我的实现更准确?我知道我可以为此使用硬件,但我想知道我是否也可以使用软件来做到这一点。
是否可以选择“监听”时钟并执行计时到毫秒的操作?
最佳答案
仅仅“听”时钟并不能解决上下文切换导致抖动的问题。
如果您可以为此专门提供一个核心:
- bind the thread to the core ;
- move IRQ handling to other cores ;
- 有一个tight loop不断检查时间(使用
System.nanoTime()
或RDTS
/RDTSCP
),并根据需要调用high()
/low()
。
这样您应该能够实现非常低的抖动。
当然,如果任务只是简单地产生一个方波,这对计算资源的使用效率非常低。
关于 java 方波,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10431223/