<linux 2.4>

Os Timer 보다 더 빠른 처리가 필요하다. tick interrupt를 사용해야 하는 게 좋다.

----
arm의 경우 interrupt의 우선순위를 본다.
reset : 1
s/w interrupt : 6  (시스템 콜) <- app
irq : 4


struct tq_struct 을 이용해서  int queue_task()를 사용한다.

tq_timer와 tq_immediate 가 크게 사용되는데. tq_timer를 많이 사용한다.
tq_immediate는 언제 수행될지 모른다. 즉 시스템콜을 사용하지 않으면  수행을 보장 받을 수 없어서. tq_timer를 많이 사용한다.





DECLARE_WAIT_QUEUE_HEAD(WaitQueue_Read);


struct tq_struct tq_ost1;
 

// 여기서는 block을 해도 된다. sleep을 써야 한다.
void tq_timer1(void * data)
{
       int i ;
for (i = 1 ; i< (int) data ; i++) {
  printk("TaskQueue Funcion_ %d..\n", i);
                msleep(100);
}
wake_up_interruptible(&WaitQueue_Read);
}

// 여기서는 block을 하면 안된다. sleep 함수를 쓸 수 없다. 대신 delay를 쓰면 된다.
void ost1_interrupt(int irq, void *dev_id, struct pt_regs *regs) {

    OST1_TIMER_OFF;
    printk("OST1 Int enter ...\n");
    flag_ost1Int = 1;
    tq_ost1.routine = tq_timer1;
    tq_ost1.data = (void *) 10;
    queue_task(&tq_ost1, &tq_timer);
    printk("OST1 Int exit...\n");
}




* 참고
void * 형 타입에 int 값을 지정하고 파라미터로 넘길 때... 유의할 점이 있다.
struct tq_strcut 의 data 의 값은 void * 이다.  여기서 int로 넘겨본다.
 
1. 먼저 casting 한다.  
tq_ost1.data = (void *) 10;

2. 이 값으로  내용을 파라미터로 받아서 , 원래 받는 쪽에서 사용하면 된다.
int a = (int) data ;


* 참고
sleep 은 blocking 함수
delay은 nob-blocking 함수

Posted by '김용환'
,