- 有可能使真正的時間間隔在C/C沒有實時Linux應用++?
我正在寫一個ADC模擬器。這是一個以特定頻率生成軟件包的應用程序。儘可能接近封裝產生的頻率對應於ADC的採樣速率很重要。爲什麼我不想使用sleep()
和usleep()
來設置軟件包生成時間間隔。實時間隔在C/C++
謝謝。
我正在寫一個ADC模擬器。這是一個以特定頻率生成軟件包的應用程序。儘可能接近封裝產生的頻率對應於ADC的採樣速率很重要。爲什麼我不想使用sleep()
和usleep()
來設置軟件包生成時間間隔。實時間隔在C/C++
謝謝。
有可能使真正的時間間隔在C/C++不是實時Linux應用程序?
不......如果是的話,它將是一個實時Linux系統。
這就是說,你也許可以得到非常接近,所以它取決於你的時間間隔和公差。您唯一認真的選擇子時間片精度的方法是將發送線程指向內核並讓它旋轉,同時保持其他處理不在內核中,但是這對硬件非常浪費......
如果您負擔得起有延遲足夠長,您的發送代碼進行重新安排,那麼你可以看看設置警報&信號處理程序,但這是潛在的大規模較高的延遲,其中核心都被另作他用也許只有在比較少見的場合。爲了評估它的工作情況,你必須在真實的系統負載下進行真實測量。
包發生器不應該與該數據包發送者。
如果您希望數據包按時發送,您應該先手動創建數據包,然後將它們發送給打包器發送者。
所以你需要一個工作隊列線程,並使用睡眠該線程及時發送數據包。 (你可以看看一個boost's sleep())
'sleep()'可以在這個線程中提供實時模式嗎? – nick
不,完全沒有。 「睡眠」儘可能非實時。在'timerfd'上阻塞的時間儘可能接近實時。這將與系統可以提供的一樣準確(使用HPET,如果支持的話),並且儘可能高效(側注:實時系統與非實時系統的區別在於速度更快或響應速度更快,但是它給出了保證的上限。) – Damon