본문 바로가기

Embedded/Device Driver

Kernel Timer 사용하기

.Kernel Timer를 사용하고자 하는 이유!
    본 프로젝트에서 ir통신을 하기 위함이다.
        ir은 적외선을 이용한 통신 방법이다.
        수광부와 발광부가 있어서 수광부에서 쏘는 적외선을 발광부에서 인지하는 것이다.
    ir통신에서 수광부의 깜빡임을 발광부에서 인지해야 한다.
    그러려면 디바이스 드라이버에서는 신뢰성이 있는 깜빡는 신호를 보내줄 수 있어야 하고,
    수광부에서는 그 값을 신뢰성있게 읽어 줘야 한다.

    이때 신뢰성을 지키는 것으로 kernel timer를 사용하는 것이다!!!
    
    커널 타이머는 하드웨어 상태를 주기적으로 감시하거나 정해진 시간을 초과하면 특정 함수를 수행하도록 할 때 쓰이게 되며 타이머 인터럽트를 통해 구현된다.

.Kernel Timer 사용법
    kernel timer를 사용하기 위해서는 <linux/timer.h> 헤더파일이 include되야 한다.
    
    동작 순서는 다음과 같다.
        1.타이머 인터럽트 발생
        2.스케줄링에 필요한 처리 수행
        3.커널 타이머 목록 데이터 구조체 검사(linked list 형의 구조체이다)
        4.구조체의 기산 필드에 정해진 시간을 초과한 함수가 있다면 함수 호출
        5.수행이 끝난 함수를 포함한 구조체는 커널 타이머 목록에서 제거
    
    커널 타이머 구조체 : struct timer_list
    커널 타이머 구조체 초기화 : init_timer()
    커널 타이머에 수행될 함수 등록 : add_timer()
    커널 타이머 목록에서 등록 된 것을 제거 : del_timer()

.커널 타이머 구조체
    struct timer_list {
        unsigned long expires;            함수가 수행될 시점(커널 타이머의 만료 시간)
        unsigned long data;            함수가 참조할 수 있는 데이터의 맨 처음 주소를 지정
        void (*function)(unsigned long);        커널 타이머가 만료되어 수행될 함수를 설정한다.
    }

.프로젝트에서 사용은?
    본 프로젝트에서는 일정한 주기로 신호를 보내고 받으려고 한다.
    이때 일정 간격을 만들기 위해서 timer_list 구조체의 expires 값에 우리가 원하는 주기 값을 넣어주면된다.
    그러면 그 주기마다 우리가 함수가 호출 될것이다. ( 이때의 함수란 timer_list 구조체의 functions 구조체 )
    

.예문
    ====커널 타이머 구조체 초기화====
    char data[DATA_SIZE];
    struct timer_list XXX_timer;
    void kerneltimer_handler (unsigned long arg)
    {
    }
    XXX_timer_init() {
        init_timer(&XXX_timer);
        timer.expires = get_jiffies_64() + (3 * HZ / 10);
        timer.data = (unsigned long) &data[0];
        timer.functions = kerneltimer_handler;
    }

    ====커널 타이머 등록====
    add_timer (&XXX_timer);

    ====커널 타이머 제거====
    del_timer(&XXX_timer);
    이 함수의 반환값이 0이면 이미 제거 되었다는 이고, 1이면 성공적으로 제거했다는 것이다.

'Embedded > Device Driver' 카테고리의 다른 글

udev  (1) 2011.05.03
Device Driver] 인터럽트_Interrupt  (0) 2011.05.03
Device Driver] Kernel Facilities  (0) 2011.04.30
Device Driver] 커널 메시지 출력  (0) 2011.04.25
Device Driver] Hello World 모듈 컴파일  (0) 2011.04.25