728x90
리눅스는 Delay API가 제공되는 것으로 알고 있다.
윈도우는 Delay API가 제공되지 않는다. Sleep API는 제공이 된다.
하지만 Sleep과 Delay는 엄연히 다르다.
Sleep은 Context Switching을 일으키기 때문이다.
또한 Sleep의 파라미터는 Millisec 단위 인데 Sleep(1) 을 한다고 정확히 1 ms 를 쉬는것은 아니다 (약 10 ms 정도? 이는 CPU마다 다른것으로 알고잇다.)
잡설이 길었다.
Windows에서 Microsecond 단위까지 Delay 를 줄 수 있게 QueryPerformanceCounter를 이용하여 간단히 함수를 만들었다.
#include <WinBase.h> static float g_Frequency; QueryPerformanceFrequency(&g_Frequency); void SetDelay(float fMilliSec) { static LARGE_INTEGER BeginTime; static LARGE_INTEGER EndTime; QueryPerformanceCounter(&BeginTime); while (1) { QueryPerformanceCounter(&EndTime); if (((float)(EndTime.QuadPart - BeginTime.QuadPart) / (float)g_Frequency.QuadPart) * 1000.0f >= fMilliSec) break; } }
입력 파라미터는 MilliSec지만 float형이기 떄문에 소숫점을 이용하면 Microsec 까지 커버 가능하다.
해당 Delay 역시 낮은 단위로 내려가면 정교하게 딱 맞아 떨어지진 않는다. 그래도 이정도면 쓸만하다.
728x90
'dev' 카테고리의 다른 글
Raspberry Pi GPIO/WiringPi Pin Number (0) | 2019.02.19 |
---|---|
mosquitto Opening ipv4 Error: ?????? (0) | 2019.02.18 |
변수의 비트값(2진수)을 string으로 출력하는 방법 (0) | 2017.07.21 |
IOCP & Overlapped IO (0) | 2017.07.21 |
InstallShield Serial Number Check Example (0) | 2013.08.12 |