ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Timer Resolution 향상: 15.6ms -> 1ms
    Study/C&C++ 2016. 1. 7. 19:58

    C++로 프로그램 작성후 실행 시, thread 내부에서 sleep을 해보면 1ms를 설정해도 보장이 되지 않는 경우가 많다.

    특히, serial 통신으로 데이터를 받아오는 thread를 실행하였을 때 15.6ms 마다 데이터를 받아 저장하는 것을 볼 수 있었다.

    고성능의 데스크톱에서는 1ms로 잘 동작하지만, 랩톱이나 미니PC에서만 15.6ms가 되는 것을 확인하였고,

    랩톱의 경우 외부 전원을 연결하면 15.6ms 이하로 낮아지는 것을 확인하였다.


    그래서 원인으로, CPU, mainboard chipset, windows 버전, visual studio version, power 부족, thread library 등을 의심해 보았지만,

    어떤 방법으로도 해결되지 않았다.


    그래서 15.6ms에 대한 단서로 검색해 보니, 윈도의 기본 timer resolution이 15.6ms, 7.8ms, ... 등으로 설정된다는 것을 알았고,

    그 방법으로 아래 링크에서 두가지 방법을 찾을 수 있었다.


    http://stackoverflow.com/questions/3744032/why-are-net-timers-limited-to-15-ms-resolution


    1번 방법은 장치의 timer 시간을 변경하는 방법인데, timeBeginPeriod 함수를 사용하면 된다.

    이 방법은 간단하면서 아주 잘 작동하는 것 같다.

    #define TARGET_RESOLUTION 1         // 1-millisecond target resolution
    
    TIMECAPS tc;
    UINT     wTimerRes;
    
    if (timeGetDevCaps(&tc, sizeof(TIMECAPS)) != TIMERR_NOERROR) 
    {
       // Error; application can't continue.
    }
    
    wTimerRes = min(max(tc.wPeriodMin, TARGET_RESOLUTION), tc.wPeriodMax);
    timeBeginPeriod(wTimerRes); 
    
    //       do your stuff here at approx. 1 ms timer resolution
    timeEndPeriod(wTimerRes); 


    2번 방법은 NtSetTimerResolution 함수를 사용하는데, timeBeginPeriod를 사용하는 방법과 내부적으로는 같은 방법이라고 한다.

    'Study > C&C++' 카테고리의 다른 글

    warning LNK4042  (2) 2016.08.30
    Resource view 에러  (0) 2016.08.07
    Chrono  (0) 2015.11.20
    [펌] [VS2010] _AFXDLL 버그 리포트  (0) 2013.01.21
    [VS2010] 인텔리센스 에러: /MD _AFXDLL  (0) 2012.05.04
Designed by Tistory.