高精度事件计时器

时间:2013-10-28 14:59:54

标签: c++ windows visual-c++ timer operating-system

#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 ++语言帮助我吗?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

新应用程序应使用CreateTimerQueueTimer!

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

CreateTimerQueueTimer function。示例:Using Timer Queues(C ++)。

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

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