2013-02-07 94 views
0

我試圖用Python與C庫(beaglebone PRU驅動程序prussdrv.c)進行接口。特定的功能我想要訪問回報MMAP指針,如下圖所示:將mmap指針從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並將它傳遞給Python作爲一個MMAP對象。有沒有一個簡單的方法來做到這一點?我看過膠囊和ctypes,但他們似乎沒有做我想找的東西?

+0

它是否必須實際上是一個你可以操作的'mmap'對象,或者只是一些類似緩衝區的東西,你可以像使用'mmap'一樣的方式將它視爲字符串/列表/迭代器? – abarnert

回答

0

我不認爲有什麼辦法可以像這樣使用本地映射創建Python mmap對象。該協議沒有發佈,也沒有內部格式。

但當然the source可用。因此,只要您的地圖符合new_mmap_object創建的所有相同條件,您就可以手動構建封裝信息的mmap_object,並將其傳回。 (您不能實際上訪問mmap_object類型,因爲它不在任何頭文件中。但是,如果您創建了一個等效類型,或者只是複製並粘貼代碼,則會將其作爲PyObject *傳遞給它,只要它的類型字段指向正確的類型,它就可以工作。)

但是,我不確定你需要這樣做。你真的需要一個mmap,還是隻有任何可以視爲字符串/列表/迭代器的緩衝區?因爲後者更容易。爲此,您可以創建一個old-style buffernew-style buffer類,或者,如果只需要2.7+,請使用具體的memoryview類型。從概念上講,似乎有意義的是,您返回的是映射內存的視圖,而不是映射本身,但我可以想象一些用例可能不合適。

最後,您可以隨時創建一個新的類,在您的映射周圍顯示您想要的任何接口,並根據需要將其設置爲儘可能多(或儘可能小),如mmap

+0

是的,像訪問任何類型的緩衝區將工作。正如你所建議的那樣,我已經開始關注如何根據new_mmap_object代碼手動將mmap對象放在一起,但是希望使用緩衝類或memoryview會比這更容易。感謝指針!我會開始研究他們。 – cyann

+0

@cyann:你關心什麼Python版本?你不想在任何東西中使用舊的具體緩衝類。如果可以的話,使用'memoryview'。如果你需要2.6,你必須編寫你自己的新緩衝區協議類,但這很容易(你可以從2.7的'memoryview'中寬鬆地借用)。如果你需要2.5或更早的版本,你必須實現舊的緩衝協議 - 最好的指導是你不必在協議中實現所有的東西,只需要你的代碼需要的部分。 – abarnert