使用python mmap强制32位访问?

问题描述 投票:3回答:1

我在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位...

python 32bit-64bit mmap
1个回答
0
投票

基于@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中,我当然可以在写入时获得单个写访问权限。

我发帖给其他可能感兴趣的人。如果您有最后一期的解决方案(在写之前阅读),请发布。

© www.soinside.com 2019 - 2024. All rights reserved.