do_gettimeofday() 버그? 관련 질문드립니다.
글쓴이: enermysong / 작성시간: 금, 2009/03/13 - 12:39오전
안녕하세요! 현재 디바이스 드라이버의 인터럽트 타이밍 측정을 하고 있습니다.
1ms마다 인터럽트를 발생시키는 ISA버스 장치가 있습니다.
이장치는 전원이 인가되면서부터 인터럽트가 발생되어 전원이 OFF될때까지 인터럽트를 발생시킵니다.
이 인터럽트를 이용하여 인터럽트의 시간간격을 구하기 위해서 디바이스 드라이버와 어플리케이션으로 구성하여 테스트중입니다.
제가 하고자하는것은 하루정도 계속 인터럽트 시간을 측정하기 위해서 APPLICATION에서 whil(1)문을 이용하여 측정을 합니다.
측정을 시작해서 처음에는 정상적으로 처리가 됩니다만 인터럽트 발생이 300정도 이후부터 나중에 측정한값이 먼저 측정된 값과 같아진다거나 터무니없이 먼저측정된 값과 나중에 측정된 값의 차이가 30마이크로가 측정됩니다.
제가 값의 차이가 0이 되는 시점에서 inttime1 와 inttime2 변수의 값을 확인해보니 똑같더군요! 근데 어떻게 값이 똑같을수가 있죠?
혹시 이러한 문제점에 대해서 알고 계신분 있으시다면 간단하게나마 답변주시면 감사드리겠습니다.
이건 정말 하루 종일 자료를 찾아봐도 없군요.. 부탁드립니다.
[code] device.c //mytimer[0] -> ISR_GAP_TOTAL //mytimer[1] -> ISR_GAP //mytimer[2] -> ISR_GAP_MAX //mytimer[3] -> ISR_GAP_MIN //mytimer[4] -> ISR_GAP_AVAG struct timeval mytimer[5]; struct timeval inttime1,inttime2; /********** Timevals Macro Function*******************************************/ //중략 /**************************************************************************/ unsigned long long intcount = 0; void int_clear(void) { int lp; for(lp = 0; lp < 5; lp++) //모듈로드시 mytimer[5] 초기화 intcount = 0; } //인터럽트가 발생할때마다 시간을 측정하여 인터럽트의 간격을 구한다. irqreturn_t int_interrupt(int irq, void *dev_id) { //mytimer[0] -> ISR_GAP_TOTAL //mytimer[1] -> ISR_GAP //mytimer[2] -> ISR_GAP_MAX //mytimer[3] -> ISR_GAP_MIN //mytimer[4] -> ISR_GAP_AVAG switch(intcount) { case 0 : do_gettimeofday(&inttime1); break; case 1 : do_gettimeofday(&inttime2); //시간간격을 구한다. break; default : switch(intcount%2) { case 0 : do_gettimeofday(&inttime1); // 최대값과 최소값을 구한다. break; case 1 : do_gettimeofday(&inttime2); // 최대값과 최소값을 구한다. break; } } intcount++; return IRQ_HANDLED; } int int_open(struct inode *inode ,struct file *filp) { GateArrayInit(); request_irq(EPS_IRQ, int_interrupt, IRQF_DISABLED, INT_DEV_NAME,NULL); return 0; } ssize_t int_read(struct file *filp, char *buf, size_t count, loff_t *f_pos) { char *ptrdata; int loop; ptrdata = (char *)&mytimer[0]; for(loop = 0; loop < 5*sizeof(struct timeval); loop++) put_user(ptrdata[loop], (char *)&buf[loop]); return intcount; } APP.C //디바이스 드라이버를 1초마다 READ함수를 이용하여 접근하고 저장되어진 인터럽트 관련된 정보(배열)을 가지고 와서 출력한다. dev = open(DEVICE_FILENAME, O_RDWR|O_NDELAY); if(dev >=0) { printf("start...\n"); printf("wait... input\n"); while(1) { if(!intcount) { memset(mytimer, 0 , sizeof(mytimer)); intcount = read(dev,(char*)&mytimer[0],sizeof(struct timeval)); break; } else printf("input ok...\n"); } while(1) { intcount = read(dev,(char *)mytimer, sizeof(mytimer)); printf("interrupt count = %lu\n",intcount); printf("interrupt ISR_GAP_MAX = %20lu.%09lu\n",mytimer[2].tv_sec,mytimer[2].tv_usec); printf("interrupt ISR_GAP_MIN = %20lu.%09lu\n",mytimer[3].tv_sec,mytimer[3].tv_usec); sleep(1); } close(dev);
Forums:
댓글 달기