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

4

2 回答 2

2

新应用程序应该使用 CreateTimerQueueTimer!

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

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

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

要获得更高的分辨率,您可能必须按照此处Clock::now()所述设置计时器轮。

于 2013-10-28T15:52:10.380 回答
1

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

于 2013-10-28T15:50:05.553 回答