串口限制异步输入功能?

时间:2011-02-04 13:31:57

标签: linux embedded serial-port

我们有一个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 个答案:

答案 0 :(得分:1)

如果您担心在没有可用输入的情况下定期从usleep()来电中醒来,只需将usleep()来电替换为pause()即可暂停您的流程,直到SIGIO发生。

答案 1 :(得分: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进行(阻塞)调用,而不是usleep,然后通过调用信号处理程序中的sem_post取消阻止它。