Windows和Cygwin上的重复计时器,精度为(1)毫秒 我在C++程序中每毫秒调用一个函数有问题。< /P>
我有一个运行FreeRTOS的嵌入式项目,我想在本地机器上运行其中的部分。为此,我使用了一个构建在Posix线程之上的FreeRTOS模拟器。FreeRTOS在内部依赖于每毫秒(或其他可配置的间隔)调用一次滴答处理程序的中断。模拟器使用itimers(setitimer)以固定的间隔生成信号,并使用sigaction将处理程序附加到信号上。但后来我意识到,滴答处理程序的调用时间远小于每毫秒一次。在一次又一次地简化程序之后,我意识到即使是这个片段Windows和Cygwin上的重复计时器,精度为(1)毫秒 我在C++程序中每毫秒调用一个函数有问题。< /P>,c++,multithreading,posix,freertos,C++,Multithreading,Posix,Freertos,我有一个运行FreeRTOS的嵌入式项目,我想在本地机器上运行其中的部分。为此,我使用了一个构建在Posix线程之上的FreeRTOS模拟器。FreeRTOS在内部依赖于每毫秒(或其他可配置的间隔)调用一次滴答处理程序的中断。模拟器使用itimers(setitimer)以固定的间隔生成信号,并使用sigaction将处理程序附加到信号上。但后来我意识到,滴答处理程序的调用时间远小于每毫秒一次。在一次又一次地简化程序之后,我意识到即使是这个片段 std::thread t([]() {
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系统。他们要么使用模拟时钟,要么使用特殊的调度程序,甚至可能使用自定义驱动程序来避免线程调度、优先级提升等,但实际发生的情况并不明显。