我们有一个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章,并且像疯了一样搜索谷歌。我开始认为可能没有更好的方法来做最初的例子。
提前致谢,
伯特
答案 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
取消阻止它。