gpt4 book ai didi

python - 强制使用 python mmap 进行 32 位访问?

转载 作者:太空宇宙 更新时间:2023-11-03 11:38:17 31 4
gpt4 key购买 nike

我在 64 位 arm 处理器上运行 64 位 python。该处理器的 AXI 总线上的一个连接到 FPGA(FPGA 将总线和时钟域更改为 32 位宽的总线)。这 block 硬件不喜欢 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 中,我当然可以在编写时只获得一个写访问权限。

我将此发布给可能感兴趣的其他人。如果您对最后一个问题有解决方案(写前阅读),请发布。

关于python - 强制使用 python mmap 进行 32 位访问?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55039249/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com