vxWorks中對時間的精確統計

2021-06-05 15:39:09 字數 1692 閱讀 2425

如果支援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   機器週期   。然後利用上面毫秒因子換算成毫秒就可以了。、 

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

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

C 中對時間的操作

1 datetime 數字型 system.datetime currenttime new system.datetime 1.1 取當前年月日時分秒 currenttime system.datetime.now 1.2 取當前年 int 年 currenttime.year 1.3 取當前月 ...

Object C中對時間的處理

一般有獲取具體的年月日和星期,兩個不同時間的差,某一天的前一天或後一天等 在這裡我只介紹獲取具體的年月日和星期,及某一天的前一天或後一天的方法 對時間的處理一般都會用到nsdate類和nscalendar類兩個類 獲取當前的時間是 nsdate nowdate nsdate date 獲取具體的年月...

對時間的封裝util

將乙個秒數的時間轉成形如00 00 00字串 public static string parsetime string date else else if integer.parseint curday integer.parseint day 2 else else else return da...