我在64位臂处理器上运行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位字(因此偏移到偏移+ 4读数)。遗憾的是,似乎mmap无论如何都会对总线执行64位访问(我假设某种性能优化的缓存),然后执行32位“强制转换”。底层FPGA不满意......
在C程序中,我只写:
data = *((uint32_t *) address);
...并且CPU似乎在其AXI总线上轻轻地执行32位访问,底层硬件更喜欢....(所以现在,我有一个(慢)解决方法,其中python需要一个C程序来连接硬件,通过管道)
有没有办法强制64位python执行32位访问,因为之前的C行显然成功了?
这里写的是关于读取32位的问题,但当然也需要写32位...
基于@martineau的想法,双探针可以使用python ctypes修复,如:
s = ctypes.c_uint32.from_buffer(self.lw, offset).value #read
要么
types.c_uint32.from_buffer(self.lw, offset).value = s #write
这确实似乎迫使python执行与C中相同的32位访问,并删除32位总线上的双读或写探针。
然而,遗憾的是,python似乎在每次写入之前都会读取。所以上面的解决方案非常适合读取,但在写入时,我仍然可以在写入访问之前获得读访问权限。在C中,我当然可以在写入时获得单个写访问权限。
我发帖给其他可能感兴趣的人。如果您有最后一期的解决方案(在写之前阅读),请发布。