2011-02-04 72 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发生时将暂停你的进程。