gpt4 book ai didi

linux - 想要确保 tty 写入由给定时间戳推送到硬件 (UART) 或失败

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:01:53 25 4
gpt4 key购买 nike

我需要将一些数据写入串行端口,同时确保如果无法通过给定的“过期时间戳”写入数据,它将返回失败代码。数据来自不同的串口,到期时间来自第三台设备。

我最初的计划是在内核空间中实现所有这些,但我得出结论,因为它需要访问 3 个设备,所以最好在用户空间中桥接它们;不幸的是,这让时间变得困难。

尽管我花了很多时间阅读 LDD3 并查看 tty 子系统和相关代码,但我还是无法弄清楚如何实现这一点。我实际上想向现有的串行端口/tty 设备添加功能,以便我可以使用 ioctl 或编写一个指示数据和到期时间的转义序列。

我在这里控制了内核源代码,因为它已经分发了,如果我可以单独使用一个很棒的内核模块来实现的话。如果重新刷写内核是必不可少的,那就这样吧。

任何人都可以提供有关将此过期写入添加到现有串行/tty 组合的指导,或其他建议以更好地解决此问题吗?

提前致谢 - 如果没有足够的信息,我们深表歉意,如果需要,我会添加详细信息。

最佳答案

我建议完全在用户空间中执行此操作。这背后有两个假设:您没有流量控制,并且所需的精度约为 50 毫秒或更差。

缺少流量控制是必不可少的:硬件流量控制可以让恶意远程设备通过在 UART FIFO 中停止字节来欺骗您。软件流控制可以停止设备驱动程序中的数据。这样一来,数据将以所需的波特率无延迟地流经 UART。如果您确保在每次写入设备之前内核缓冲区为空,您将实现您的计时。

我的解决方案的部分是:

  1. 使用 SCHED_FIFO 运行您的应用程序以避免抢占。
  2. 选择要发送的消息。您不会说您的消息是否存在排序限制。如果没有,您可能需要实现一个调度程序来决定消息顺序。最早的截止日期优先可能会奏效。
  3. 总是在写入之前tcdrain
  4. 一旦您知道输出缓冲区为空,请检查是否有足够的时间让所有字节以选定的波特率传输。如果剩余时间不足,则发出失败代码并返回顶部。
  5. 写入消息字节。

要处理其他端口,您需要使用多线程或带超时的select。如果您使用 select,请记住您的线程将在 tcdrain 中被阻塞。

如果您需要更精确的计时,请考虑使用专用微 Controller 。

关于linux - 想要确保 tty 写入由给定时间戳推送到硬件 (UART) 或失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5598503/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com