2010-05-27 50 views
3

我有一個程序生成數據包發送到接收器。我需要一種有效的方法在發送每個數據包之間引入一個小的延遲,以免超出接收器。我試過usleep()和nanosleep(),但它們似乎太慢了。我已經實現了一個繁忙的等待循環,並取得了更多成功,但這不是最有效的方法,我知道。我對任何人嘗試做我所做的事都感興趣。其他人是否會發現usleep()和nanosleep()能夠很好地適用於這種類型的應用程序?爲什麼nanosleep()和usleep()太慢?

感謝,

丹尼Llewallyn

+1

問題非常模糊 - 您需要多長時間的延遲,您爲什麼認爲nanosleep/usleep無法提供這種延遲? – 2010-05-27 13:15:53

+3

顯然,我們不知道你在做什麼的細節,但我會認爲nanosleep就足夠了。 你的睡眠需要多準確?操作系統將保證至少所需的延遲時間將會發生 - 但它不會對超出睡眠請求時間的類似保證發出喚醒。 – sechastain 2010-05-27 13:23:24

+0

在我的Raspberry Pi上,需要更多的73us來調用nanosleep。我想我也必須去忙碌的循環。 – Nikodemus 2014-11-21 13:26:45

回答

2

這似乎是一個不好的設計。理想情況下,接收方將對接收到的任何額外數據進行排隊,然後執行其單獨線程的消息處理。通過這種方式,它可以處理突發數據,而不依賴發送者來限制其請求。

或許,如果(舉例來說)你沒有接收器的代碼的控制權,或者如果這是一個嵌入式應用這種方法是不實際的。

+0

您正在假設接收器是某個計算機上的一些軟件。如果某些硬件設備只有有限數量的傳入數據包緩衝區,該怎麼辦? – JeremyP 2010-05-27 15:50:35

+0

絕對 - 我希望OP能在他的問題中澄清這一點。 – 2010-05-27 16:07:44

-1

而不是在數據包級別做事情,你需要擔心超過接收者等事情。爲什麼不使用TCP流傳輸數據?讓TCP處理流量控制和數據包重傳等事情。

如果你已經有了投資的分組方法很多,你可以一直使用在TCP之上的一層,從TCP流中提取數據的原始數據包和飼料到這些現有的功能。

+0

對不起,它是UDP – user351990 2010-06-02 11:52:06

8

睡眠函數對於非常小的時間間隔的行爲很大程度上取決於內核版本和配置。

如果你有一個「無滴答」的內核(CONFIG_NO_HZ)和高分辨率定時器,那麼你可以期待睡眠非常接近你的要求。

否則,你通常會最終睡在定時器中斷的粒度。定時器中斷間隔可配置(CONFIG_HZ) - 10ms,4ms,3.3ms和1ms是常用選項。

+0

這個答案似乎在假設用戶正在運行哪個操作系統。 – Powerlord 2010-05-27 16:00:43

+1

這是Debian。我應該更清楚。我認爲這是問題。感謝您的迴應。 – user351990 2010-06-02 11:52:54

2

假設其他評論者提到上級方法並不提供給你,然後在嵌入/微控制器土地常用的方法是創建所需長度的NOP環。

一個NOP操作需要一個CPU週期,在嵌入式環境中,你通常都知道什麼時鐘速度的處理器運行在所以你可以使用一個簡單的for循環conatining _NOP()或只需要很短的延遲,然後不要打擾一個循環,只需添加所需數量的節點。

regTX = 0xFF; // Transmit FF on special register 

// Wait three clock cycles 
_NOP(); 
_NOP(); 
_NOP(); 

regTX = 0x00; // Transmit 00 
0

我可以在這裏說Solaris,因爲它使用OS定時器來喚醒睡眠呼叫。默認情況下,無論您在usleep中指定什麼,最短等待時間將爲10毫秒。但是,您可以使用/etc/system配置文件中的參數hires_tick = 1(1ms喚醒)和hires_hz =來增加定時器喚醒呼叫的頻率。