Arc*_*ane 9 linux kernel arm driver linux-kernel
我在MX28(ARMv5)上运行linux,并使用GPIO线与设备通信.不幸的是,该器件有一些特殊的时序要求.GPIO线路上的低电平不能超过7us,高电平没有特殊的时序要求.代码实现为内核设备驱动程序,并通过直接寄存器写入切换GPIO,而不是通过内核GPIO api.为了测试,我只生成3个脉冲.该过程如下所示,都在一个函数中,因此它应该适合指令缓存:
这是与GPIO相连的逻辑分析仪的输出.
大部分时间它都很好用,脉冲持续不到1us.然而,大约10%的低点持续很多很多微秒.即使禁用了中断,也会导致代码流中断.
我很茫然.RT Linux可能在这里没有帮助,因为问题不是延迟,它似乎是在低端发生的事情,即使没有任何东西应该在禁用IRQ时中断它.非常感谢任何建议.
IMX25(ARM926)上的ARM 缓存是16K代码,16K数据L1,长度为32byte或8条指令.DDR-SDRAM控制器运行在133Mhz和16位总线,传输速率约为300MB/s.缓存填充应该只需要大约100nS,而不是9uS; 这大约是100倍.
但是,Linux还有其他四个问题.
除非你有一个巨大的显示器,否则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与另一个协议切换,实现了亚微秒级响应.