我在Windows上用C做了高分辨率计时?任何人都可以指导我在2ms调用特定功能吗?

时间:2013-10-31 11:36:24

标签: c timer operating-system performancecounter

    hr_time.h:
    ----------
    #include <windows.h>

    typedef struct {
        LARGE_INTEGER start;
        LARGE_INTEGER stop;
    } stopWatch;

    void startTimer( stopWatch *timer);
    void stopTimer( stopWatch *timer);
    double LIToSecs( LARGE_INTEGER * L);
    double getElapsedTime( stopWatch *timer);
    ------------------------------------------------------
    hr_time.c:
    ------------
    #include <windows.h>

    #ifndef hr_timer
    #include "hr_time.h"
    #define hr_timer
    #endif

    void startTimer( stopWatch *timer) {
        QueryPerformanceCounter(&timer->start);
    }

    void stopTimer( stopWatch *timer) {
        QueryPerformanceCounter(&timer->stop);
    }

    double LIToSecs( LARGE_INTEGER * L) {
        LARGE_INTEGER frequency;
        QueryPerformanceFrequency( &frequency );
        return ((double)L->QuadPart /(double)frequency.QuadPart);
    }

    double getElapsedTime( stopWatch *timer) {
        LARGE_INTEGER time;
        time.QuadPart = timer->stop.QuadPart - timer->start.QuadPart;
        return LIToSecs( &time) ;
    }
#include "TIMER1.h"    
void main()
{
/**
 * how to make This task is activated every 2ms ??
 */
TASK( Task2ms )
{

    stopWatch s;
    startTimer(&s);

    if( XCPEVENT_DAQ_OVERLOAD & Xcp_DoDaqForEvent_2msRstr() )
    {

    }

        if( XCPEVENT_MISSING_DTO & Xcp_DoStimForEvent_2msRstr() )
        {

        }


        stopTimer(&s);
        getElapsedTime(&s);

}
}

如果我们在TimeStart和TimeEnd上读取两个读数,那么差异就是计数。将此除以计数器的频率 - 表示为每秒滴答数的值,结果是定时代码执行所用的时间长度。

上面的代码工作正常但需要一些建议才能在2ms或10ms调用该函数。谁能帮助我呢?

声明一个类型为stopWatch的变量,例如s。然后在你想要的代码之前插入一个startTimer(&amp; s)函数调用,在代码之后插入一个stopTimer(&amp; s)调用。然后,您可以调用getElapsedTime(&amp; s)以秒为单位返回精确到微秒的时间。

Myquestion:如何在2ms或10ms调用特定功能?在上面的代码中修改的地方??

我修改了代码并添加了main函数:是否可以每2ms调用一次函数(如:XCPEVENT_DAQ_OVERLOAD&amp; Xcp_DoDaqForEvent_2msRstr()和XCPEVENT_MISSING_DTO&amp; Xcp_DoStimForEvent_2msRstr())?

1 个答案:

答案 0 :(得分:1)

您的问题中的代码摘录显示了如何测量高分辨率的经过时间。他们没有说明如何安排定期执行。这需要一个计时器。

毫无疑问,标准的Win32计时器是低分辨率计时器。你需要一个高分辨率计时器。最常用的示例是multimedia timer。最近,这些已被弃用,转而使用timer queues