강좌 & 팁
글 수 2,412
2012.01.01 22:03:40 (*.159.57.82)
43439
타겟보드를 이용하여 디바이스 드라이버를 배워보자!(11)
안녕하세요 이우영 입니다.
2012년입니다 모두 모두 복 많이 받으세요~
오늘은 리눅스에서 제공하는 타이머 인터럽트를 알아 보도록 하겠습니다.
그럼 2012년도 모두 파이팅!!
타이머 인터럽트란?
타이머 인터럽트는 사용자가 정해준 시간마다 등록한 특정 작업을 할 수있게 해주는 기능 입니다.
(정해준 시간마다 인터럽트가 발생하여 등록한 함수를 호출해 줍니다.)
윈도우 프로그래밍을 해보신분은 API의 타이머를 생각하시면 편하실 겁니다.
정해준 시간마다 등록한 함수를 수행 하지만 여기서 중요한 점은 리눅스가 리얼타임 OS가 아니기 때문에
이시간을 100% 보장 해주지는 않습니다.
(오차가 발생 한다는 것입니다.)
타이머 인터럽트는 스케줄러를 호출하기위해서 리눅스에서는 기본 적으로 제공하고 있는 서비스입니다.
(눈에 보이지 않지만 스케줄러도 주기적인 시간마다 동작하고 있습니다.)
타이머는 하드웨어의 타이머를 통해 실행 하게 되는데 이 하드웨어의 타이머는 하드웨어마다 시간이 다 다릅니다.
그래서 리눅스 커널에서 HZ라는 상수값을 두어 발생 주기가 1초가 되는 값을 정의해 두었습니다.
우리가 사용하는 ARM은 100~1000 까지 4가지로 쓰입니다.
버전에 따라 달라지는 거죠
그럼 우리 커널은 어떤걸 사용하는지 확인해 볼까요?
우선 커널이 있는 위치로 갑니다. 저는 /home/woo/device_driver/linux-2.6.29-ez-s3c6410 에 위치하고 있습니다.
여기에 보면 파일중에 .config 라는 피일이 있습니다. 파일명 앞에 .이 붙어있으면 파일이 안보입니다.
ls -al을 치시면 보입니다.
이파일을 열어서 HZ를 검색해보면
위와 같이 1000으로 설정 되어 있습니다.
(이 커널의 타이머가 1000번 동작할때 1초라는 뜻입니다.)
여기까지 커널 타이머의 동작 시간을 알아 보았습니다.
그럼 커널 타이머를 등록하고 해제하는 법에 대해서 알아보겠습니다.
API 함수
리눅스는 커널 타이머를 제어하기위해 API를 제공하고 있습니다.
커널 타이머에 관한 소스코드는 linux/timer.h 에 포함 되어있습니다.
커널 타이머를 사용하기위해서는 struct timer_list 구조체가 필요합니다.
주로 쓰이는 함수는 init_timer, add_timer, del_timer 3가지 함수 입니다.
이름과같이 타이머를 초기화 하고, 추가하고, 삭제할때 사용합니다.
우선 struct timer_list 구조체 부터 살펴 보겠습니다.
11struct timer_list { 12 struct list_head entry; 13 unsigned long expires; 14 15 void (*function)(unsigned long); 16 unsigned long data; 17 18 struct tvec_base *base; 19#ifdef CONFIG_TIMER_STATS 20 void *start_site; 21 char start_comm[16]; 22 int start_pid; 23#endif 24};
필드가 적당하게 많이도 적지도 않게 있습니다.
지금은 요런게 있구나하고 넘어가겠습니다.
(사용 방법은 다음시간에 ㅎㅎ 실제로 사용하는 필드는 몇개 없습니다.)
void init_timer(struct timer_list *timer);
사용자가 만든 timer_list를 받아 초기화 해주는 함수 입니다.
void add_timer(struct timer_list *timer);
설정한 값으로 타이머를 등록해주는 함수 입니다.
사용하기전에 구조체에 정보를 입력해 주어야 합니다.
void del_timer(struct timer_list *timer);
마지막으로 타이머를 삭제할 때 위 함수를 사용하여 타이머를 제거 합니다.
(한번 동작한 타이머는 자동으로 삭제됩니다.)
오늘은 여기까지 해서 사용하는 함수에 대해서만 간단하게 알아 보았습니다.
그럼 다음시간에 오늘 배운 API를 사용해서 소스코드를 작성해 보겠습니다.
그럼 다음시간에 만나요~
빠른만남을 원하시면 http://ms-osek.org/ 여기로 찾아오세요~