Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows和Cygwin上的重复计时器,精度为(1)毫秒 我在C++程序中每毫秒调用一个函数有问题。< /P>_C++_Multithreading_Posix_Freertos - Fatal编程技术网

Windows和Cygwin上的重复计时器,精度为(1)毫秒 我在C++程序中每毫秒调用一个函数有问题。< /P>

Windows和Cygwin上的重复计时器,精度为(1)毫秒 我在C++程序中每毫秒调用一个函数有问题。< /P>,c++,multithreading,posix,freertos,C++,Multithreading,Posix,Freertos,我有一个运行FreeRTOS的嵌入式项目,我想在本地机器上运行其中的部分。为此,我使用了一个构建在Posix线程之上的FreeRTOS模拟器。FreeRTOS在内部依赖于每毫秒(或其他可配置的间隔)调用一次滴答处理程序的中断。模拟器使用itimers(setitimer)以固定的间隔生成信号,并使用sigaction将处理程序附加到信号上。但后来我意识到,滴答处理程序的调用时间远小于每毫秒一次。在一次又一次地简化程序之后,我意识到即使是这个片段 std::thread t([]() {

我有一个运行FreeRTOS的嵌入式项目,我想在本地机器上运行其中的部分。为此,我使用了一个构建在Posix线程之上的FreeRTOS模拟器。FreeRTOS在内部依赖于每毫秒(或其他可配置的间隔)调用一次滴答处理程序的中断。模拟器使用itimers(setitimer)以固定的间隔生成信号,并使用sigaction将处理程序附加到信号上。但后来我意识到,滴答处理程序的调用时间远小于每毫秒一次。在一次又一次地简化程序之后,我意识到即使是这个片段

std::thread t([]() {
    int i = 0;
    while (true) {
        std::this_thread::sleep_for(std::chrono::microseconds(1000));
        if ((i++ % 100) == 0)
            printf("tick\n");
    }
});
t.detach();

while(true) {}
指纹的滴答声比你想象的要小得多。 我知道,睡眠功能通常不能保证在间隔期结束后立即醒来,而且显著的开销会导致延迟,睡眠时间越短,延迟就越明显。 我要寻找的是一个实用的解决方案,以令人满意的精度模拟RTOS的systick定时器


顺便说一下,我的平台是Windows10上的Cygwin。可能是Linux发行版上的itimer实现更好。

一点也不-硬实时操作系统比非实时操作系统更适合实时操作。如果你尝试Ubuntu,它不是实时的,你也会遇到问题。如果以低优先级运行程序,其计时器的精度将低于以高优先级运行的进程。Windows可以通过及其实时工作队列处理软实时和多媒体作业(要求远远超过1ms的精度)。如果没有它,Windows将无法处理游戏、视频和音频而不会出现口吃。不过,这仍然是软实时的。您可以将通用计时器配置为更频繁地运行,但这会导致更高的功耗。这就是Chrome所做的,也是为什么每个人都讨厌它。不过,在任何操作系统中,中断都是尽可能从用户线程中获取的。线程调度意味着您的进程可以在任何时刻中断,而无需知道它何时会返回。在非RT操作系统上使用模拟器无法获得与RT系统相同的精度。我敢肯定很多人已经建立了RT和RT系统。我知道Windows从00年代就开始用于软RT系统。他们要么使用模拟时钟,要么使用特殊的调度程序,甚至可能使用自定义驱动程序来避免线程调度、优先级提升等,但实际发生的情况并不明显。一点也不——硬实时操作系统比非实时操作系统更擅长实时操作。如果你尝试Ubuntu,它不是实时的,你也会遇到问题。如果以低优先级运行程序,其计时器的精度将低于以高优先级运行的进程。Windows可以通过及其实时工作队列处理软实时和多媒体作业(要求远远超过1ms的精度)。如果没有它,Windows将无法处理游戏、视频和音频而不会出现口吃。不过,这仍然是软实时的。您可以将通用计时器配置为更频繁地运行,但这会导致更高的功耗。这就是Chrome所做的,也是为什么每个人都讨厌它。不过,在任何操作系统中,中断都是尽可能从用户线程中获取的。线程调度意味着您的进程可以在任何时刻中断,而无需知道它何时会返回。在非RT操作系统上使用模拟器无法获得与RT系统相同的精度。我敢肯定很多人已经建立了RT和RT系统。我知道Windows从00年代就开始用于软RT系统。他们要么使用模拟时钟,要么使用特殊的调度程序,甚至可能使用自定义驱动程序来避免线程调度、优先级提升等,但实际发生的情况并不明显。