|
에러 내용인즉은 아래와 같습니다.
C:\camera\cameraDlg.cpp(157) : error C2400: inline assembler syntax error in 'second operand'; found 'AND'
그럼
만복대.산수유 님이 쓰신 글 :
: 1. getTick 매크로에서 레지스터들을 사용하는데
: getTick 내부에서 해당 레지스터 사용직전에 그 값들을 대피(push 레지스터이름)시킨 후
: 사용이 끝나면 복원(pop 레지스터이름)시켜야 안전할 것으로 생각됩니다.
: 당연한 얘기겠지만 pop의 순서는 push의 역순으로 해야 합니다.
: 2. __asm lea ebx, count; 를 __asm lea ebx, [&count];로 변경
: 3. 한편 CPU의 실제 속도는 아래 getTick과 더불어 QueryPerformanceCounter, QueryPerformanceFrequency WinAPI를 사용하면 알 수 있습니다. 아마도 2,3초 이상을 경과시켜보면 99% 정확한 CPU 속도가 나올것입니다.
: 실제속도를 100% 정확하게 알아내는 방법은 무엇일까요?.
:
: #define getTick(count){ \
: __asm push eax; \
: __asm push ebx; \
: __asm push edx; \
: \
: __asm rdtsc; \
: __asm lea ebx, [&count]; \
: __asm mov dword ptr [ebx], eax; \
: __asm mov dword ptr [ebx + 4], edx; \
: \
: __asm pop edx; \
: __asm pop ebx; \
: __asm pop eax; \
: }
:
: 김상면 님이 쓰신 글 :
: : 열씸! 님이 쓰신 글 :
: : : RDTSC를 이용한 슬립을 구현하면 됩니다.
: : :
: : : #define getTick(count){ \
: : : __asm rdtsc; \
: : : __asm lea ebx, count; \
: : : __asm mov dword ptr [ebx], eax; \
: : : __asm mov dword ptr [ebx + 4], edx; \
: : : }
: : :
: : : 위에 작성한 것은 64비트 자료형를 파라미터로 받아 전원이 들어온 후 지금까지의
: : : CPU 클럭틱을 가지고 오는 매크로 함수죠.
: : :
: : : __int64 start, end;
: : : getTick(start);
: : : ::Sleep(1000);
: : : getTick(end);
: : : ShowMessage(end - start);
: : : 해 보시면 1초간 CPU 속도 만큼을 카운트 한다는걸 알 수 있죠.
: : : (2.8기가 CPU면 2800000000 회를 카운트 합니다)
: : :
: : :
: : : 쓰레드를 하나 만들고
: : : 쓰레드의 실행 함수 안에서
: : : __int64 last, current;
: : : getTick(last);
: : :
: : : while(쓰레드 생존여부){
: : : while((getTick(current) - last) < 주기); // 이부분이 주기 만큼을 놉니다.
: : : last = current;
: : : // 부가 작업.... 예를들어 이 쓰레드 타이머에 등록된 함수 (콜백함수)를 호출해 준다거나,
: : : // 이 쓰레드를 생성시킨 윈도우(혹은 윈 컨트롤)에 메시지를 던지면 되죠.
: : : }
: : :
: : : 이렇게 구성된 타이머 쓰레드를 작성하면 됩니다.
: : : 여기서 주기라는걸 나노초와 같은 절대 시간에 맞춰주고 싶다면,
: : : 현재 CPU 클럭이 어느정도냐를 위에 언급한 예와 같이 (5초동안 구해서 5로 나눈다든지 하면 더 정확하죠)
: : : 산출해서, 그걸 필요 단위 시간으로 다시 나눈 클럭 횟수지요.
: : :
: : : 물론 이렇게만 구현하면, 처음 1초나 5초동안 산출한 CPU 클럭이 절대적으로 확실한 수치는 아니기에
: : : 조금씩 차이가 생길 수도 있습니다만, 일단 나노 수준의 빈도는 보장이 되고,
: : : 중간 중간에 현재시간을 읽어 보정을 해 주면 보다 정확해 지지요.
|