● 설정 가능
– 100HZ이면 1초에 100회 타이머 인터럽트 발생
● 10ms 마다 타이머 인터럽트 발생
● 32bit arm 머신에서 사용
– 250HZ이면
● 4ms 마다 타이머 인터럽트 발생
● 64bit 라즈베리파이 // buildroot는 100HZ
● 100HZ vs 250HZ
– Throughput vs Latency
● 전역 변수
● 시스템 시작 이후 발생한 tick 수 저장
●
tick 마다 증가
● 저 해상도 타이머 설정에서 활용
– 예) 500msec 후 타이머 설정
●
jiffies + msecs_to_jiffies(500)
● 리눅스 저 해상도 타이머
● 동적 타이머라고 부르기도 함
● 쉽게 사용 가능
– 초기화 + 만료 시간과 콜백 함수 등록 + 타이머 활성화
timer_setup : 초기화 함수
mod_timer : 타이머를 갱신하고 modify
● make
● scp로 타겟으로 복사 후 insmod 수행
● 임베디드 시스템은 1ms 이하 타이머가 빈번하게 요구됨
– 기존 리눅스 타이머는 4ms 마다 타이머 인터럽트 발생
● 해결책
– 고해상도 타이머(high resolution timer) 이용
● 커널 설정에 따라 아래 시스템 콜은 hrtimer 활용
– nanosleep
– itimers
– posix-timers
● 짧은 지연
– busy waiting
● mdelay(), udelay(), ndelay()
=> task가 sleep에 돌입하지 않고 busy waiting을 한다.
● 긴 지연
– schedule_timeout()
– usleep_range(100, 200)
● Hrtimer 이용
– usleep
● 전원 OFF에도 설정한 시간 유지
– PC에 배터리가 필요한 이유 중 하나.
● SoC 내부에 RTC HW가 존재
– 외부 배터리로 동작
● 활용
– 절대 시각을 읽고 설정
– 알람 설정 기능
● Jiffies는 시스템이 시동한 시각에 상대적
● RTC는 xtime이라는 변수에 유지
– 부팅 중 RTC에서 읽어서 설정함
– 때로는 NTP(Network Time Protocol) 을 이용해 인터넷 시간과 동기화
● 커널 드라이버 인터페이스
– /dev/rtc
● 타이머 + LED를 사용하여 속도 조절 가능한 가상의 엔진 모듈 작성해보자
● 가상 엔진 모듈
– 모터 1
● 좌측 4개 LED (구동은 LED 2개씩 좌우 깜박거림)
– 모터 2
● 우측 4개 LED (구동은 LED 2개씩 좌우 깜박거림)
● 기능 1 - 속도 조절 (타이머 활용)
– SET SPEED
● 1~100
● LED 깜박이는 속도를 설정한다.
● 최저 속도 = 1 : 2초마다 깜박임
● 최고 속도 = 100: 20ms마다 깜박임
● 기능 2 - Halt
– 버튼 인터럽트로 구현
– emergency stop 목적
– 타이머 종료 및 모든 LED OFF