我目前在Yocto Linux构建中工作,并且正在尝试与FPGA上的硬件模块接口。该模块模仿的是带有FAT16文件系统的SD卡;包含一个文件(cam.raw)。该文件表示FPGA与linux系统之间的共享内存空间。因此,我希望能够将linux系统中的数据写入此内存,并取回FPGA可能进行的任何更改(当前,FPGA只是从内存空间中提取了一部分数据,并将6加到一个LSB的LSB中。像我写0x40302010一样的32位字,如果我读回数据,应该返回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中是read / write)。对于大多数这些操作,我最终都得到errno 22。
进行挖掘后,我发现O_DIRECT标志做错了什么。在我的C和Python版本中,我没有使用memalign来创建缓冲区,并且没有进行块读/写。这篇文章有一个很好的解释:
如何在Linux上的C ++中使用read()和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函数。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句