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 に答える