panda.jpg 


안녕하세요 판다 이우영입니다.


컴퓨터가 이상해져서 맨붕상태 입니다.


하지만 오늘도 공부는 해야겠죠?


먼저 복습 들어갑니다.


1. 복습!!



 저번 시간에는 워크 큐에 등록하는 함수에 대해서 알아 보았습니다.


다시 한번 살펴 보겠습니다. 먼저 함수의 원형은 다음과 같이 나와있습니다.


void * xxx_func( void * data );


void * data는 DECLARE_WORK 에 넘겨주는 data를 받아 온다고 설명 했엇습니다.


이 data의 형태는 디바이스 드라이버 작성자가 만든 규칙에 따라 무엇이든 될 수 있습니다.


그럼 등록을 해볼까요? 등록은 다음 함수를 통해서 진행 합니다.


int scahedule_work( struct work_struct * work );

int scahedule_delayed_work( struct work_struct * work, unsigned long delay );


이 함수가 정상적으로 등록 된다면 1 실패한다면 0을 반환 합니다.

(에러처리는 중요합니다. 사용하실때는 꼭 확인해 보세요!!)


사용은  아래와 같이 이용하시면 됩니다.


scahedule_work( &xxx_work );

scahedule_delayed_work( &xxx_work, 200 );


xxx_func가 호출 되면 보통 다음과 같이 사용합니다.


 void * xxx_func( void * data )                                                                                                                               

{

struct xxx_data_t *pmtdata;

pmydata = (staruct xxx_data_t *) data;

.

.

.

}


그럼 오늘 공부를 시작해 보겠습니다.


2. 등록한 워크 큐 동작 시키기




등록한 워크 큐를 깨워 주는 것도 간단합니다.


queue_work()                 

queue_delayed_work()


위 함수를 호출 하면 wake_up() 함수가 호출되고


워크 큐를 처리 해주는 keventd 스레드가 동작을 합니다.


keventd 스레드는 등록된 xxx_func 을 실행 시켜 줍니다.

(keventd는 커널이 워크 큐를 처리하기 위해 만든 스레드 입니다.)


함수의 원형은 다음과 같습니다.


int queue_work( struct workqueue_struct *queue, struct work_struct *work );

int queue_delayed_work( struct workqueue_struct *queue, struct work_struct *work, unsigned long delay );


위 함수들도 성공 한다면 1 실패한다면 0을 반환 합니다.



워크 큐를 사용하는 방법을 다시 한번 설명 하겠습니다.


1. DECLARE_WORK 메크로를 이용하여 work_struct 변수생성 및 초기화 합니다.

ex) DECLARE_WORK( my_work, my_work_func, NULL );


2. scahedule_work 함수를 통해 커널에 등록을 합니다.

ex) scahedule_work( &my_work );


3. queue_work(), queue_delayed_work() 를 호출한다.


4. keventd 스레드가 등록된 워크 큐를 실행 시켜 준다.



그럼 오늘도 여기 까지


다음 시간부터는 직접 소스크도를 작성하고 테스트를 해보겠습니다.


그럼 다음시간에 만나요~