我们使用AM335x,运行TI SDK6.0的Linux系统,没有进行实时扩展。
项目中需要对端口输入信号进行实时接收处理,该信号是随机产生的控制信号,对实时性处理要求较高。
信号一般为高电平有效。如图所示,需要进行去抖滤波处理:1、高电平持续时间大于X后,才认为输入信号有效,否则认为输入信号无效;2、高电平持续时,低电平持续时间若小于Y,则认为输入信号仍然有效,低电平时间大于Y,才认为输入信号无效。
因为这个信号时随时都可能出现,并且要求能实时处理,我们以前用前后台系统时直接用1ms定时器轮询做的,这个轮询时间可以放大到5ms。
现在切换到Linux系统下了,不知道该如何处理,我们考虑了以下几种方案,不知有哪位大侠有过这方面经验,能够指点一下。
方案一:轮询的方案,用xenomai进行实时扩展,和前后台系统一样,轮询IO实现,使用2ms的轮询周期,用1ms担心影响Linux运行;
方案二:中断的方案,RT-Preempt补丁进行实时扩展,重新编写输入口驱动,检测到边沿后计时,根据计时时间是否超过X和Y,切换输入信号是否有效;
方案三:使用AM335x的eCAP模块或者PRU单元进行输入信号处理,处理完后直接中断通知MCU?
不清楚这个问题在Linux中是否普遍,对Linux的输入驱动不是很了解,是否在Linux中已经有了对该问题成熟的解决方案?或者AM335x有这方面的应用?
luo qi:
这个需求感觉直接用fpga就搞定了,延迟可以做到很小,用操作系统直接做有点不太合适。
kai zong:
回复 luo qi:
我们做的是个便宜货,成本是不能增加了,而且我们还需要这个X、Y的去抖时间可以根据不同项目配置,所以用FPGA可能也不太方便。
kai zong:
经了解,Linux系统下的触摸屏驱动和通用GPIO按键输入驱动drivers\input\keyboard\gpio_keys.c、gpio_keys_polled.c,所面对处理的问题是和我们类似的。
计划参考这类驱动来写驱动,通用GPIO驱动gpio_keys.c看上去不太合适,不能处理高电平时小于Y的无效判断抖动,而且使用input机制也有点太复杂了。
如果哪位有更好的方法,还请劳驾一下,多多指教。
Jian Zhou:
回复 kai zong:
如果是要求对GPIO口的低延时访问,可以考虑用PRU控制GPIO来实现。
kai zong:
回复 Jian Zhou:
多谢回复,如果使用PRU单元,是否就是轮询IO的方式,但轮询周期如何控制、去抖时间是否可以配置、如何与MCU交互呢?
请问TI是否此类应用的参考代码,非常感谢。
kai zong:
回复 Jian Zhou:
谢谢,use bbk pru as high speed data acquision这个工程很不错。