gpt4 book ai didi

python - 将 mmap 指针作为 mmap 对象从 C 传递给 python

转载 作者:行者123 更新时间:2023-11-30 17:54:46 27 4
gpt4 key购买 nike

我正在尝试将 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。有没有一种简单的方法可以做到这一点?我查看了capsule和ctypes,但它们似乎没有达到我想要的效果?

最佳答案

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

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

但是,我不确定您是否需要这样做。您真的需要一个 mmap,还是只是任何可以视为字符串/列表/迭代器的缓冲区?因为后者要容易得多。为此,您只需创建一个 old-style buffernew-style buffer类——或者,如果您只需要 2.7+,请使用具体的 memoryview类型。从概念上讲,返回映射内存的 View 而不是映射本身似乎是有意义的,但我可以想象在某些用例中这可能不合适。

最后,您始终可以创建一个新类,该类公开您想要的映射周围的任何接口(interface),并根据需要使其尽可能类似于 mmap

关于python - 将 mmap 指针作为 mmap 对象从 C 传递给 python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14761350/

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