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

作者: i386 (i386 cpu)   2014-07-19 14:36:26
1. 首先你要先確認timer上的clock為多少Hz(通常為APB clock), 這會
決定你的timer精準度到多少, 如果希望timer精準度到1ns, 意味著timer clock
要跑在1000MHz,換句話說, 就是timer counter加一時間經過1ns.
2. cpu透過bus讀取timer counter是要花時間的, 這時間長短取決很多因素,
cpu頻率,架構, bus頻率等等...通常要精準知道cpu讀取一個週邊硬體暫存器需要多少
clock cycle, 大多會從IC designer上的模擬數據來估算.
3. 量測上既有的誤差, 用print message或trigger GPIO看示波器都會有一定
的誤差存在. 最基本的從cpu去讀取timer counter就有一定的clock cycle延遲.
4. 一般timer IP可能都會有多組timer, 試試看可否改用別組timer來觸發中斷,
這樣的方式overhead就落在OS的irq service routing, context switch, timer本身的精準度, 以及
timer發出中斷給interrupt controller回應的時間.
5.context switch影響的變因跟cpu cache架構和OS的搭配有關系. 可以去看看最後作
context switch那段assembly code裡面對TLB和cache的處理方式.
※ 引述《user48625 (小宮山先生)》之銘言:
: 我不確定這問題要發在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...
作者: user48625 (小宮山先生)   2014-07-19 19:28:00
謝謝! 學問很大, 我該考慮是否要換個架構...
作者: yvb   2014-07-20 01:09:00
原 PO 有提到打算用開發板 beaglebone black,看了一下規格, 其 timer 為 DMTimer, 不知算是怎樣的 clock ?
作者: i386 (i386 cpu)   2014-07-20 09:20:00
這要看AM335x technical reference manual

Links booklink

Contact Us: admin [ a t ] ucptt.com