看板 C_and_CPP 關於我們 聯絡資訊
開發平台(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
-- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 114.137.29.147 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1596022097.A.AB0.html ※ 編輯: s4300026 (114.137.29.147 臺灣), 07/29/2020 19:28:43 ※ 編輯: s4300026 (114.137.29.147 臺灣), 07/29/2020 19:31:18
Schottky: 你是不是誤會了 QueryPerformanceFrequency() 的意思07/29 22:45
Schottky: wish_tick 為什麼只有 307/29 22:45
Schottky: 呃,QueryPerformanceCounter() 出來的數字單位不是 ns07/29 22:47
我改好程式碼了
mmmmei: 而且我覺得os也不是只跑你這個行程 時間一定只會多不會少07/30 00:52
可是我是跑 for和while迴圈, 你的意思是 我執行迴圈內容時 cpu偷跑出去做其他事情了的意思 造成 "我計時器大部分的時間計時是正確的 但偶爾計時會不準確",這個現象。 ※ 編輯: s4300026 (114.137.29.147 臺灣), 07/30/2020 09:45:09
CumCumCum: 你可以燒機把cpu使用率撐到100就知道了 07/30 11:51
descent: 你是想做到 1us 的精準度嗎? 07/30 17:55
s4300026: 是的,我希望每次呼叫都是切出1us,目前可以做到短次數 07/30 18:42
s4300026: 呼叫可以很正確的,高次數呼叫,就會有一些些計時時間 07/30 18:42
s4300026: 明顯超出範圍 07/30 18:42
Lipraxde: 頻率單位怎麼是 ns... 07/30 19:07
Schottky: 程式碼是改了,執行結果還是舊的 07/31 02:50
Schottky: 請參考置底的貼程式碼網站把真正的程式貼上來 07/31 03:11
Schottky: 這不是你真正在用的程式碼吧,Frequency 也拼錯字 07/31 03:13
Schottky: 然後你可能需要了解一下作業系統 context switch 的概念 07/31 03:20
已貼上.
descent: 不知道你的 "切出1us" 是什麼意思? 07/31 22:21
descent: 但是要達到 1us 精準度, windows 應該達不到 07/31 22:22
atrix: 如果你的程式是跑在WINDOWS底下,那應該就是做不到的。 07/31 22:22
descent: 你可能要考慮 bare-metal 或是 rtos 07/31 22:23
atrix: 然後你說CPU偷跑出去做其它是沒錯, 07/31 22:24
atrix: 我是叫這件事為[岔斷], 07/31 22:24
atrix: 沒有[岔斷]的話,你連鍵盤滑鼠都動不了 07/31 22:24
siuoly: 請問各位前輩 假設在個人電腦 實務上要求時間精確到什麽 08/01 08:33
siuoly: 單位? 如果在嵌入式系統上會有差別嗎? 08/01 08:33
james732: 我記得要特別要求精確必須要有OS配合,也就是用RTOS 08/01 15:56
chuegou: 若是嵌入式 以BBB為例 realtime的工作可以交給PRU 08/02 10:05
Killercat: select應該是最穩的 但是有沒有穩到你這程度就不知道 08/02 12:23
※ 編輯: s4300026 (42.73.60.90 臺灣), 08/02/2020 23:34:58
siuoly: 謝謝回答 我猜實用上電商的大流量要求 還有就是廠房的機 08/03 07:06
siuoly: 具會用到RTOS 不過我是想知道電腦需要或者可以精準到什麼 08/03 07:06
siuoly: 程度 然後寫過小demo自己模擬行為看看 08/03 07:06
s4300026: 我這邊測起來,在cpu沒在執行其他程式的情況下,cpu插斷 08/03 08:53
s4300026: 的行為大概費時50us 08/03 08:53
Schottky: siuoly> 看你要求時間精確實際上是做什麼事情 08/03 08:59
Schottky: #1IGT3gmB (C_and_CPP) 這篇可以參考一下 08/03 09:00
Schottky: 得到 1ns 精確度的時間值和保證每隔 1us 喚醒你是兩回事 08/03 09:03
Schottky: 後者以 Windows 或 Linux 是不可能「保證」辦到的 08/03 09:03
Schottky: 但前者在 PC 上一般來說是沒什麼問題 08/03 09:04
Schottky: 你可以看錶,錶可以給你 1/100 秒的精確度,這很容易 08/03 09:05
Schottky: 但要你每一秒低頭看錶一次就顯然不太有實行的可能 08/03 09:05
ofd168: S大舉例好容易懂 08/09 22:32
MOONRAKER: 沒聽過電商在用RTOS 如果那個電商是一個機器人要模仿 08/11 16:31
MOONRAKER: 人類 反應太慢會穿幫 那也許有可能 顆 08/11 16:31