Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ c++;使用ctypes和mmap在python中进行代码转换_C++_Python 3.x_Cython_Ctypes_Debian Jessie - Fatal编程技术网

C++ c++;使用ctypes和mmap在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

我试图将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
但我一直停留在这里,我不知道如何在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