2011-02-04 77 views
0

我們有一個Linux嵌入式項目,我們關心性能。對串口的限制異步輸入功能?

串行端口異步輸入示例在: http://www.faqs.org/docs/Linux-HOWTO/Serial-Programming-HOWTO.html#AEN105 幾乎沒有我們想要的。

但是,負責工程師反對CPU性能由 環路睡眠呼叫丟失。他希望程序等待一個信號來執行響應處理代碼。

我試圖從main()中移動該代碼信號函數內部,即:

void signal_handler_IO (int status) 
{ 
    // I moved my code here 
} 

結果不起作用,寫入該功能所作的串口很快失敗,程序完全變反應遲鈍。

這是爲什麼?

是否有人只有一個串口有一個很好的在線信號驅動I/O的例子?我一直在閱讀Kerrisk的「The Linux Priogramming Interface」一書的第63章,並瘋狂地搜索。我開始認爲可能沒有更好的方法來做最初的例子。

由於提前,

伯特

+2

查看評論「通常我們會在這裏做一些有用的事情」。不要設置非阻塞I/O,然後調用睡眠,設置非阻塞I/O,然後在該線程中執行一些有用的操作,如同所有其他功能一樣,如果您希望有單線程應用程序。否則,如果你想要多線程專用一個線程來觀察串行並使用阻塞I/O,那麼內核將掛起線程,直到有一些事情要做。或者有一個I/O線程使用select來觀看多個輸入源,並且只有當其中一個輸入源被輸入時才被喚醒。 – 2011-02-04 17:37:53

回答

0

一般情況下,做任何事情複雜化(即觸及超越眼前堆的東西)的信號處理程序是危險的 - 看到http://www.gnu.org/s/libc/manual/html_node/Nonreentrancy.html一個相當詳盡的描述。 I/O操作特別不安全,因爲它們傾向於分配硬件等。

如果您不喜歡顯式等待循環,則可以嘗試使用信號量 - 有關詳細信息,請參閱 http://linux.die.net/man/7/sem_overview。特別是,sem_post明確記錄爲可安全地用於信號處理程序,因此您可以在讀取循環中代替(sem_wait)(阻止)呼叫,然後通過在信號處理程序中調用sem_post來解除阻止呼叫。

1

如果你擔心從usleep()通話經常醒來的時候沒有輸入可用,只需更換usleep()通話用pause(),直到SIGIO發生時將暫停你的進程。