<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 한다.
1. 먼저 casting 한다.
tq_ost1.data = (void *) 10;
2. 이 값으로 내용을 파라미터로 받아서 , 원래 받는 쪽에서 사용하면 된다.
int a = (int) data ;
* 참고
sleep 은 blocking 함수
delay은 nob-blocking 함수
'c or linux' 카테고리의 다른 글
[공부중] bottomhalf & work queue (0) | 2011.04.21 |
---|---|
[공부중] queue_task 함수에서 tq_immediate 사용하기 (0) | 2011.04.21 |
[공부중] poll 함수 예제 (0) | 2011.04.21 |
[공부중] blocking io 와 waiting queue (0) | 2011.04.21 |
[공부중] header 파일 -irqs.h (0) | 2011.04.20 |