我目前正在使用 Yocto Linux 构建并尝试与 FPGA 上的硬件块进行交互。该块正在模仿带有 FAT16 文件系统的 SD 卡;包含单个文件 (cam.raw)。这个文件代表了FPGA和linux系统之间的共享内存空间。因此,我希望能够将 linux 系统中的数据写入此内存并取回 FPGA 可能做出的任何更改(目前,FPGA 只是从内存空间中获取部分数据并将 6 添加到32 位字,就像我写 0x40302010 并且如果我读回数据应该返回 0x40302016)。但是,由于某处有缓存,虽然我可以将数据写入 FPGA,但我无法立即取回结果。
我目前正在做这样的事情(使用python,因为它很容易):
% mount /dev/mmcblk1 /memstick
% python
>> import mmap
>> import os
>> f = os.open("/memstick/cam.raw", os.O_RDWR | os.O_DIRECT)
>> m = mmap.mmap(f, 0)
>> for i in xrange(1024):
... m[i] = chr(i % 256)
...
>> m.flush() # Make sure data goes from linux to FPGA
>> hex(ord(m[0])) # Should be 0x6
'0x0'
我可以用 dd 确认数据已更改(尽管我也经常遇到缓冲问题)并使用 FPGA 工具(SignalTap/ChipScope)我确实得到了正确的答案(即第一个 32 位字在这种情况下是 0x03020106)。然而,有人,无论是它的python还是linux或两者都在缓冲文件,而不是再次从“SD卡”(FPGA)读取并将文件数据存储在内存中。我需要完全关闭它,以便所有读取都会导致从 FPGA 读取;但我不确定缓冲发生在哪里或如何做到这一点。
任何见解将不胜感激!(注意,我可以使用 mmap.flush() 来获取我从 python 写入的任何数据以将其转储到 FPGA,但我需要像反向刷新或其他东西让它将文件数据重新读入 mmap!)
更新:
正如评论中所建议的, mmap 方法可能不是实现我需要的最佳方法。但是,我现在在 python 和 C 中都尝试过,但是使用 O_DIRECT 标志使用基本的 I/O 函数(python 中的 os.read/write,C 中的读/写)。对于大多数这些操作,我最终得到 errno 22。仍在研究这个....