我在MX28(ARMv5)上运行linux,并使用GPIO线与设备通讯。不幸的是,该设备有一些特殊的时序要求。GPIO线上的低电平持续时间不能超过7us,高电平没有特殊的时序要求。该代码被实现为内核设备驱动程序,并通过直接寄存器写入而不是通过内核GPIO API来切换GPIO。为了进行测试,我仅生成3个脉冲。该过程如下所示,全部具有一个功能,因此应适合指令高速缓存:
这是绑定到GPIO的逻辑分析仪的输出。
在大多数情况下,它工作得很好,脉冲持续时间不到1us。但是,大约10%的低点会持续许多微秒。即使禁用了中断,也有一些原因导致代码流被中断。
我很茫然。RT Linux可能在这里无济于事,因为问题不是延迟,即使在禁用IRQ的情况下也不会中断它,这似乎是在低点期间发生的事情。任何建议将不胜感激。
IMX25(ARM926)上的ARM 高速缓存是16K代码,32K长度的16K数据L1或8条指令。DDR-SDRAM控制器以133Mhz和16位总线运行,传输速率约为300MB / s。高速缓存填充仅应花费约100nS,而不是9uS。这大约是太长的100倍。
但是,Linux还有其他四个问题。
除非您的显示器很大,否则LCD主设备不可能窃取足够的带宽。您的显示器大于1 / 4VGA吗?否则,这仅是内存带宽的10%,它将与处理器一起传输。您是否启用了以太网或USB?这些外设的数据速率较高,并且可能导致与SDRAM的这种争用。
通过编写您的切换PC亲戚并将其复制到IRAM,可以避免所有这些问题。参见:iram_alloc.c ; 该文件应可移植到旧版本的Linux。XBAR开关允许同时从SDRAM和IRAM进行访存。该IRAM仍然可以是其他的目标DMA主人。如果确实需要按一下,请将代码移到系统中其他主机都无法访问的ETB缓冲区。
实际上,由于可能需要运行几个单拍 SDRAM周期,因此TLB丢失可能非常严重。仍然应该在1uS以下。您尚未发布代码,因此变量和/或其他变量可能导致无法屏蔽的数据故障。
如果您有任何使用FIQ的驱动程序,即使您屏蔽了正常的IRQ中断,它们也可能仍在运行。例如,此系统的ALSA驱动程序通常使用FIQ。
无论是ETB和IRAM是32位的数据路径和低等待状态。哪一种都比DDR-SDRAM响应更好。
通过使用FIQ和IRAM在IMX258上使用另一种使用位敲击的协议切换GPIO的方法,我们已经实现了亚微秒的响应。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句