배우고픈 공돌이
인터럽트와는 다르게 지속적으로 io를 감시할 때, 워크 큐를 사용한다. *센싱장치 중에서 간헐적으로 얻는게 아닌 항상 감지가 필요한 키 매트릭스 등에 사용하는 기법이다. 사용할 때, 타이머를 사용하면 좋겠지만 그보다 더 빠른 처리, 큰 데이터 처리가 요구되면 워크큐를 생각할 수 있다. 예를 들어 블럭킹 코드를 생각해보자. ISR 안의 프로세스를 깨우는 동작이 실행되면 디바이스 READ에서 동작을 처리한다. 여기서, ISR의 데이터 처리량이 많아진다면(길어진다면) 그만큼 효율이 떨어진다. 이를 분산하고, 보조하기 위한 장치가 work queue이다. ISR에서 신호의 값만 추출한 후, 그 신호를 분석하기 위해 work queue를 놓고 READ를 실행하면 이상적일 것이다. *ISR만 놓는다면, 후에 들어온..
센서를 읽는 프로세스가 생성되었을 때, 그 센서의 신호가 비동기적으로(간헐적으로) 동작한다 가정한다.이 가정에서 계속 프로세스가 Run이 된다면 비효율적이다.그래서 인터럽트가 되기전에는 잠재우고, 인터럽트 발생 시에 wait queue에서 run queue로 이동시킨다면 효율적인 프로세싱이 된다. (*blocking은 멀티프로세싱(os), RTOS에서 의미가 있다.) 그렇기 위해서 필요한 헤더는 /linux/wait.h로 다음과 같은 타입의 wait queue를 생성해주어야한다. #include #include #include #include #include #include #include #include #include #include #include #include "skeleton.h"#includ..
아직 커널 인터럽트를 처리하기 위한 하드웨어 장치가 도착하지 않았음으로 인터럽트를 타이머에 물려 처리하는 것으로 한다. *커널에서 인터럽트 처리를 하기 위한 과정 * 프로세서에서의 인터럽트 컨트롤러 정보 ( intel의 pxa270프로세서 / 삼성 exynose 4412 ) *우분투의 interrupt 정보 /proc/interrupts *소스#include #include #include #include #include #include #include #include #include #include #include #include "skeleton.h" #define SK_IRQ 7#define SK_MAJOR240 int result;static KERNEL_TIMER_MANAGER *ptrmng =..