我已经写了一些Linux设备驱动程序,但我仍然处于新手的水平。我可以让它们工作,但这就是我所能说的。到目前为止,我已经能够使用write()将它们转换为写入数据的模型,并使用read()将它们转换为读取数据的模型。我偶尔会使用ioctl来进行更微调的控制。
现在,我想在FPGA逻辑中构建一个协处理器块,并为同一FPGA中的ARM处理器编写设备驱动程序,以便将工作从ARM卸载到FPGA。我很难弄清楚如何最好地设计这个界面。
如果对协处理器的访问是独占的,则可以将数据写入驱动程序,处理将在FPGA结构中进行,并通过调用读取来检索数据。然而,独占访问协处理器硬件将是一种浪费。理想情况下,任何用户空间进程都可以使用硬件。我相信,如果策略要求用户空间进程打开设备,写入数据,读取结果,然后关闭文件,那么它就会起作用。每次需要访问协处理器时打开和关闭文件的开销似乎首先抵消了卸载工作的好处。
我知道在设备驱动程序代码中有一大堆问题需要处理,以安全地处理对硬件的多次访问。但从更高的层次来看,我希望看到这样一个概念,它可以使这个接口工作,并遵循Linux设备驱动程序的良好实践。
暂时抛开所有的复杂性,理想的情况似乎是这样一个系统,在这个系统中,任何进程都可以打开设备,并且有一个访问点,在那里数据被写入设备,可能是在阻塞调用中,在协处理器完成它的魔术之后,数据被读取。驱动程序将处理硬件访问,调用进程可以在需要时保持设备文件的打开状态。当然,任何见解或指导都将非常感谢!
这些都是额外的信息,以防有人关心,或者它以某种方式有用或有趣:
这个特殊的FPGA是Xilinx的Zynq设备。它在与A9结构(基于Kintex系列)相同的硅片上有一个双核Cortex ARM FPGA。该系统正在运行Arch Linux for ARM,并且已经出色地运行了一年。我使用通用名称“协处理器硬件”,因为其想法是,随着时间的推移,这块硬件将获得功能,而与其设备驱动程序的用户空间接口保持相当稳定。
谢谢!这是我在这里的第一个问题,所以我为违反协议和天生的无知道歉。
--时间
发布于 2015-05-06 21:28:05
我的团队已经研究这类东西好几年了。为了实现CPU和可编程逻辑之间的最低延迟,我们将硬件内存映射到应用程序进程中,以便它可以直接与硬件通信。这消除了初始连接后的操作系统开销。
尽管如此,我们发现CPU ->加速器往返至少有1微秒。这导致我们卸载更大的工作块,或使用此路径来配置将结果直接写入系统DRAM的数据采集操作。
根据工作组合的不同,您可以通过多种方式来安排共享加速器。
多路复用responses.
如果您的加速器具有请求和响应队列,则可以通过编程IO (内存映射硬件寄存器)或系统DRAM中的共享内存队列(以及到/来自可编程逻辑的DMA )访问它们。
有关这些方法的更多讨论,请参阅我们的FPGA 2015白皮书:http://www.connectal.org/connectal-fpga2015.pdf
https://stackoverflow.com/questions/29037949
复制相似问题