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に渡したいと思います。これを行う簡単な方法はありますか?カプセルとctypeを調べましたが、探していることを実行していないようです。

4

1 に答える 1

0

mmapこのようなネイティブマッピングからPythonオブジェクトを作成する方法はないと思います。プロトコルは公開されておらず、内部形式も公開されていません。

しかしもちろん、ソースは利用可能です。したがって、マッピングがによって作成されたものとすべて同じ基準を満たしている限り、情報をラップするようにnew_mmap_object手動で作成し、それを返すことができます。mmap_object(ヘッダーファイルにないため、実際に型にアクセスすることはできません。ただし、同等の型を作成するか、コードをコピーして貼り付けるだけの場合は、として渡されます。そのタイプフィールドは正しいタイプを指しており、機能します。)mmap_objectPyObject *

ただし、これを行う必要があるかどうかはわかりません。本当に必要ですかmmap、それとも文字列/リスト/イテレータとして扱うことができるバッファが必要ですか?後者の方がはるかに簡単だからです。そのためには、古いスタイルのバッファーまたは新しいスタイルのバッファークラスを作成するだけです。または、2.7以降のみが必要な場合は、具象memoryview型を使用します。概念的には、マッピング自体ではなく、マップされたメモリのビューを返すことは理にかなっているように見えますが、これが不適切である可能性があるいくつかのユースケースを想像できます。

最後に、マッピングの周囲に必要なインターフェイスを公開する新しいクラスをいつでも作成し、必要なだけ(または少なく)mmapすることができます。

于 2013-02-07T21:39:28.960 に答える