[問題] 計時長度不相同的問題

作者: s4300026 (s4300026)   2020-07-29 19:28:15
開發平台(Platform): (Ex: Win10, Linux, ...)
win7
編譯器(Ex: GCC, clang, VC++...)+目標環境(跟開發平台不同的話需列出)
VC++ 2010
額外使用到的函數庫(Library Used): (Ex: OpenGL, ...)
問題(Question):
我使用QueryPerformanceCounter, 和
QueryPerformanceFRequence
去夾1us的時間, 我的cpu頻率為300ns
但輸出的時間卻為 50us (重複計時次數達百次以上會出現)
單次計時的時間是正確的, 夾到的時間為900ns
餵入的資料(Input):
想要計時的時間長度
預期的正確結果(Expected Output):
每次輸出均接近, 為 900ns 或 1200ns
都可以被接收
錯誤結果(Wrong Output):
重複計數次數達百次以上(for迴圈的判斷式)
會出現計時長度延遲
即我希望計時長度為1us
實際計時長度卻為 50us (且分佈不均)
程式碼(Code):(請善用置底文網頁, 記得排版,禁止使用圖檔)
https://ideone.com/gXjVF0
補充說明(Supplement):
https://i.imgur.com/NFNDEKy.jpg
作者: Schottky (順風相送)   2020-07-29 22:45:00
你是不是誤會了 QueryPerformanceFrequency() 的意思wish_tick 為什麼只有 3呃,QueryPerformanceCounter() 出來的數字單位不是 ns
作者: mmmmei (mmm煤)   2020-07-30 00:52:00
而且我覺得os也不是只跑你這個行程 時間一定只會多不會少
作者: CumCumCum (2 hard 2 hard)   2020-07-30 11:51:00
你可以燒機把cpu使用率撐到100就知道了
作者: descent (「雄辯是銀,沉默是金」)   2020-07-30 17:55:00
你是想做到 1us 的精準度嗎?
作者: s4300026 (s4300026)   2020-07-30 18:42:00
是的,我希望每次呼叫都是切出1us,目前可以做到短次數呼叫可以很正確的,高次數呼叫,就會有一些些計時時間明顯超出範圍
作者: Lipraxde (Lipraxde)   2020-07-30 19:07:00
頻率單位怎麼是 ns...
作者: Schottky (順風相送)   2020-07-31 02:50:00
程式碼是改了,執行結果還是舊的請參考置底的貼程式碼網站把真正的程式貼上來這不是你真正在用的程式碼吧,Frequency 也拼錯字然後你可能需要了解一下作業系統 context switch 的概念
作者: descent (「雄辯是銀,沉默是金」)   2020-07-31 22:21:00
不知道你的 "切出1us" 是什麼意思?但是要達到 1us 精準度, windows 應該達不到
作者: atrix (班班)   2020-07-31 22:22:00
如果你的程式是跑在WINDOWS底下,那應該就是做不到的。
作者: descent (「雄辯是銀,沉默是金」)   2020-07-31 22:23:00
你可能要考慮 bare-metal 或是 rtos
作者: atrix (班班)   2020-07-31 22:24:00
然後你說CPU偷跑出去做其它是沒錯,我是叫這件事為[岔斷],沒有[岔斷]的話,你連鍵盤滑鼠都動不了
作者: siuoly (放空)   2020-08-01 08:33:00
請問各位前輩 假設在個人電腦 實務上要求時間精確到什麽單位? 如果在嵌入式系統上會有差別嗎?
作者: james732 (好人超)   2020-08-01 15:56:00
我記得要特別要求精確必須要有OS配合,也就是用RTOS
作者: chuegou (chuegou)   2020-08-02 10:05:00
若是嵌入式 以BBB為例 realtime的工作可以交給PRU
作者: Killercat (殺人貓™)   2020-08-02 12:23:00
select應該是最穩的 但是有沒有穩到你這程度就不知道
作者: siuoly (放空)   2020-08-03 07:06:00
謝謝回答 我猜實用上電商的大流量要求 還有就是廠房的機具會用到RTOS 不過我是想知道電腦需要或者可以精準到什麼程度 然後寫過小demo自己模擬行為看看
作者: s4300026 (s4300026)   2020-08-03 08:53:00
我這邊測起來,在cpu沒在執行其他程式的情況下,cpu插斷的行為大概費時50us
作者: Schottky (順風相送)   2020-08-03 08:59:00
siuoly> 看你要求時間精確實際上是做什麼事情#1IGT3gmB (C_and_CPP) 這篇可以參考一下得到 1ns 精確度的時間值和保證每隔 1us 喚醒你是兩回事後者以 Windows 或 Linux 是不可能「保證」辦到的但前者在 PC 上一般來說是沒什麼問題你可以看錶,錶可以給你 1/100 秒的精確度,這很容易但要你每一秒低頭看錶一次就顯然不太有實行的可能
作者: ofd168 (大色狼來襲)   2020-08-09 22:32:00
S大舉例好容易懂
作者: MOONRAKER (㊣牛鶴鰻毛人)   2020-08-11 16:31:00
沒聽過電商在用RTOS 如果那個電商是一個機器人要模仿人類 反應太慢會穿幫 那也許有可能 顆

Links booklink

Contact Us: admin [ a t ] ucptt.com