2013-02-07 5 views
0

C 라이브러리 (beaglebone PRU 드라이버 prussdrv.c)와 Python을 인터페이스하려고합니다. 아래 그림과 같이 내가 반환에게 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 중 하나를 캡슐화하고 mmap에 개체로 파이썬에 전달하고 싶습니다. 이 작업을 수행하는 간단한 방법이 있습니까? 나는 캡슐과 ctypes를 보았지만 내가 찾고있는 것을 보이지 않는다?

+0

실제로 조작 할 수있는 'mmap' 객체이거나, mmap으로 할 수있는 것과 같은 방법으로 문자열 /리스트/반복자로 취급 할 수있는 버퍼와 같은 것일까? – abarnert

답변

0

이런 식의 기본 매핑에서 파이썬 mmap 개체를 만들 수있는 방법이 없다고 생각합니다. 프로토콜은 게시되지 않으며 내부 형식도 아닙니다.

물론 the source을 사용할 수 있습니다. 따라서 매핑이 new_mmap_object으로 생성 된 것과 동일한 기준을 모두 충족하는 경우 수동으로 정보를 래핑하고 mmap_object을 구성하여 다시 전달할 수 있습니다. (은 실제로는이 어떤 헤더 파일에도 없기 때문에 mmap_object 유형에 액세스 할 수 없습니다.하지만 동등한 유형을 만들거나 코드를 복사하여 붙여 넣으면 코드를 PyObject *으로 전달할 것입니다. 유형 필드가 올바른 유형을 가리키면 작동 할 것입니다.)

그러나이 작업을 수행해야하는지 잘 모르겠습니다. mmap이 정말로 필요합니까, 아니면 문자열 /리스트/반복자로 취급 할 수있는 버퍼일까요? 후자가 훨씬 쉽기 때문입니다. 이를 위해서는 old-style buffer 또는 new-style buffer 클래스를 만들거나 2.7+ 만 필요한 경우 memoryview 콘크리트 유형을 사용하십시오. 개념적으로 매핑 자체가 아니라 매핑 된 메모리의 뷰를 반환한다는 것은 의미가있는 것처럼 보이지만 적절하지 않은 사용 사례를 상상할 수 있습니다.

마지막으로 맵핑에서 원하는 인터페이스를 제공하는 새로운 클래스를 만들고 언제든지 mmap과 같이 (또는 조금이라도) 만들 수 있습니다.

+0

예, 액세스와 같은 모든 유형의 버퍼가 작동합니다. 나는 제안한 것처럼 new_mmap_object 코드를 기반으로 mmap 객체를 수동으로 함께 넣기 시작했습니다. 그러나 버퍼 클래스 또는 memoryview를 사용하면 그만큼 쉬울 것입니다. 포인터 주셔서 감사! 나는 그들을 조사하기 시작할 것이다. – cyann

+0

@cyann : 어떤 파이썬 버전이 마음에 드십니까? 오래된 콘크리트 버퍼 클래스를 사용하고 싶지는 않습니다. 가능한 경우'memoryview'를 사용하십시오. 2.6이 필요하다면 자신 만의 새로운 버퍼 프로토콜 클래스를 작성해야하지만 꽤 쉽습니다 (그리고 2.7의'memoryview'에서 자유롭게 빌릴 수 있습니다). 2.5 이전 버전이 필요하다면 이전 버퍼 프로토콜을 구현해야합니다. 프로토콜에서 모든 것을 구현할 필요가 없으며 코드에 필요한 부분 만 구현하는 것이 가장 좋습니다. – abarnert