14. 타이머 디바이스 드라이버를 추가하자

들어가기

PIT 컨트롤러 제어, 타임 스탬프 카운터와 RTC 통해 정밀하게 시간 측정하는 방법에 대해 알아보자.

본론

14.1 디바이스의 특징과 쓰임

  • 타이머 디바이스(PIT)는 PIC의 IRQ 0에 연결, 한 번 또는 일정한 주기로 인터럽트를 발생시킴.
  • 타임 스탬프 카운터는 프로세서 내부에서 클록을 기준으로 카운터가 증가, 클록의 주기가 빨라서 정밀한 시간 측정이 가능하고, 프로세서의 클록을 기준으로 동작하기 때문에 프로파일링에 유용.
  • RTC는 PC의 시계로서 별도의 전원이 존재해 컴퓨터 전원이 꺼져있어도 작동.

14.2 PIT 컨트롤러의 구조와 기능

14.2.1 PIT 컨트롤러, I/O 포트, 레지스터

  • PIT 컨트롤러는 1개의 컨트롤 레지스터와 3개의 카운터로 구성.
    • 컨트롤 레지스터는 쓰기만 가능하고 카운터는 읽기 쓰기 가능.
  • PIT 컨트롤러의 컨트롤 레지스터의 크기는 1 바이트, 카운터 레지스터는 2 바이트.
  • PIT 컨트롤러는의 내부 클록은 1.193182Mhz로 동작, 매회 마다 카운터의 값을 1씩 감소, 0이 되었을 때 신호를 발생.
  • 컨트롤 레지스터의 모드는 총 6개가 존재, 모드 0과 모드 2를 사용.
    • 모드 0 : 카운터가 0이 되었을 때, 외부로 신호를 발생.
    • 모드 2 : 일정한 주기로 신호를 발생.
  • 카운터 0은 다른 카운터와 다르게 IRQ0에 연결되어 있음.

14.2.2 PIT 컨트롤러 초기화

#define PIT_FREQUENCY  1193180
#define MSTOCOUNT(x)   (PIT_FREQUENCY * (x) / 1000)
#define USTOCOUNT(x)   (PIT_FREQUENCY * (x) / 1000000)

... 생략 ...

//1ms마다 주기적으로 인터럽트 발생
kInitializePIT(MSTOCOUNT(1), true);

//100us 후에 인터럽트를 발생
kInitializePIT(USTOCOUNT(100), false)
  • PIT 컨트롤러를 이용해서 시간을 측정하려면 시간을 PIT 컨트롤의 카운터 값으로 변환.
    • 1초에 1193182번 카운터가 증가하므로 이를 계산.

14.2.3 카운터를 읽어 직접 시간 계산하기

WORD kReadCounter0() {
    BYTE bHigh, bLow;
    WORD wTemp = 0;

    kOutPortByte(PIT_PORT_CONTROL, PIT_COUNTER0_LATCH);

    bLow = kInPortByte(PIT_PORT_COUNTER0);
    bHigh = kInPortByte(PIT_PORT_COUNTER0);

    wTemp = bHigh;
    wTemp = (wTemp << 8) | bLow;
    return wTemp;
}
  • 카운터의 차를 이용해서 일정 시간이 경과했는지 여부도 확인 가능.
  • 카운터를 직접 읽기 위해서는 컨트롤 레지스터에 래치 커맨드 전송.

14.3 타임 스탬프 카운터와 RTC

14.3.1 타임 스탬프 카운터와 사용 방법

;타임 스탬프 카운터를 읽어서 반환
kReadTSC:
    push rdx    
    rdtsc

    shl rdx, 32
    or rax, rdx
    pop rdx

    ret
  • rdtsc 명령어를 통해 타임 스탬프를 읽음.
  • 상위 32비트를 edx에 넣고 하위 32비트를 eax에 넣어 전달.

14.3.2 RTC 컨트롤러와 CMOS 메모리

  • RTC 컨트롤러는 BCD 포맷으로 데이터를 저장하므로 읽은 후에 값을 바이너리로 변환해야 함.
  • 14.4 코드 참조.

14.4 PIT 컨트롤러 타임 스탬프 카운터, RTC 통합과 빌드

14.4.1 PIT 컨트롤러 파일 추가

PIT.c 코드 보기
PIT.h 코드 보기

14.4.2 어셈블리어 유틸리티 파일 수정

AssemblyUtility.asm 코드 보기
AssemblyUtility.h 코드 보기

14.4.3 RTC 컨트롤러 파일 추가

RTC.c 코드 보기
RTC.h 코드 보기

14.4.4 콘솔 셸 파일 수정

ConsoleShell.c 코드 보기
ConsoleShell.h 코드 보기

14.4.5 빌드와 실행


마치며

끝..

Share