2013-03-21 2 views
0

Я пытаюсь измерить период времени квадратной волны на Beaglebone, работающем Angstrom OS. Я написал драйвер ядра для регистрации ISR, в котором я синхронизирую импульсы. Все работает нормально, но измеряемый временной интервал полностью ошибочен. Я использую функцию do_gettimeofday() для измерения времени. Когда я делаю то же самое в программе userpace, используя функцию poll(), я могу достичь правильных значений (это показывает около 1007 нас для волны 1000us), но когда я использую драйвер для измерения импульса, я получаю интервал как 1923us. Я понятия не имею, почему временной интервал в ядре выше, чем в пользовательском пространстве. Я прикрепил свой код ниже. Я был бы признателен, если кто-то найдет ошибку в моей программе.do_gettimeofday() в Beaglebone, дающий неправильное время

ядро ​​ISR:

static irqreturn_t ISR (int irq, void *dev_id) 
{ 

prev = c; 
do_gettimeofday(&c); 

printk(KERN_ALERT "%ld", (c.tv_usec - prev.tv_usec)); 
return IRQ_HANDLED; 
} 

пользовательские проги:

while(1){ 
    prev = start; 
    gettimeofday(&start, NULL); 
    rc = poll(&fdset, 1, 20000); 
    if(rc < 0){ 
     printf("Error in rc\n"); 
     return -1; 
    } 

    if(rc == 0){ 
     printf("Timed out\n"); 
     return -1; 
    } 

    if (fdset.revents & POLLPRI) { 
     len = read(fdset.fd, buf, 2); 
     printf("%ld\n", (start.tv_usec - prev.tv_usec)); 
    } 

} 
+0

[Ссылка на другой вопрос о различных функциях часов/времени.] (Http://stackoverflow.com/questions/12392278/getrusage-vs-clock-gettime-vs-clock-vs-gettimeofday) – sawdust

+0

Временной интервал может не будет «неправильным», как вы утверждаете. Ваш код пытается получить блокировку (вызывая 'do_gettimeofday()') в ISR. – sawdust

+0

Спасибо за ответ. Но я не понимаю, как получение блокировки приводит к такому поведению. Не могли бы вы объяснить? – user1971707

ответ

1

Для профилирования прерывания задержки, я считаю, это очень полезно, чтобы быть ленивыми и установить штифт GPIO затем измерять время с помощью осциллографа , Вероятно, это не тот ответ, который вам нужен, но это может помочь вам преодолеть препятствие быстро.