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

Linux 使用定期内核计时器(jiffies或hrtimer)从UART收集数据的内核模块,linux,timer,linux-kernel,kernel,uart,Linux,Timer,Linux Kernel,Kernel,Uart,我在使用linux内核2.6.35.3的imx283平台上工作,并使用所有3个uart端口进行通信 我想从UART-1收集数据,但需要有一个准确的时间间隔 数据是从传感器收集的 我需要向传感器发送命令以获取数据 间隔可以在10毫秒到2秒之间 我需要一些关于内核模块的帮助,我可以使用内核定时器并从uart收集数据吗 内核计时器有很好的准确性,所以我是否可以使用它们 谢谢,对于rs232的标准驱动程序,从发出write(2)系统调用到内核驱动程序开始向串行线输出字节(请记住,驱动程序已经在内核模式下

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

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

数据是从传感器收集的

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

间隔可以在10毫秒到2秒之间

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

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


谢谢,

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


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

这是不可能的,你需要的是RTOS,而不是Linux,尤其是老式的。“我需要一些关于内核模块的帮助”--为什么是内核模块?可能已经有一个设备驱动程序处理UART,所以你应该在用户空间中“从UART-1收集数据”。…但需要有一个准确的间隔”--做什么?数据将异步到达,那么,你想轮询设备还是轮询接收缓冲区?仅供参考,现有UART驱动程序肯定使用中断(而不是轮询)为UART提供服务。为什么您希望性能低于现有的驱动程序?在某些特殊情况下,首选轮询,但您没有引用任何内容。请解释您的意思。我想从UART-1收集数据,但需要有一个准确的间隔,因为这需要一些解释。RS232 dat除其他外,传输取决于所选的波特率,这意味着一个8位、无奇偶校验、一个停止位在9600波特率下使用1ms。顺便说一句,标准tty驱动程序对于最奇怪的规格也足够了,请参见
termios(4)
了解如何使用
VMIN
VTIME
参数超时和打包数据的说明。@LuisColorado感谢您的反馈。实际上,根据我的理解,如果我在用户空间中使用usleep(interval)发送命令和接收数据执行此任务在while循环中,它有可能被中断,因为…我也在以pthread的形式运行3个进程和4个线程。因此,为了使其不可中断…我在想,是否可以像内核一样在环形缓冲区中执行此操作并收集数据,因为对于此任务…我只关心收集和间隔的数据。哟除了内核本身的复杂性(中断处理、DMA等)、驱动程序(如果我们谈论8250)之外,你可能没有研究Linux内核中的UART驱动程序有它自己的问题。您所描述的适用于您完全控制事情的UController,不幸的是,在Linux中,UART几乎是要完成的最繁重的任务之一(CPU速度不够快,无法处理UART中断,主要是因为安排了其他任务,并且缓冲区太小)@0andriy,当然,如果我们谈论8250,uart并不是最好的技术。但是你说的是一个很久以前就被取代的芯片。现在我觉得看到其中一个很奇怪。也许你想描述一下pdp-11或pdp-7的tty驱动程序是如何实现的???我当然有进入linux中rs232的内核驱动程序…在unix和BSD系统中也是如此