panda.jpg 


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


비가 왕창 왔었내요. 시원하고 좋았지만 오늘은 다시 해가 쨍쨍


날이 덥지만 그래도 시작해 보겠습니다.


1. 복습!!



 저번 시간에 워크큐에 사용하는 구조체를 알아 보았습니다.


 #include <linux/workqueue.h> 에 선언 되어있었죠?


 struct work_struct {

unsigned long  pending;

struct list_head  entry;

void  (*func)(void *);

void  *data;

struct timer_list timer;

 };                                                                                                                                                                       


여기서 중요한 변수는 우리가 만들어 주어야 하는 func, data라고 말했습니다.

(요것들은 오늘 알아보겠습니다.ㅎㅎ)


work_struct 구조체를 사용하기 위해서는 당연히 선언과 초기화를 해주어야 겠죠?


DECLARE_WORK( name, void (*function)(void *), void *data); 


위 매트로를 사용해서 선언을 해줍니다.


name     - 선언하는 변수 이름

function - 수행할 워크 큐 함수

data       - 함수에 넘겨 줄 인자(데이터)


위 인자들은 오늘 알아 보도록 하겠습니다.


그럼 시작해 볼까요?


2. 워크 큐 초기화




워크큐를 선언 및 초기화 할 때 넘겨주는 func 함수는 우리가 워크큐를 통해 깨워줄때 동작하는 함수 입니다.


안의 내용은 작성자에 따라 다 달라지겠죠? 


함수 원형도 간단 합니다.


void * xxx_func( void * data );


간단 하죠? void * data는 DECLARE_WORK 에 넘겨주는 data를 받아 옵니다.


data를 사용 안하는 경우에는 DECLARE_WORK 에서 NULL 값을 넘겨주면 됩니다.


func 함수는 void 형태로 data를 넘겨 받기 때문에 이 변수가 어떤 형태로 오는지 모릅니다.


그러니 형변환을 해주어야 합니다.


보통 다음과 같이 진행될껍니다.


 void * xxx_func( void * data )                                                                                                                               

{

struct xxx_data_t *pmtdata;

pmydata = (staruct xxx_data_t *) data;

.

.

.

}


선언을 했으면 워크큐를 등록해야 겠죠? 이때 사용하는 함수가 있습니다.


scahedule_work()               : 워크 큐 구조체를 등록

scahedule_delayed_work()  : 지정된 시간 후에 워크 큐 구조체를 등록


두함수의 차이는 아시겠죠? 원형은 다음과 같습니다.


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 );


이런 식으로 사용하면 되겠죠?


이제 등록한 워크 큐에 이벤트를 주어 동작 시키는 부분이 남았지만 요건 다음시간으로 미루겠습니다.


그럼 오늘도 여기까지!!


다음시간에 만나요~