2013-10-28 133 views
1
#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++語言來協助我嗎?高精度事件計時器

+0

歡迎來到SO,您可能會考慮更改您的問題,因爲[高精度事件計時器](http://en.wikipedia.org/wiki/High_Precision_Event_Timer)用於某個硬件計時器配置。 – Arno

回答

1

timeSetEvent API將爲您提供最佳的穩定性,並且可以降低至1毫秒的間隔。

1

新的應用程序應該使用CreateTimerQueueTimer!

此隊列中的定時器(稱爲定時器隊列定時器)是輕量級對象,可用於指定在指定的到期時間內調用的回調函數。等待操作由線程池中的線程執行。

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

但是,粒度大約爲1ms,10ms的設置可能會導致9/11 ms的週期性呃逆。

對於較高分辨率,您可能必須使用Clock::now()設置一個計時器輪,如here所述。

+0

你說的高精度設備定時器? –

+0

oups,什麼是高精度設備計時器? – Arno