尽可能准确地安排事件的开始时间

时间:2017-12-10 02:56:07

标签: real-time

我想安排一系列事件,使得到最近的5ms,事件N的开始时间是t0 + dt * N,其中t0是过程开始后的某个任意时间。如果事件输出到终端,它们将定期发生而没有暂停或加速。如果它们是噪音,它会产生规律的节奏。这是我的第一次尝试。

#include <stdio.h>
#include <time.h>
#include <math.h>

void fsleep(double t)
{
    time_t sec = floor(t);
    long nsec = 1e9*(t - sec);
    struct timespec s;
    s.tv_sec = sec;
    s.tv_nsec = nsec;
    nanosleep(&s, NULL);
}

int main(int argc, const char **argv)
{
    for (unsigned i = 0;; i++) {
        printf("%d\n", i);
        fflush(stdout);
        fsleep(0.334);
    }
}

即使是实时优先级(nice -n -20)也是总垃圾。一直有明显的紧张情绪,暂停时间最长为1秒,之后连续打印一大堆数字。为了测试它是否是我的终端,我制作了以下脚本:

from time import sleep
from sys import stdin
def raw_stdin():
    """Switches stdin to a non-buffering, non-echoing mode,
    handing keystrokes directly to the program as soon as they're 
    received and printing nothing to the terminal."""
    import termios as t
    f = t.tcgetattr(stdin)
    f[3] &= ~(t.ICANON|t.ECHO)
    t.tcsetattr(stdin, t.TCSANOW, f)

raw_stdin()

for i in range(10000000):
    #sleep(.334)
    stdin.read(1)
    print(i)

如果我经常敲击任何一个按键,即每次按下相同的时间间隔到最近的10ms左右,我会得到常规输出,没有犹豫。这证明了终端的响应速度不够快,而且我尝试做的事情是可能的。我很难想象电脑无法用我的左手食指做些什么。

我认为这可能与我的Linux内核有关。我有兴趣知道如果在Windows或其他Linux内核中运行会发生什么。

1 个答案:

答案 0 :(得分:0)

我明白了。这是我的终端(xfce4-terminal)。它中有一个错误会弄乱实时输出。有关详情,请参阅https://stackoverflow.com/a/47744798/1840698