禁用特定文件上的caching/缓冲区(Linux)

我目前正在Yocto Linux版本中工作,并试图与FPGA上的硬件模块进行接口。 该模块正在模拟一个带有FAT16文件系统的SD卡; 包含一个文件(cam.raw)。 这个文件代表了FPGA和linux系统之间的共享内存空间。 因此,我希望能够将数据从linux系统写入这个存储器,并取回FPGA可能做出的任何更改(目前,FPGA只是从内存空间中取出部分数据,并将6个数据添加到一个32位字,就像我写0x40302010,如果我读回数据应该回到0x40302016)。 但是,由于某处存在一些caching,而我可以将数据写入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来确认数据是否改变了(尽pipe我经常遇到缓冲问题),并使用FPGA(SignalTap / ChipScope)的工具,我确实得到了正确答案(即,第一个32位字在这种情况下是0x03020106)。 但是,无论是Python还是Linux还是两者都在缓冲文件,而不是再次从“SD卡”(FPGA)中读取数据并将文件数据存储在内存中。 我需要closures这个完全closures所以所有的读取结果从FPGA读取; 但林不知道在哪里缓冲发生或如何做到这一点。

任何有识之士将不胜感激! (请注意,我可以使用mmap.flush()从python写入的任何数据将其转储到FPGA,但是我需要反转刷新或者将其重新读取到mmap中的文件数据!)

更新:

正如评论中所build议的那样,mmap方法可能不是实现我所需要的最好方法。 然而,我现在已经尝试了Python和C,但使用O_DIRECT标志使用基本的I / O函数(在Python中的os.read / write,在C中读/写)。 对于大多数这些行动,我结束了errno 22.仍然看着这….

挖完之后,我发现我做错了O_DIRECT标志。 在我的C和Python版本中,我并没有使用memalign来创建缓冲区,也没有进行块读取/写入操作。 这个帖子有个很好的解释:

我怎样才能在Linux上用C ++读取()和O_DIRECT文件?

所以,为了实现我所做的,这个C程序是一个基本的例子:

 #include <stdio.h> #include <fcntl.h> #include <errno.h> #define BLKSIZE 512 int main() { int fd; int x; char* buf; fd = open("/home/root/sd/fpga/cam.raw", O_RDWR | O_SYNC | O_DIRECT); if (!fd) { printf("Oh noes, no file!\n"); return -1; } printf("%d %d\n", fd, errno); buf = (char*) memalign(BLKSIZE, BLKSIZE*2); if (!buf) { printf("Oh noes, no buf!\n"); return -1; } x = read(fd, buf, BLKSIZE); printf("%d %d %x %x %x %x\n", x, errno, buf[0], buf[1], buf[2], buf[3]); lseek(fd, 0, 0); buf[0] = '1'; buf[1] = '2'; buf[2] = '3'; buf[3] = '4'; x = write(fd, buf, BLKSIZE); printf("%d %d\n", fd, errno); lseek(fd, 0, 0); x = read(fd, buf, BLKSIZE); printf("%d %d %x %x %x %x\n", x,errno, buf[0], buf[1], buf[2], buf[3]); return 0; } 

这将工作为我的目的,我没有看看如何做正确的内存对齐使用Python的os.read/os.write函数在类似的方式。