私はFPGAのデバイス用にpetalinuxにドライバを作成していますが、ユーザ空間でデバイスを制御するためにmmap関数を実装しました。私の問題は、私はmmap関数とユーザアプリケーションでMAP_SHARED
フラグにmmap()を使用する際のキャッシングを回避する方法
vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);
を使用している場合も、キャッシュが有効になっているようだ、ということです。
私が行ったテストでは、mmapedデバイスの特定のレジスタに値(たとえば5)を書き込んで、AXIバスからのデータの最下位ビットのみを実際に格納していました。私が書き込み操作の直後に読んだ場合、私は1(これはMicroblazeのベアメタルアプリケーションを使用しているときに起こった)を読み込むと予想されますが、代わりに5を読みます。しかし、何が起こるのでしょうか? ..happens。
ありがとうございます。
コードのmmap'd領域にどの程度正確にアクセスしていますか(書き込み/読み取り)していますか?具体的には、あなたが話している特定のレジスタをどのように書いたり読んでいるかのコードスニペットを提供できますか? – pah
私のアプリケーションでは、私が '*(unsigned int *)を使用しているmmaped領域からの書き込み/読み込み時に' address = mmap(NULL、PAGE_SIZE、PROT_READ | PROT_WRITE、MAP_SHARED、fd、0); 'アドレス+ REG_OFFSET)= 5'と 'temp_var = *(unsigned int *)(アドレス+ REG_OFFSET)'となります。 – Alessandro
は 'volatile'と宣言された' address'ですか? – pah