Timer는 어떻게 작동할까?
타이머는 시간을 설정하고 설정한 시간이 끝나면 어떤 이벤트가 발생하는게 기능적인 동작이다.
아래 Zynq-7000의 내부를 살펴보면, Timer가 여러 개가 있다. 이 중에서 Private timer에 대해서 더 알아보자
Private Timer
4개의 레지스터가 존재하는데 하나씩 보자
1. Load Register
- 간단히 말하면 사용자가 설정한 시간을 저장하는 레지스터다. 길이는 32bit다.
2. Counter Register
- 마찬가지로 32bit인데 숫자를 세는 레지스터다. 위에 Load 레지스터와 어떻게 연결돼 있는지 보면,
str r2, [r3] 동작을 수행했다고 하자. 이때 r3의 주소가 Load 레지스터고 r2에는 1000이 저장돼 있다고 하면, load 레지스터에 1000이 저장되고, load 레지스터의 값을 counter 레지스터가 복사하여 clock이 튈 때마다 1씩 감소하는 형태다.
그러다가 counter 레지스터의 값이 0으로 세팅되면 어떤 mode냐에 따라 달리 동작하는데 single-shot mode와 auto-reload mode가 있다.
만약 single-shot mode라면 0으로 세팅되면 끝이다. 그냥 1000만 세고 끝나거라고 보면 된다.
그런데 auto-reload mode라면 다시 Load 레지스터에 있는 값을 복사하여 감소하기 시작한다.
그렇다면 clock의 시간은 어떻게 정할까?? zynq-7000에 따르면 Private time와 Watchdog timer는 CPU frequency의 1/2을 따른다고 한다. CPU frequency는 666MHZ를 따르니 clock은 333MHZ를 따른다. 즉 timer clock은 333MHZ라는 말이다.
하드웨어로 구현하려면 F/F를 이용해서 clk에 맞춰서 1씩 감소하면 된다.
3. Control Register
- timer의 설정을 관장하는 레지스터다. format은 아래와 같다.
- Prescaler는 우리가 333MHZ를 입력으로 받으면 원하는 클럭을 조절하는 부분이다. 어떻게 보면 나눗셈을 하는 부분이라고 볼 수 있다.
좀 더 자세히 보면 Clock_out = { Clock_in / (prescalar + 1) } 로 계산된다. 이렇게 되면 Clock_out을 기준으로 counter 레지스터가 동작한다. 즉, 기존 clock보다 더 느리게 만드는 것인데 더 빠르게 만들 수 있을까?? 없다. 빠르게 만들기 위해선 PLL이라는 하드웨어 소자가 필요한데 일반적으로 timer에는 지원하지 않는다.
- IRQ enable가 1로 세팅되면 counter 레지스터가 0으로 됐을 때 interrupt를 발생하겠다고 CPU에서 신호를 보내는 것이다.
- Auto reload는 0이면 single shot, 1이면 auto reload라는 의미다.
- Timer enable은 0이면 동작하지 않겠다는 의미고, 1이면 동작한다는 의미다. 어떻게 보면 전원 같은 느낌이다.
4. Status Register
- Interrupt를 알려주는 레지스터로 counter 레지스터가 0이 되면 자동적으로 Event flag가 1로 세팅된다.
그리고 Event Flag를 0으로 만들고 싶다면 1을 적어줘야 한다. 좀 헷갈릴 수 있는데 무슨 말이냐면, r1이 Event flag의 주소를 가지고 있고 r2에 1이 저장돼 있다면 str r2, [r1]과 같이 해줘야 0으로 clear된다.
이렇게 Private Timer에 대해서 알아봤다.
'시스템 반도체 > Arm' 카테고리의 다른 글
VIVADO 사용법 ( board 연결, zynq 7000, Vits 연결 ) (2) | 2022.09.20 |
---|---|
TLB란? ( page table, 48bit 가상 공간, virtual memory, ASID , TTBR, arm ) (1) | 2022.08.24 |
Arm calling convention ( 레지스터 사용, caller, callee, AAPCS ) (0) | 2022.08.02 |
Arm TrustZone ( 신뢰공간, TEE, monitor, banked register, memory ) (0) | 2022.06.24 |
Arm GIC, SGI ( interrupt controller, 인터럽트 컨트롤러 ) (0) | 2022.05.31 |
댓글