clock_nanosleep() 還是不準的問題... - Linux

Table of Contents

我不確定這問題要發在linux板或C_and_CPP板比較好,

目前我打算用嵌入式開發板 beaglebone black 上安裝Debian, kernel 3.15,

因為某些需要,所以時間精度要求要在 1us 以下,所以我打算用clock_nanosleep()實現

但我給 1s 的delay,他實際睡眠時間卻是 1s 又 120us,我是在clock_nanosleep()前後

加上clock_gettime(),然後把兩個時間相減得到的數字.. 總是會睡過頭。

另外我有用linuxPTP(某種利用PTP校正系統時間(CLOCK_REALTIME)的軟體),並且將示波器

接上GPIO看1PPS的準確度,delay也是多了100us左右...


請問有辦法讓系統達到至少 1us 以下的時間精度嗎? 譬如我設delay 1s,實際delay是

1s 又 200ns 之類的,用realtime OS有幫助嗎? 或者這是kernel counter的問題(但我對

linux的時間設計並不是很了解,只知道作業系統的計時跟counter有關)?


希望能獲前輩指教,謝謝。


下面是我其中的三組數據:

da 69033 dan 946956445
db 69034 dbn 947070913

da 69035 dan 947355036
db 69036 dbn 947490079

da 69037 dan 947738536
db 69038 dbn 947863215

左邊是秒(絕對時間),右邊是奈秒(絕對時間),故上下兩組相減可看到多了快100us...

--

All Comments

Margaret avatarMargaret2014-07-18
之前做的時候,linux好像沒辦法做到這麼高的準度
Lily avatarLily2014-07-21
還是不行的話買個震晶自己弄上gpio? 不知道可不可以X
Lydia avatarLydia2014-07-23
D
Damian avatarDamian2014-07-23
不曉得若改成realtime OS有效嗎?
Christine avatarChristine2014-07-28
1. 是否已將 function/system call overhead 列入考慮 ?
Cara avatarCara2014-07-28
2. context switch 需要時間, 且可能有相當範圍的誤差.
Leila avatarLeila2014-07-30
3. 是否使用 chrt 之類調高執行的 priority ?
Damian avatarDamian2014-08-02
需要us級精準度的,就不該使用OS了,應該是main loop程式自
Victoria avatarVictoria2014-08-05
行控制會比較好.如果要用OS,可能要自己把sleep時間扣掉OS
Annie avatarAnnie2014-08-06
overhead,但這不保險,除非完全熟悉OS流程怎麼跑
Eartha avatarEartha2014-08-10
謝謝,我查了一些資料,preempt的jitter似乎只能到10us..
Andy avatarAndy2014-08-12
比起 Linux 板, 也許 LinuxDev 板更合適?
Mary avatarMary2014-08-15
要求時間精度有幾種類型,包含讀取時間刻度,短延時,長延時幾種;
Kumar avatarKumar2014-08-19
短延時比方10us delay不可誤差超過1us,長延時則如 1s 的誤差,
Odelette avatarOdelette2014-08-23
這幾種類型的處理方式都有相當的差異.
Oscar avatarOscar2014-08-28
另外, b大的意思是完全不用OS? 或只是不要使用 syscall ?
Elma avatarElma2014-08-29
schedule一定不準,但user mode好像沒busy waiting可用
Olivia avatarOlivia2014-09-03
考慮自己弄一個?