我在一台64位的ARM处理器上运行64位的Python。这个处理器上的AXI总线连接了一个FPGA(将总线和时钟域转换为32位宽)。但是,这个硬件不支持64位访问...
我正在尝试通过Python mmap方式(在类中)访问这个FPGA:
def __init__(self, base, len):
self.base = base
self.fd = open("/dev/mem", "r+")
self.lw = mmap.mmap(self.fd.fileno(),
len,
mmap.MAP_SHARED,
mmap.PROT_READ | mmap.PROT_WRITE,
offset=base)
def get_U32(self, offset):
s = self.lw[offset:offset+4]
return struct.unpack("<I", s)[0]
想法是
get_U32()
从总线中读取32位的字(因此偏移量为offset到offset+4)。
不幸的是,似乎mmap无论如何都执行64位访问总线(我假设这是一种性能优化的缓存),然后执行32位"转换"。底层FPGA不高兴...
在C程序中,我只需编写:data = *((uint32_t *) address);
目前CPU在其AXI总线上似乎轻松执行一个32位访问,这是底层硬件所偏爱的...(因此,我现在有一个(缓慢的)解决方法,Python需要一个C程序通过管道与硬件进行接口交互)
是否有一种方法强制64位Python执行32位访问,就像以前的C行显然成功了一样?
这里写的问题是关于读取32位,但当然,写入32位也是必需的...
mmap
使用操作系统来访问内存。C 代码直接通过地址访问 32 位数量。你正在比较苹果和橙子。 - martineaudi()
函数来实现类似的功能。你也可以尝试使用32位版本的Python解释器来运行你的脚本。 - martineau