[질문] interrupt 발생시 user가 action을 취하는 방법?
글쓴이: pangjun / 작성시간: 토, 2004/12/11 - 5:22오후
user가 특정 register의 값을 읽어 가려고 합니다.
그런데 인터럽트가 발생했을때만 읽어 가고,
아직 발생하지 않았으면, 기다렸다가 인터럽트 발생후에 깨어나서
읽어가려구 합니다.
대충 아래와 같이 하려고 하는데요
void irq_handler() { bReceivedIrq = 1; wake_up_interruptible(x); } void read_register() { while(!bReceivedIrq) { interruptible_sleep_on_timeout(x, 100); } READ_REG(); // 실제 register 읽어가는 함수.. bReceivedIrq = 0; }
그런데 문제가 while 조건문을 체크한 다음에 인터럽트가 발생하면,
while문 안으로 들어가 버리면서 인터럽트는 sleep 되어 버리고
최대 100tick 후에야 실제 register를 읽게 되네요.
이런현상이 빈번히 일어나서 약간 문제가 되어서 tick을 100에서 10으로
줄이니, 너무 자주 while이 돌아서 cpu를 소모하구요...
좋은 방법이 없을까요?
혹, atomic 하게... interruptible_sleep_on에 조건문을 체크하는 것은 없나요?
조건문을 만족하지 않으면 interrupt_sleep_on으로 들어가는데.. 이런것이
atomic하게 이루어지는...
보통 interrupt driven 방식은 어떻게들 처리 하시나요?
인터럽트가 발생했을때, 어떤 action을 유저쪽에서 취해야 하는데...
Forums:
궁금해서 여쭈어보는건데요, polling말고 현재 프로세스가 인터럽트 도
궁금해서 여쭈어보는건데요, polling말고 현재 프로세스가 인터럽트 도착을 알수 있는 방법은 없나요?
저같은 경우 하드웨어적인 인터럽트는 다뤄보지 않아서 뭐라 말씀드리기 그렇지만,
시그널(소프트웨어적인 인터럽트)처리를 할 경우에는 pause()를 써서 시그널을 받은 이후에 처리를 하고, 파일 디스크립터일 경우에는 select를 써서 작업할 꺼리가 있는지 확인을 합니다.
혹은 irq_handler에서 인터럽트를 disable시키고 난후에 원하시는 일을 다 처리해버리고, 다시 enable 시키고 빠져나오면 어떤가요?
=================================
Jason
You are never too old to do something smart
=================================
이 방법도 생각해 봤습니다.[code:1]void irq_hand
이 방법도 생각해 봤습니다.
이와 같은 방법도 생각해 봤습니다.
인터럽트를 잠시 막고... 인터럽트가 발생햇는지 안했는지 체크한 다음에
발생하지 않았으면, 인터럽트를 푼 다음, sleep 상태로 빠지는...
그러나 문제는 마찬가지입니다.
인터럽트 발생하지 않아서, 인터럽트를 푼 다음, sleep으로 가기 직전에
인터럽트가 발생해 버리면, 인터럽트 핸들러 후에,
interruptible_sleep_on(x) 이 호출되면서, 또 인터럽트를 놓치게
됩니다.
좀 좋은 방법 고수님들의 추천 부탁드립니다...
인터럽트 핸들러 내에 레지스터의 값을 읽는 루틴을 넣으세요.레지스터
인터럽트 핸들러 내에 레지스터의 값을 읽는 루틴을 넣으세요.
레지스터 값을 Queue와 같은 자료구조 안에 넣어두면 되겠지요.
그리고서는 메인루틴에서는 큐가 비어있는지 확인해서 처리하면 되겠지요...
사실... 위에 코드는 대충 적어 놓은것인데...실제 코드는 레지스터
사실... 위에 코드는 대충 적어 놓은것인데...
실제 코드는 레지스터 값을 queue에 넣어서 그렇게 처리되어 있습니다..
문제는 큐가 비어 잇는 상황에서 발생을 합니다..
큐가 비어져 있다고 판단해서 인터럽트를 기다리는 순간에
인터럽트가 발생하면.. 또... 놓치는 일이 발생합니다.
실제 초당 인터럽트가 10번정도 비 주기적으로 뜨고,
그것을 처리하는데... 한 20분 정도에 한번꼴로 그런일이 빈번하게
발생을 합니다.
잘 이해가 안되는데 왜 semaphore나 mutex를 안쓰시는지요?
잘 이해가 안되는데 왜 semaphore나 mutex를 안쓰시는지요?
binary semaphore로 block하고 인터럽트 핸들러에서 unblock해주면 되는데....
[quote]큐가 비어져 있다고 판단해서 인터럽트를 기다리는 순간에
인터럽트 핸들러 내에 레지스터 값을 큐에 넣는 루틴이 있다면, 적어도 레지스터 값은 큐에 인터럽트가 발생한 순서대로 들어가 있겠죠... 따라서 인터럽트를 놓친다고 표현하신 부분은 인터럽드 자체를 놓친다는 말이 아니라, 아마도 while루프에서 sleep하는 부분 때문에 반응성이 떨어진다는 말로 보이는군요.
메인 루틴에서 큐가 비어있다면 블럭되도록 하셔야 합니다. interruptible_sleep_on_timeout(x, 100) 를 쓰지 마시고요.
[quote="Anonymous"]인터럽트 핸들러 내에 레지스터
예.. 반응성이 떨어지는 문제 때문에 그러합니다....
반응성을 높이는 방법이 궁금해서요.
마찬가지 아닐까요?
큐가 비어 있다구 메인 루틴에서 판단했을 경우,
block되도록 하려고 하는 시점에서 인터럽트가 뜨고,
인터럽트루틴에서는 큐에 채워 넣게 되면,
다시 timeout 걸릴때까지 반응이 늦어 지는...
제가 잘 몰라서 그러는데요... 마찬가지 아닐까요?
binary semaphore나 mutex를 쓰더라도.
큐 없이 바로바로 응답할수 있는 경우라면 가능한데
큐가 있다면 큐가 비워졌는지, 체크하는 루틴에서
딱 걸릴거 같은데요...
wait_event_interruptible (x, cond); 이라는게
wait_event_interruptible (x, cond); 이라는게 있다는군요..
가능한한 최대한의 반응성을 높이는 방법인것 같은데..
내부에 schedule()을 호출 하더군요...
그런데 timeout이 없어서요...
이와 비슷한 기능의 timeout 까지 되는거 혹시 없을까요?
:D
[code:1]void irq_handler() 
이부분을 이렇게 바꾸면 어떤가요
제가 알기로는
interruptible_sleep_on_timeout();
말고
interruptible_sleep_on();
함수는 queue가 발생할때까지 block하고 있는 것인데요..
그냥 block해서 기다리면 될텐데...
굳이 while()문을 돌 필요가 있나요..
구조적으로 바꾸고 싶으시면, read()를 쓰지 마시고
select나 polling을 쓰는 방법을 검토 해보는것도 방법일 듯 합니다.
Re: [질문] interrupt 발생시 user가 action을 취하는 방법?
Re: [질문] interrupt 발생시 user가 action을 취하는 방법?
user의 job을 interrupt 루틴에 넣기에는 user level에서 해야 할 일이 너무 많습니다. 파일 io도 존재하구요.
현재는 전용의 유저 thread가 하나 돌면서,
인터럽트를 기다리고 있다가 인터럽트가 발생하면 깨어나서
그 일을 처리하고 다시 인터럽트를 기다리는 일을 하는것이죠.
어느 정도 interrupt driven이라고 할수도 있지 않을까요? :D
문제는 그 일을 하는 유저 thread가 인터럽트를 기다릴때,
놓치는 일(timeout을 걸면 timeout 후에 다시 확인후반응을...)이
있다는것이었죠.
Re: [질문] interrupt 발생시 user가 action을 취하는 방법?
wait_event_interruptible_timeout(wq, condition, timeout)
얘기 하시는 것 같네요.
comment를 보면 interrupt_sleep_on 은 2.7에서 없어질 것이랍니다.
Re: [질문] interrupt 발생시 user가 action을 취하는 방법?
위 경우 요청한 만큼만 job을 workqueue에 넣어둔 경우입니다.
맞습니다.
wait_event_interruptible_timeout 를 찾을수가
wait_event_interruptible_timeout 를 찾을수가 없어서요...
제가 원하는 기능은 그것이 딱 맞는거 같은데...
그런기능을 하는것을 찾을수가 없네요...
커널 2.4.18을 사용하고 있구요...
wait_event_interruptible을 사용해 봤는데,
이넘은 timeout을 걸수가 없구요...
업 버젼에는 있나요? wait_event_interruptible_timeout이...
e> google에 검색해 보니.. 패치가 있군요... 감사합니다... :D
댓글 달기