vxworks高精度延時

2021-07-02 03:13:27 字數 1690 閱讀 7031

如果支援timestamp,bsp應提供以下函式 

systimestampconnect()   -   連線時間戳中斷 

systimestampenable()   -   使能時間戳 

systimestampdisable()   -   禁止時間戳 

systimestampfreq()   -   取得時間戳的頻率 

systimestampperiod()   -   取得時間戳週期 

systimestamp()     -   取得時間戳 

systimestamplock()   -   禁止中斷,取得時間戳 

systimestampint()     -   可選的時間戳isr 

帖2: 

時間戳就是乙個高精度的時鐘吧?由於精度高,記錄時間的這個變數變化的很快,所以他很快就會溢位,重新從0開始計數,我有時候用它來計算某個函式的執行時間。 

time1,time2,freq; 

freq=systimestampfreq(); 

time1=systimestamp(); 

myfunc(); 

time2=systimestamp(); 

(time2-time1)/freq大概就是時間了。 

但是,這有乙個條件,就是myfunc()執行的很快,用tickget()難以計算的情況。否則,可能當time2獲取值的時候,時間戳都已經溢位了好幾次了。 

就算是這樣,也不定就成功,可能當得到time1的時候,變數已經要溢位,等得到time2的時候,得到是是乙個很小的值,結果,time2-time1就是負值了。 

總之,利用它,在某些情況下,還是可以做一些估算的。 

帖3: 

vxworks下的tick和timestamp沒有什麼相關性。也不是你說的秒和分的關係。 

tick 其實可以看成核心排程的頻率,也是是時間片、watchdog超時、任務延時的單位,所以是system   clock。timestamp能夠得到高精度的計時,跟rtos排程沒什麼關係。比如在某個時候讀暫存器的計數為a,過一段時間後再讀為b,主頻為f。 那麼b和a之間的時間距離就是:t   =   (b-a)*f。(假設用做timestamp的timer沒有rollover)對應到硬體上,tick只要timer能夠產生periodic中斷就 行,用做timestamp的timer要求多一點點。 

貼4要獲取精確的毫秒的時間間隔,而且頻繁的呼叫又不導致系統cpu佔用率過高。 

我建議採取   通過   cpu   機器週期的方法解決。 

基本上大部分主流cpu都乙個64位暫存器用來記錄cpu上電後的   機器週期個數。 

你可以編寫乙個彙編函式獲取這個   64位計數。 

然後你在程式開工時,作乙個10秒的定時,在定時前後各獲取一次cpu   機器週期。 

然後相減,就可以得到每秒鐘的cpu   機器週期, 

這個數字除以1000就是每毫秒的cpu   機器週期。 

這個值可以在執行中作為常量,使用我們將之命名位   毫秒因子 

然後你在上乙個次執行時取一下上乙個次執行和下一次執行, 

下一次執行時再取一次上乙個次執行和下一次執行。 

兩次相減得到   間隔的cpu   機器週期   。然後利用上面毫秒因子換算成毫秒就可以了。、 

利用這種方法你就是想精確到   納秒   也是可以的。 

我們經常用這個方法來測量   一段**的準確執行時間。

高精度延時

gptx cr暫存器 gptx sr暫存器 gptx pr暫存器分頻 1 設定 gpt1 定時器 首先設定 gpt1 cr 暫存器的 swr bit15 位來復位暫存器 gpt1。復位完成以後設定寄存 器 gpt1 cr 暫存器的 clksrc bit8 6 位,選擇 gpt1 的時鐘源為 ipg ...

C C C 高精度時間及其延時

在分析演算法的效能時,我們通過演算法的時間複雜度可以從理論上分析出演算法的大致高階,但是當我們想具體比較一下演算法真正的效能時,往往希望在機器上測試並記錄其執行的真實時間,那麼就要用到c c 中一些高精度時間函式。微秒 include struct timeval 獲取時間的函式 int getti...

32延時us暫存器 高精度延時函式

在後續我們對講解多個感測器,這幾個感測器對時序的要求都比較高,比如溫濕度感測器dh11,檢視晶元手冊時序,至少就需要微秒級的延時函式。延時函式的方式一般有兩種 使用for迴圈的方式,可能會因為硬體的差異,導致延時函式不准,因此這裡我們使用定時器的方式。開啟之前的timers.c檔案,修改timer ...