2013-03-21 61 views
0

我想測量運行Angstrom操作系統的Beaglebone上的方波時間。我寫了一個內核驅動程序來註冊一個ISR,在這個ISR中我正在計算這些脈衝。一切正常,但測量的時間間隔是完全錯誤的。我使用do_gettimeofday()函數來測量時間。當我在使用poll()函數的用戶空間程序中做同樣的事情時,我可以獲得正確的值(它顯示100us左右的波形大約爲1007 us),但是當我使用驅動程序來測量脈衝時, 1923us。我不知道爲什麼內核中的時間間隔高於用戶空間中的時間間隔。下面附上了我的代碼。 如果有人能在我的程序中發現錯誤,我將不勝感激。Beaglebone do_gettimeofday()給錯誤時間

內核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; 
} 

用戶空間PROG:

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 2013-03-21 02:18:11

+0

時間間隔可能不像你聲稱的那樣是「錯誤的」。你的代碼試圖獲得一個鎖(通過在ISR中調用'do_gettimeofday()')。 – sawdust 2013-03-21 02:33:34

+0

感謝您的回覆。但我不明白如何獲得鎖定會導致這種行爲。你能解釋一下嗎? – user1971707 2013-03-21 06:17:03

回答

1

建檔中斷延遲,我覺得非常有用偷懶,設置一個GPIO引腳然後測量時用示波器。可能不是您想要的答案,但它可能會很快幫助您跨越障礙。