中如何穩(wěn)定地每隔5ms執(zhí)行某個函數(shù)?
輪詢檢查是否到達5ms,為了減少開銷可以每次sleep 1ms,為了保證精度可以少于1ms,但無論怎么做,在現(xiàn)代分時操作系統(tǒng)上都沒法精確到5ms,只能盡量接近。不過windows和linux都有實時調(diào)度模式,你可以試試。
如果你是在嵌入式上直接裸寫的,可以做到更接近5ms,但也達不到絕對精確,嵌入式cpu頻率是已知的(可粗略理解為每秒晶振多少次),每條指令的運行需要多少次晶振(也就能算出每條指令的執(zhí)行時間),也就能幾乎精確的控制代碼在合何時執(zhí)行,以及能執(zhí)行多久。
但這里沒有考慮指令和數(shù)據(jù)從內(nèi)存儲設備load進cpu寄存器的時間,也沒有考慮多級cache,以及cache miss時耗費的時間,也沒有考慮有指令流水線參與的更復雜的處理器。即便是cpu生產(chǎn)公司,他能告訴你各個子功能的精確耗時,但綜合起來以后情況就變得很復雜,也許同一個條代碼上一次執(zhí)行時花10ns,下一次執(zhí)行也許只用6ns。所以只能提供一個估計的平均耗時以供參考,但不能作為絕對指標。
如果是在有時鐘中斷提供(無論這個時鐘有多精確)的cpu上運行代碼,這些指令的執(zhí)行時間同樣受上面的因素影響,所以也只能給個平均時間。
這里還沒有考慮數(shù)值精度的問題,在不同的表示方法下,以及不同的算術影響下,5ms這個數(shù)值的精確度問題。
也沒有考慮多任務系統(tǒng)參與下任務調(diào)度帶來的更多影響因素。
所以最終只能取近似,而不能強求絕對精確。