【问题标题】:limitations to serial port Asynchroneous Input function?串口异步输入功能的限制?
【发布时间】:2011-02-04 13:31:57
【问题描述】:

我们有一个 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 章,并且疯狂地搜索。我开始认为可能没有更好的方法来做最初的例子。

提前致谢,

伯特

【问题讨论】:

  • 查看评论“通常我们会在这里做一些有用的事情”。不要设置非阻塞 I/O 然后调用 sleep,设置非阻塞 I/O 然后在该线程中做一些有用的事情,如果你喜欢使用单线程应用程序,就像你的所有其他功能一样。否则,如果您想使用多线程专用线程来监视串行并使用阻塞 I/O,那么内核将暂停线程,直到有事情要做。或者有一个 I/O 线程使用 select 来监视多个输入源,并且只有在其中一个输入源上有输入时才会被唤醒。
  • 一般来说,在同一个问题中问两个单独的问题(“为什么会这样?”和“有人有例子吗?”)是个坏主意。见meta.stackexchange.com/questions/39223/…

标签: linux embedded serial-port


【解决方案1】:

如果您担心在没有可用输入时定期从usleep() 调用中唤醒,只需将usleep() 调用替换为pause(),这将暂停您的进程,直到 SIGIO 发生。

【讨论】:

    【解决方案2】:

    一般来说,在信号处理程序中做任何复杂的事情(即,触及直接堆栈之外的东西)都是危险的——请参阅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,然后通过调用@987654326 解除阻塞@ 在您的信号处理程序中。

    【讨论】:

      猜你喜欢
      • 2012-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-20
      • 1970-01-01
      • 2021-12-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多