panda.jpg 


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


오늘은 응용프로그램을 작성해보고 저번시간에 만든 디바이스 드라이버를 이용하여


실습을 해보도록 하겠습니다.


1. 응용 프로그램 작성



자 그럼 응용프로그램을 만들어 보겠습니다.


#include <stdio.h>                                                          

#include <stdlib.h>

#include <string.h>

#include <sys/types.h>

#include <sys/stat.h>

#include <sys/ioctl.h>

#include <fcntl.h>

#include <unistd.h>

 

int main()

{

       int          dev_work;

       char             buff[100];

 

       dev_work   = open("/dev/workqueue",O_RDWR);

 

       if(dev_work < 0)

       {

             printf("err dev_work\n");

             return -1;

       }

 

       printf("read wait\n");

 

       read( dev_work, buff, 1);

 

       printf("write 1st\n");

 

       write( dev_work, buff, 1);

 

       printf("write 2st\n");

 

       write( dev_work, buff, 2);

 

 

       close(dev_work);

 

       return 0;

}

  


응용 프로그램은 간단하죠?


기본적인 open, close, read, write 함수만 사용하였습니다.


저번시간에 디바이스 드라이버에서 대기 큐를 사용했기 때문에 read와 write 함수를 호출 했을 때


인터럽트를 기다리며 잠들게 됩니다.


이때 인터럽트를 발생 시키면 해당 동작이 이루어 지겠죠


또 그에따라 워크 큐가 언제 호출 되는지 알아 보겠습니다.


2. 실습




자 먼저 컴파일을 통해 work_app(응용프로그램) 파일과 dev_work.ko(디바이스 드라이버) 파일을 만들어 둡니다.

(요즘 귀차니즘에 의해 컴파일 과정은 생략 합니다 ㅎㅎ)


자 그럼 보드에 디바이스 드라이버를 등록 해보겠습니다.


 insmod dev_work.ko                                                                                                                                         

 &work_app


 request irq read ok

 request irq read ok

 read wait

 [WORK QUEUE] Enter workqueue_read in read

 [WORK QUEUE] Enter workqueue function



그리고 응용 프로그램을 실행 시키면 그림처럼 메시지를 출력 후 아무 작업도 안하고 있습니다.


왜? read 명령이 처리되길 기다리고 있으니까요


그럼 GPN6번 핀에 강제로 인터럽트를 걸어 보겠습니다.

(단순하게 GPN6번 핀과 GND를 연결해 주시면 됩니다.)


자 그럼 다음과 같이 나올 겁니다.


[WORK QUEUE] Enter workqueue_interrupt in interrupt                                               

[WORK QUEUE] Enter workqueue function

[WORK QUEUE] After schedule_work in interrupt

[WORK_QUEUE] After schedule_work in read

write 1st

[WORK QUEUE] Enter workqueue_write in write

[WORK QUEUE] Enter workqueue function


보시다 시피 워크큐도 동작을 했습니다.


write 부분도 마찬가지로 GPN5번 핀과 GND를 연결해 주시면 다음과 같이 진행을 합니다.


[WORK QUEUE] Enter workqueue_interrupt in interrupt                                               

[WORK QUEUE] Enter workqueue function

[WORK QUEUE] After schedule_work in interrupt

[WORK_QUEUE] After schedule_work in write

write 2st

[WORK QUEUE] Enter workqueue_write in write

[WORK QUEUE] Enter workqueue function



간단하죠? 

(나중에 보니 소스코드가 적적하게 만들지는않았내요 ㅎㅎ)


시간에 여유가 있으신분은 응용하여 다른 디바이스 드라이버를 작성해 보신다면


더욱 이해가 잘 되실겁니다.


그럼 오늘도 여기까지


그럼 다음시간에 만나요~