[問題] clock_nanosleep() 還是不準的問題...

作者: user48625 (小宮山先生)   2014-07-17 21:54:50
我不確定這問題要發在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...
作者: filiaslayers (司馬雲)   2014-07-18 09:53:00
之前做的時候,linux好像沒辦法做到這麼高的準度
作者: scott260202 (Cake)   2014-07-18 13:10:00
還是不行的話買個震晶自己弄上gpio? 不知道可不可以XD
作者: user48625 (小宮山先生)   2014-07-18 14:44:00
不曉得若改成realtime OS有效嗎?
作者: yvb   2014-07-18 15:01:00
1. 是否已將 function/system call overhead 列入考慮 ?2. context switch 需要時間, 且可能有相當範圍的誤差.3. 是否使用 chrt 之類調高執行的 priority ?
作者: bitlife (BIT一生)   2014-07-19 12:58:00
需要us級精準度的,就不該使用OS了,應該是main loop程式自行控制會比較好.如果要用OS,可能要自己把sleep時間扣掉OSoverhead,但這不保險,除非完全熟悉OS流程怎麼跑
作者: user48625 (小宮山先生)   2014-07-19 19:31:00
謝謝,我查了一些資料,preempt的jitter似乎只能到10us..
作者: yvb   2014-07-20 00:51:00
比起 Linux 板, 也許 LinuxDev 板更合適?要求時間精度有幾種類型,包含讀取時間刻度,短延時,長延時幾種;短延時比方10us delay不可誤差超過1us,長延時則如 1s 的誤差,這幾種類型的處理方式都有相當的差異.另外, b大的意思是完全不用OS? 或只是不要使用 syscall ?
作者: gaiwei (gaiwei)   2014-07-23 00:49:00
schedule一定不準,但user mode好像沒busy waiting可用考慮自己弄一個?

Links booklink

Contact Us: admin [ a t ] ucptt.com