我正在尝试使用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。

有没有办法使我的实现更准确?我知道我可以为此使用硬件,但是我想知道我是否也可以使用软件来做到这一点。

是否可以选择“监听”时钟并执行定时到毫秒的操作?

最佳答案

仅仅“监听”时钟并不能解决上下文切换引起抖动的问题。

如果您可以为此指定一个核心:

  • bind the thread to the core;
  • move IRQ handling to other cores;
  • 有一个tight loop不断检查时间(使用 System.nanoTime() RDTS / RDTSCP ),并在适当时调用high() / low()

  • 这样,您应该能够实现非常低的抖动。

    当然,如果任务是简单地产生方波,则这对计算资源的使用效率很低。

    07-26 08:45