C++ c++;使用ctypes和mmap在python中进行代码转换
我试图将C++代码转换成Python。C++ c++;使用ctypes和mmap在python中进行代码转换,c++,python-3.x,cython,ctypes,debian-jessie,C++,Python 3.x,Cython,Ctypes,Debian Jessie,我试图将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_vd
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
但我一直停留在这里,我不知道如何在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
*(ptr_vdma+5)=FRBUF_ADDR_0;
*(ptr_vdma+7)=2;//使用内部FIFO触发xfer
*(ptr_vdma+8)=20480;
*(ptr_vdma+6)=(75您可以使用memoryview
和struct.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)
当StartAddress等于N*4,EndAddress为(N+1)*4时,我的Python非常脆弱,但您可以利用*(ptr_vdma+5)
与ptr_vdma[5]相同的优势
。我之前尝试过,它会抛出一个名为TypeError的错误:“c_ulong”对象不支持项分配
当我使用memoryview时,它会抛出一个名为TypeError的错误:无法生成内存视图,因为该对象没有缓冲区接口
我是否做了mmap错误?或者我需要在使用memoryview之前执行一些步骤w?您是否使用python3?此错误在Python2.7中显示:很抱歉,我使用的是虚拟环境,而我不在虚拟环境中。这就是我发生此错误的原因。但即使在python3中,当我使用mm[5]=FRBUF_ADDR_0=0x1E000000时,我也会得到此错误值error:memoryview:formate“B”的无效值,似乎我只能在缓冲区中写入有限的值(0xff)。我已经添加了一些解释,希望现在更清楚。非常感谢,它非常完美,我已经尝试解决这个问题3天了,您很容易就解决了。
...
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)
mm[StartAddress:EndAddress] = BytesYouWantToWrite