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

时间:2017-07-22 08:26:49

标签: linux timer linux-kernel kernel uart

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

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

从传感器收集数据。

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

间隔时间范围为10ms至2sec。

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

内核定时器具有良好的准确性,因此我是否可以使用它们。

谢谢,

1 个答案:

答案 0 :(得分:0)

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

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