인터럽트의 수행시간 측정에 관하여 질문드립니다.
글쓴이: enermysong / 작성시간: 월, 2009/03/16 - 10:08오전
안녕하세요! 현재 아래에 인터럽트 서비스 함수를 구현해서 인터럽트의 간격을 구하고 있습니다.
1ms 간격으로 인터럽트를 발생기키는 장치에 의해서 인터럽트가 발생하는데요 이 인터럽트를 이용하여 계속해서 시간을 측정합니다. 시간은 평균값과 MAX, MIN 값을 구하는데요 가끔가다가 시간을 잘못 가져와서 MIN이 0이나오는 경우가 발생하고 있습니다. 그래서 0이 나올때 앞서 측정한 값과 나중에 측정한 값을 찍어 보았더니 같은 시간 값이 나옵니다. 어떻게 이런 경우가 발생하는지.....
이게 소스상의 문제는 아니라고 보여집니다만 도대체 해결방법을 찾지를 못하겠습니다.
아시는 분 계시다면 꼭좀 알려주세요!
irqreturn_t int_interrupt(int irq, void *dev_id) { do_gettimeofday(&inttime[intcount%2]); if(intcount > 0 && intcount%2 == 1) { timersub(&inttime[1],&inttime[0],&mytimer[1]); timeradd(&mytimer[0],&mytimer[1],&mytimer[0]); if(timercmp(&mytimer[1],&mytimer[2],>)) mytimer[2] = mytimer[1]; if(timercmp(&mytimer[1],&mytimer[3],<)) mytimer[3] = mytimer[1]; } else if(intcount > 0 && intcount%2 == 0) { timersub(&inttime[0],&inttime[1],&mytimer[1]); timeradd(&mytimer[0],&mytimer[1],&mytimer[0]); if(timercmp(&mytimer[1],&mytimer[2],>)) mytimer[2] = mytimer[1]; if(timercmp(&mytimer[1],&mytimer[3],<)) mytimer[3] = mytimer[1]; } intcount++; return IRQ_HANDLED;
Forums:
linux/ktime.h ktime_get(),
linux/ktime.h
ktime_get(), ktime_sub(), ktime_to_us()
OTL
원래 그런거 같은데요.
OS 타이머의 resolution이 1ms보다 훨씬 크지 않나요?
당연한 결과 같은데요....
Jtag으로 찍어보시는 것이 정확할 듯 싶은데요...
답변
답변 감사드립니다.
OS의 분해능이 1ms보다 크다라고 말씀하신것 같은데요! do_gettimeofday()라는 함수는 나노까지 측정가능하지 않습니까? 물론 완전히 정확하지는 않겠지만요.!
제가 알기론
제가 알기론 그런류의 함수들이 알려주는 값이 nano sec단위로 있는 것이지,
분해능이 그렇지는 않습니다.
정확하고 안정확하고의 얘기가 아닙니다.
정확히 측정하려면
정확히 측정하려면 타이머 레지스터를 직접 읽어서 사용하는 방법이 있습니다. 레지스터는 플랫폼마다 틀리지만, 대부분의 플랫폼에 시간을 측정할만한 타이머가 한두개쯤은 있습니다. 실제 OS에서도 그것으로 정밀한 시간을 측정하는걸로 알고있습니다.
만약 x86을 쓰신다면 8253을 사용하는 것도 좋은 방법이죠.
답변 감사드립니다.
1ms 이하의 시간을 측정하기에는 do_gettimeofday()함수가 적당하지 않은것 같네요! 잘 알겠습니다.
답변 주신 모든 분들께 감사드립니다.
댓글 달기