ARM Linux内核驱动程序中的关键时序

前端之家收集整理的这篇文章主要介绍了ARM Linux内核驱动程序中的关键时序前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我在MX28(ARMv5)上运行 linux,并使用GPIO线与设备通信.不幸的是,该器件有一些特殊的时序要求. GPIO线路上的低电平不能超过7us,高电平没有特殊的时序要求.代码实现为内核设备驱动程序,并通过直接寄存器写入切换GPIO,而不是通过内核GPIO api.为了测试,我只生成3个脉冲.该过程如下所示,所有功能都在一个函数中,因此它应该适合指令缓存:

>设置gpio高
> Save Flags&禁用中断
> gpio低
>停顿
> gpio高
>再重复2次
>恢复标志/重新启用中断

这是与GPIO相连的逻辑分析仪的输出.

大部分时间它都很好用,脉冲持续不到1us.然而,大约10%的低点持续很多很多微秒.即使禁用了中断,也会导致代码流中断.

我很茫然. RT Linux可能在这里没有帮助,因为问题不是延迟,它似乎是在低端发生的事情,即使没有任何东西应该在禁用IRQ时中断它.非常感谢任何建议.

解决方法

IMX25(ARM926)上的ARM缓存是16K代码,16K数据L1,长度为32byte或8条指令. DDR-SDRAM控制器运行在133Mhz和16位总线,传输速率约为300MB / s.缓存填充应该只需要大约100nS,而不是9uS;这大约是100倍.

但是,Linux还有其他四个问题.

> TLB未命中和页面表行走.
>数据中止.
> DMA主人窃取.
> FIQ中断.

除非你有一个巨大的显示屏,否则LCD主机不太可能窃取足够的带宽.您的显示器是否大于1 / 4VGA?如果没有,这只是内存带宽的10%,这将与处理器一起流水线.你有以太网或USB有效吗?这些外设具有更高的数据速率,并且可能导致与SDRAM的这种类型的争用.

所有这些问题都可以通过编写相关的toggler PC并将其复制到IRAM来避免.见:iram_alloc.c;此文件应该可以移植到旧版本的Linux. XBAR开关允许同时从SDRAM和IRAM提取. IRAM仍然可以成为其他DMA主设备的目标.如果您真的被按下,请将代码移动到ETB缓冲区,系统中没有其他主机可以访问.

TLB未命中实际上可能非常陡峭,因为它可能需要运行几个单拍SDRAM周期;仍然应该在1uS以下.您尚未发布代码,因此变量和/或其他可能导致数据故障无法屏蔽.

如果您有任何使用FIQ的驱动程序,即使您屏蔽了正常的IRQ中断,它们仍可能仍在运行.例如,该系统的ALSA驱动程序通常使用FIQ.

ETB和IRAM都是32位数据路径和低等待状态.任何一个都可能比DDR-SDRAM提供更好的响应.

我们通过使用FIQ和IRAM在IMX258上使用其他协议使用位冲击来切换GPIO,从而实现了亚微秒级响应.

猜你在找的Linux相关文章