do_gettimeofday() 버그? 관련 질문드립니다.

enermysong의 이미지

안녕하세요! 현재 디바이스 드라이버의 인터럽트 타이밍 측정을 하고 있습니다.

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

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.