2013-02-28 59 views
4

我正在尋找一種在Linux下在C/C++中執行定時事件的方法。
例如每100毫秒執行一段代碼。 (不多不少,軟實時)C/C++ - 在Linux下尋找實時定時事件

我到目前爲止看到的唯一選項是:
- 無限循環,每次檢查是否是時候執行。
- 睡覺的線程,直到時間運行。

無限地檢查是否是時候運行,具有(太)CPU密集度的缺點。
睡覺,直到時間,有缺點,它不精確。睡眠時間只是一個準則,它可以睡更多。

現在我想知道你們中的任何一個人是否知道如何在Linux下的C/C++中進行實時定時事件。

感謝,
丹尼斯

+1

你需要什麼樣的實時性? Linux並不是一個真正的RTOS。 – 2013-02-28 19:02:37

+0

是的,是一個RTOS分配。看看QP框架。 – user1929959 2013-02-28 19:05:30

+0

睡眠足夠精確,如果你知道如何使用它 – Zaffy 2013-02-28 19:06:11

回答

4

幾乎不要緊,你要使用什麼 - 一select(),epoll(), usleep(), settimer()。有些方法可以「採取」更高分辨率的超時,有些則不能。但是Linux不是一個實時操作系統,甚至不應該指望它在那個時候喚醒你的進程。現在,即使你轉動CPU,內核也可以很容易地暫停你的進程,只要它決定將該CPU分配給其他進程或中斷處理程序。你可以堅持使用timerfd() - 你可以告訴它使用什麼時鐘,並且它可以很好地與其餘的Linux事件分派機制(epoll,AIO等)集成在一起)。

除此之外,它作爲程序員在你的控制之外。通常需要付出很大的努力才能從Linux獲得接近實時的行爲。它的範圍從構建一個定製的補丁內核和爲整個世界配置親和力,包括屏蔽中斷,修補BIOS和調整硬件。假設你在一個商品x86_64服務器上運行一個新鮮的香草核,這個服務器的負載並不高,那麼你的喚醒時間應該在50μs左右(你可以很容易地對它進行基準測試以獲得一個粗略的想法你的系統)。

0

退房的libevent:http://libevent.org/

的libevent的API提供一種機制,在特定事件上的文件描述符或超時已經發生後執行的回調函數到達。此外,libevent還支持由於信號或定期超時而產生的回調。

1

你可以試試RTAI,Linux的實時應用接口。

[...],它可以讓你寫與嚴格的時間限制應用爲你最喜歡的 操作系統。像Linux本身一樣,這個軟件是一個社區工作。

從新手引導:

RTAI提供Linux內核核心的相同的服務,添加的工業地產 實時操作系統的功能。它基本上由一箇中斷調度程序組成:RTAI主要捕捉外圍設備中斷,並在必要時將它們重新路由到Linux。它不是對內核進行修改的侵入性的 ;它使用HAL(硬件抽象層)的概念從Linux獲取信息並捕獲一些基本功能。該HAL向Linux Kernel提供了少量依賴項 。這導致了Linux內核的簡單適配,從 版本到Linux版本的簡單RTAI端口以及使用其他操作系統而不是RTAI的更容易的方式。 RTAI 將Linux視爲在沒有實時活動發生時運行的後臺任務。

3

在非實時操作系統上運行,沒有用戶空間方法是完全可靠的。你說得對,睡眠不準確,你可能會睡過頭,但這同樣適用於循環:操作系統可能無法及時安排你的任務,你會錯過你的插槽。

根據你需要的可靠性,考慮一個實時操作系統(RTOS),如QNXRTLinux。RTLinux的wiki有點過時,所以我不確定它是多麼活躍。

另一種方法是依靠某些硬件設備(如GPS卡)的時間。你的程序會對外部事件做出反應,而不是試圖爲自己計時。例如,硬件設備可能會暴露一個「文件」。你的程序會打開它並阻止read()。每隔100毫秒,硬件設備就會向您發送一些數據。

0

你也可以考慮在Linux特有的timerfd_create(2) -and FRIENDS-(與poll(2)多路複用/多等待,或某些事件庫一樣libevlibevent,或GTK或Qt的事件循環,這將調用內部poll)或POSIX的timer_create(2) 。另請參閱clock_gettime(2)和朋友

我強烈建議閱讀time(7)手冊頁。它解釋了很多。而且,作爲Vlad answered,Linux不是真正的實時內核(即使它可能很近)。