panda.jpg


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


오늘은 저번 시간에 이어서 POLL의 마지막 시간입니다.


실제 소스코드를 작성해 보고 어떤식으로 동작하는지 이해해 보겠습니다.

(동작 원리만을위한 아주 간단하게 작성. 자세하게는 귀찮지즘이 발생해서 못해요~)


1. 응용 프로그램 작성




응용프로그램은 2개의 디바이스 드라이버를 사용하는 것으로 작성해 보겠습니다.


먼저 기억을 살려보겠습니다.


poll을 사용하려면 pollfd 구조체를 만들고 여기에 사용하는 디바이스의 정보를 등록해야 한다고 했습니다.


struct pollfd 

{

int     fd; //파일 디스크립터 번호를 등록한다.

short events; //요구하는 이벤트

short revents; //반환된 이벤트

}


기억 나시죠?


그럼 소스 코드를 작성해 보겠습니다.




 poll_app.c 

                                                                                                                                                                            

  

#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>

 

#include <sys/poll.h>

 

#define DEVICE_FILENAME1        "/dev/polldev1"

#define DEVICE_FILENAME2        "/dev/polldev2"

 

int main()

{

        int                     dev_1;

        int                     dev_2;

 

        struct pollfd         Events[ 2];

        int                      retval;

 

        char                   buff[128];

        int                     readcnt;

        int                     i;

        int                     flashing;

 

        printf("poll program start\n");

 

        dev_1 = open( DEVICE_FILENAME1 ,O_RDWR);

        dev_2 = open( DEVICE_FILENAME2 ,O_RDWR);

 

        if(dev_1 < 0)

        {

               printf("err dev_int\n");

               return -1;

        }

        if(dev_2 < 0)

        {

               printf("err dev_timer\n");

               return -1;

        }

 

        printf("wait poll \n");

 

        while(1)

        {

             buff[0] = 0x0;

 

               memset(Events, 0, sizeof(Events));

               Events[0].fd           = dev_1;

               Events[0].events       = POLLIN;

 

               Events[1].fd           = dev_2;

               Events[1].events       = POLLIN;

 

               retval = poll((struct pollfd *)&Events, 2, 2000);

 

               if(retval < 0)

               {

                       perror("poll error : ");

                       exit(EXIT_FAILURE);

               }

 

               if(retval == 0)

               {

                       printf("NO POLL EVENT!!!\n");

                       continue;

               }

 

               for(i=0; i<2; i++)

               {

                       if(Events[i].revents & POLLERR)

                       {

                              printf("Device %d Error\n",i);

                              exit(EXIT_FAILURE);

                       }

               }

               if(Events[0].revents & POLLIN)

               {

                       read(dev_1,buff,sizeof(buff));

                        printf( "read[%d] %s\n",0,buff);

               }

               if(Events[1].revents & POLLIN)

               {

                       read(dev_2,buff,sizeof(buff));

                        printf( "read[%d] %s\n",1,buff);

               }

 

        }

 

        close(dev_1);

        close(dev_2);

 

        return 0;

}

 



응용 프로그램은 간단합니다.


2개의 디바이스 드라이를 open합니다. 그리고 pollfd에 등록을 하죠


그리고 poll함수를 호출합니다.


retval = poll((struct pollfd *)&Events, 2, 2000);


첫인자는 pollfd 구조체를 넘겨주는 것이고 2는 몇개의 디바이스를사용하는가


그리고 2000은 2초동안 감시하라는 것입니다.


poll 함수를 호출 하고 에러가 발생하면 0보다 작은 값을 넘겨주고


2초동안 이벤트가 발생하지 않는다면 0을 

(이때는 continue를 통해 아래 루티을 실행하지 않도록 했습니다.)


이벤트가 발생했다면 발생한 이벤트의 수를 넘겨 줍니다.


이벤트가 발생했지만 어떤 디바이스 드라이버에서 발생했는지 모릅니다.


그래서 pollfd의 revents를 확인해서 어떤 디바이스 드라이버에서 어떤 이밴트가 발생 했는지 확인해줍니다.


그리고 발생한 이벤트에 따라 read나 write등의 수행을 해주면 됩니다.


아무래도 오늘은 응용프로그램까지 작성해야 할꺼 같습니다.


다음시간에는 사용할 디바이스 드라이버를 작성해 보겠습니다.


GPIO 를 통해 인터럽트를 발생시키는 디바이스 드라이버를 만들것입니다.


인터럽트가 발생하면 poll을 통해 응용프로그램에 알리고 응용프로그램은 이벤트가 발생한 디바이스 드라이버의


메시지를 읽어와 화면에 출력해 줄것입니다.

(먼저 해보실분은 혼자 작성해 보세요)


그럼 다음시간에 만나겠습니다.