gpt4 book ai didi

linux - 内核模块使用周期性内核定时器(jiffies 或 hrtimer)从 UART 收集数据

转载 作者:太空宇宙 更新时间:2023-11-04 12:23:56 25 4
gpt4 key购买 nike

我正在使用 linux kernel-2.6.35.3 并使用所有 3 个 uart 端口进行通信的 imx283 平台上工作。

我想从 UART-1 收集数据,但需要有一个准确的间隔。

数据是从传感器收集的。

我需要向传感器发送命令以获取数据。

间隔可以从 10 毫秒到 2 秒不等。

我需要内核模块的一些帮助,我可以使用内核定时器并从 uart 收集数据吗。

内核计时器的准确性很高,所以我是否可以使用它们。

谢谢,

最佳答案

使用 rs232 的标准驱动程序,从发出 write(2) 系统调用到内核驱动程序开始向串行线路输出字节(记住驱动程序是已经在内核模式下运行)。为此编写驱动程序或内核模块很容易出错,必须由您维护,并且您需要精通内核编程才能做好它并且不会在途中崩溃(您必须应对标准驱动程序尝试使用该端口,因为它是由驱动程序自动完成的,您的驱动程序必须保留该端口供自己使用,以免干扰它)。只有在您完全填满缓冲区的情况下,您的进程才必须等待缓冲区变空,但是根据定义,这不会发生,因为您无法补偿(您正在填充输出行比字符消失快,这将使您的进程在缓冲区已满时阻塞),并且在这种情况下完全成为实时计时器。在输入时,您有一个类似的过程。您将有一个输入字符触发一些中断将其从设备带到缓冲区,这通常(如果您在 termio 上将 VMIN 配置为 1)意味着您的进程将立即被唤醒,在每个字符读取(每个字符一进来)我建议你使用 VMIN 设置为 1 和 VTIME 设置为 0(阅读标准 termios(3 ) 手册页以获取串行驱动程序的完整说明)以在收到每个字符后立即唤醒您的进程。您的进程将被唤醒和调度,具体取决于系统负载和 cpu 速度,但通常这意味着及时使用正常的最新 cpu。您可以在调用 read(2) 后立即为读取添加时间戳,或者尝试在单独的 ioctl(2) 调用中从内核获取读取时间戳检查何时收到字符(我知道这在 linux 中是可能的,至少对于套接字而言,不需要为此编写模块)(但不是从远程端传输时,想想这个)但我认为要获得毫秒时间,在用户模式下完成所有事情就足够了,而不会使进入内核模式的事情复杂化。 RS232 线路不是为实时设计的,因此您尝试的事情可以在毫秒分辨率下完成,而无需在内核端编程。

此外,在用户模式下完成所有操作允许您的程序从一个系统移动到另一个系统,而无需在尝试您的软件之前进行复杂的内核模块安装,甚至更多......了解如何使用 tty 驱动程序可以让您在非 Linux 系统(例如 BSD、Solaris 或 MAC)中运行您的代码

关于linux - 内核模块使用周期性内核定时器(jiffies 或 hrtimer)从 UART 收集数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45252389/

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