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

Elma avatar
By Elma
at 2014-07-19T14:36

Table of Contents

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...

--
Tags: Linux

All Comments

Doris avatar
By Doris
at 2014-07-24T10:50
謝謝! 學問很大, 我該考慮是否要換個架構...
Todd Johnson avatar
By Todd Johnson
at 2014-07-25T20:44
原 PO 有提到打算用開發板 beaglebone black,
Leila avatar
By Leila
at 2014-07-28T00:11
看了一下規格, 其 timer 為 DMTimer, 不知算是怎樣的 clock ?
Leila avatar
By Leila
at 2014-07-30T05:40
這要看AM335x technical reference manual

新酷音標點符號選單打不開

Olivia avatar
By Olivia
at 2014-07-18T00:00
環境:Crunchbang 11 ( Debian 7.6 ) + ibus-chewing 1.3.10 按 ` ( ~ ) 鍵的時候沒有反應, 想請問要怎麼打開標點符號的選單,感謝。 - ...

關於 driver 和 API 和 system call

Ingrid avatar
By Ingrid
at 2014-07-17T22:07
一直搞不懂.. Application → Labraries → System Call Handler → kernel → driver → device 我一直認為應用程式呼叫的函式庫就是呼叫 API 上網看有人說 and#34;system call 例如: ioctl 這個 APIand ...

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

Barb Cronin avatar
By Barb Cronin
at 2014-07-17T21:54
我不確定這問題要發在linux板或C_and_CPP板比較好, 目前我打算用嵌入式開發板 beaglebone black 上安裝Debian, kernel 3.15, 因為某些需要,所以時間精度要求要在 1us 以下,所以我打算用clock_nanosleep()實現 但我給 1s 的delay,他 ...

java更新問題

Irma avatar
By Irma
at 2014-07-17T20:18
我有兩個虛擬電腦 1.lubuntu 14.04 lts java最新版本為8u11 壓縮檔jdk-8u11-linux-x64.tar.gz放在and#34;/home/我的名稱/下載and#34;這個資料夾 解壓縮之後的資料夾在/usr/java裡面 也就是說/usr/java裡面有兩個 ...

Ubnutu 12.04 移除預設資料夾捷徑

Gilbert avatar
By Gilbert
at 2014-07-17T13:53
※ 引述《erttyy8821 (俠)》之銘言: : 各位先進 : 我想問一下有辦法刪除一些預設資料夾的捷徑嗎? : (像是下載.圖片.影片...這些) : 雖然是沒影響使用 : 但是因為我把預設資料夾都刪掉,不小心點到這些捷徑會出現錯誤 : http://ppt.cc/EZOa 修改 ~/.config/u ...