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



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

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

数据是从传感器收集的。

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

间隔范围为 10 毫秒到 2 秒。

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

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

谢谢

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

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

最新更新