5

現在、Yocto Linux ビルドで作業しており、FPGA 上のハードウェア ブロックとインターフェイスしようとしています。このブロックは、FAT16 ファイル システムを搭載した SD カードを模倣しています。単一のファイル (cam.raw) を含みます。このファイルは、FPGA と Linux システム間の共有メモリ空間を表します。そのため、Linux システムからこのメモリにデータを書き込んで、FPGA が行った変更を元に戻すことができるようにしたいと考えています (現在、FPGA は単にメモリ空間からデータの一部を取得し、メモリ空間の LSB に 6 を追加します)。 0x40302010 を書き込み、データを読み戻すと 0x40302016 が返されるように、32 ビット ワード)。ただし、どこかにキャッシングがあるため、FPGA にデータを書き込むことはできますが、すぐに結果を返すことはできません。

私は現在、このようなことをしています(簡単なのでpythonを使用しています):

% mount /dev/mmcblk1 /memstick
% python
>> import mmap
>> import os
>> f = os.open("/memstick/cam.raw", os.O_RDWR | os.O_DIRECT)
>> m = mmap.mmap(f, 0)
>> for i in xrange(1024):
...  m[i] = chr(i % 256)
...
>> m.flush() # Make sure data goes from linux to FPGA
>> hex(ord(m[0])) # Should be 0x6
'0x0'

データが変更されたことを dd で確認できます (ただし、バッファリングの問題も頻繁に発生します)。FPGA のツール (SignalTap/ChipScope) を使用すると、実際に正しい答えが得られます (つまり、最初の 32 ビット ワード)。この場合は 0x03020106 です)。ただし、誰かが、そのpythonまたはlinuxまたはその両方がファイルをバッファリングしており、「SDカード」(FPGA)から再度読み取らず、ファイルデータをメモリに保存していません。これを完全に遮断して、すべての読み取りが FPGA からの読み取りになるようにする必要があります。しかし、バッファリングがどこで行われているか、またはその方法がわかりません。

どんな洞察もいただければ幸いです!(注意、mmap.flush() を使用して Python から書き込んだデータを取得して FPGA にダンプできますが、ファイル データを mmap に再読み込みするには、リバース フラッシュまたは何かが必要です!)

アップデート:

コメントで示唆されているように、必要なものを実装するには mmap アプローチが最適ではない可能性があります。ただし、Python と C の両方で試してみましたが、O_DIRECT フラグを使用して基本的な I/O 関数 (Python では os.read/write、C では read/write) を使用しました。これらの操作のほとんどで、最終的に errno 22 が発生します。これについてはまだ調査中です....

4

1 に答える 1