0

我正在尝试将 C 库(beaglebone PRU 驱动程序 prussdrv.c)与 Python 接口。我要访问的特定函数返回一个 mmap 指针,如下所示:

int __prussdrv_memmap_init(void) {
      prussdrv.pru0_dataram_base = mmap(0, prussdrv.pruss_map_size, PROT_READ | PROT_WRITE,
         MAP_SHARED, prussdrv.mmap_fd, PRUSS_UIO_MAP_OFFSET_PRUSS);
      ...

int prussdrv_map_prumem(unsigned int pru_ram_id, void **address) {    
     switch (pru_ram_id) {
     case PRUSS0_PRU0_DATARAM:
          *address = prussdrv.pru0_dataram_base;
           break;

prussdrv_map_prumem (DATARAM[PRU_NUM], &pruDataMem);
pruDataMem_byte = (unsigned char*) pruDataMem;

我想封装 pruDataMem 或 pruDataMem_byte 并将其作为 mmap 对象传递给 Python。有没有一种简单的方法可以做到这一点?我看过胶囊和 ctypes 但他们似乎没有做我想要的?

4

1 回答 1

0

我认为没有任何方法可以mmap从这样的本机映射中创建 Python 对象。该协议未发布,内部格式也未发布。

当然,源是可用的。因此,只要您的映射满足与创建的映射相同的所有标准new_mmap_object,您就可以手动构造一个mmap_object包装信息,并将其传回。(您实际上无法访问该mmap_object类型,因为它不在任何头文件中。但是如果您创建等效类型,或者只是复制并粘贴代码,您将把它作为 a 传递PyObject *,并且只要它的类型字段指向正确的类型,它会工作。)

但是,我不确定您是否需要这样做。你真的需要一个mmap,或者只是任何你可以视为字符串/列表/迭代器的缓冲区吗?因为后者要容易得多。为此,您可以只创建一个旧式缓冲区新式缓冲区类——或者,如果您只需要 2.7+,则使用具体memoryview类型。从概念上讲,返回映射内存的视图而不是映射本身似乎是有道理的,但我可以想象一些可能不合适的用例。

最后,您始终可以创建一个新类,该类公开您想要围绕映射的任何接口,并使其尽可能多(或尽可能少)像mmap您想要的那样。

于 2013-02-07T21:39:28.960 回答