高精度事件计时器

High precision event timer

本文关键字:计时器 事件 高精度      更新时间:2023-10-16
#include "target.h"
#include "xcp.h"
#include "LocatedVars.h"
#include "osek.h"

/**
 * This task is activated every 10ms.
 */
long OSTICKDURATION;
TASK( Task10ms )
{
    void XCP_FN_TYPE Xcp_CmdProcessor( void );
    uint32 startTime = GetQueryPerformanceCounter();
    /* Trigger DAQ for the 10ms XCP raster. */
    if( XCPEVENT_DAQ_OVERLOAD & Xcp_DoDaqForEvent_10msRstr() )
    {
        ++numDaqOverload10ms;
    }
    /* Update those variables which are modified every 10ms. */
    counter16 += slope16;
    /* Trigger STIM for the 10ms XCP raster. */
    if( enableBypass10ms )
    {
        if( XCPEVENT_MISSING_DTO & Xcp_DoStimForEvent_10msRstr() )
        {
            ++numMissingDto10ms;
        }
    }

    duration10ms = (uint32)( ( GetQueryPerformanceCounter() - startTime ) / STOPWATCH_TICKS_PER_US );
}

某个精确的时钟同步以在特定时间间隔调用函数的最简单(和/或最佳)方法是什么,在正常情况下抖动很小,从C++?我现在正在研究WINDOWS操作系统。上面的代码是针对 RTAS OSEK 的,但我想在 Windows 操作系统的特定时间间隔调用一个函数。任何人都可以用 c++ 语言帮助我吗?

新应用程序应使用 CreateTimerQueueTimer!

此队列中的计时器(称为计时器队列计时器)是轻量级对象,可用于指定在指定的到期时间到达时要调用的回调函数。等待操作由线程池中的线程执行。

CreateTimerQueueTimer 函数。示例:使用计时器队列 (C++)。

但是,粒度约为 1 毫秒,10 毫秒的设置可能会导致 9/11 毫秒的周期性打嗝。

要获得更高的分辨率,您可能需要使用Clock::now()设置计时器轮,如此处所述。

timeSetEvent API 将为您提供可用的最佳稳定性,并且可以低至 1 毫秒的间隔。