我有一个在linux内核中的新serdev总线上构建的驱动程序。
在我的驱动程序中,我接收来自外部设备的消息,所有消息都以空字节(0x00)结束,协议确保我的数据(COB)中没有空字节。现在,我尝试让TTY层通过扫描输入中的零来传递完整的消息,如果没有,我将在回调中返回零,当字节可用时,从TTY层调用该回调。
这类作品。或者更确切地说,它适用于一些信息。一段时间后,尽管它被锁定,tty层继续无限期地发送相同大小的接收字节。我的猜测是,当tty翻转缓冲区的一半已满,而我的其余消息在另一半时,就会发生这种情况。
我有两个问题:
我说的对吗,tty层可以“挂起”,直到我读出一半翻转缓冲区中的所有数据?
如果是这样的话,有没有办法防止这种情况发生?我宁愿不在已经可用的tty缓冲区之上实现自己的缓冲方案。
谢谢

最佳答案

看起来(drivers/tty/tty_buffer.c和函数flush_to_ldisc)无法执行我试图执行的操作。当tty缓冲区即将翻转时,消费者将不得不读取并缓冲任何一半的消息。
也就是说,如果返回零并希望下次回调中有更大的数据块,那么只有等到缓冲区第一部分结束时,才能读取最后一位数据。
这在用户空间中不是问题,因为read调用将有一个参数,该参数是您想要的最大字节数,但是read可以自由返回比请求的字节数少的字节。

10-04 11:57
查看更多