gpt4 book ai didi

c++代码在python中使用ctypes和mmap进行转换

转载 作者:行者123 更新时间:2023-11-30 02:18:03 44 4
gpt4 key购买 nike

我正在尝试将 C++ 代码转换为 Python。

int fd_vdma = open("/dev/mem", O_RDWR|O_SYNC);  // open uiox device for vdma access
if (fd_vdma < 1) {
printf("Invalid mem device file\n");
}
// mmap the vdma device for vdma access

unsigned int *ptr_vdma;
ptr_vdma = (unsigned int*)mmap(NULL, VDMA_MAP_SIZE,PROT_READ|PROT_WRITE,
MAP_SHARED, fd_vdma, VDMA_ADDR);
printf("DMA 1 virtual address: 0x%08x \n",ptr_vdma);

*(ptr_vdma+5) = FRBUF_ADDR_0;
*(ptr_vdma+7) = 2; // use internal fifos to trigger xfer
*(ptr_vdma+8) = 20480;
*(ptr_vdma+6) = (75 << 16) + (HORIZ_PIXELS_SMALL+75);
*(ptr_vdma+0x0D) = 200; // no. FIFO threshhold .. max.. 240

我已经做到了,

# vdm memory check
try:
fd_vdm_path = "/dev/mem"
mode = "rb+"
fd_vdm = open(fd_vdm_path, mode)
# print(fd_vdm.fileno())
print("[INFO] " + fd_vdm_path + " checked")

except Exception as error:
print("{}".format(error))

# mmap the VDMA device for VDM access
vdma_buf = mmap.mmap(fd_vdm.fileno(), int(VDMA_MAP_SIZE),
mmap.MAP_SHARED, mmap.PROT_READ|mmap.PROT_WRITE, 0)

ptr_vdm = ctypes.c_uint.from_buffer(vdma_buf)
print(type(ctypes.addressof(ptr_vdm)))
print("[INFO] " + fd_vdm_path + " has allocated virtual address : " +
hex(ctypes.addressof(ptr_vdm)))

但我一直卡在这里,我不知道如何在 python 中执行以下操作。

*(ptr_vdma+5) = FRBUF_ADDR_0;
*(ptr_vdma+7) = 2; // use internal fifos to trigger xfer
*(ptr_vdma+8) = 20480;
*(ptr_vdma+6) = (75 << 16) + (HORIZ_PIXELS_SMALL+75);
*(ptr_vdma+0x0D) = 200; // no. FIFO threshhold .. max.. 240

我试过 vdma_buf.write(FRBUF_ADDR_0) 但它不起作用,我在互联网上找不到任何东西(可能我没有很好地搜索它)你能帮我解决这个问题,或者给我推荐一些链接或教程吗?

最佳答案

您可以使用memoryviewstruct.pack:

...
mm = memoryview(vdma_buf)

mm[5*4:6*4] = struct.pack("I", FRBUF_ADDR_0)
mm[7*4:8*4] = struct.pack("I", 2)
mm[8*4:9*4] = struct.pack("I", 20480)
mm[6*4:7*4] = struct.pack("I", (75 << 16) + (HORIZ_PIXELS_SMALL+75))
mm[0x0D*4:0x0E*4] = struct.pack("I", 200)

memoryview 表示字节序列,如果要将其他类型写入内存,则必须使用 struct.pack 将其转换为字节。

那么,假设您想在索引 N 处写入一个无符号整数。首先,您调用 struct.pack("I", ...) 来获取 int 的字节表示形式。然后你必须计算目标内存地址。因为 unsigned int 的大小是 4 个字节,所以地址等于 N*4

memoryview 支持切片 所以你可以这样写:

mm[StartAddress:EndAddress] = BytesYouWantToWrite

其中 StartAddress 等于 N*4,EndAddress 为 (N+1) * 4

关于c++代码在python中使用ctypes和mmap进行转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52784480/

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