강좌 & 팁
안녕하세요 판다 이우영입니다.
오늘은 응용프로그램을 작성해보고 저번시간에 만든 디바이스 드라이버를 이용하여
실습을 해보도록 하겠습니다.
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 |
간단하죠?
(나중에 보니 소스코드가 적적하게 만들지는않았내요 ㅎㅎ)
시간에 여유가 있으신분은 응용하여 다른 디바이스 드라이버를 작성해 보신다면
더욱 이해가 잘 되실겁니다.
그럼 오늘도 여기까지
그럼 다음시간에 만나요~