2016-08-06 5 views
3

私はFPGAのデバイス用にpetalinuxにドライバを作成していますが、ユーザ空間でデバイスを制御するためにmmap関数を実装しました。私の問題は、私はmmap関数とユーザアプリケーションでMAP_SHAREDフラグにmmap()を使用する際のキャッシングを回避する方法

vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot); 

を使用している場合も、キャッシュが有効になっているようだ、ということです。

私が行ったテストでは、mmapedデバイスの特定のレジスタに値(たとえば5)を書き込んで、AXIバスからのデータの最下位ビットのみを実際に格納していました。私が書き込み操作の直後に読んだ場合、私は1(これはMicroblazeのベアメタルアプリケーションを使用しているときに起こった)を読み込むと予想されますが、代わりに5を読みます。しかし、何が起こるのでしょうか? ..happens。

ありがとうございます。

+1

コードのmmap'd領域にどの程度正確にアクセスしていますか(書き込み/読み取り)していますか?具体的には、あなたが話している特定のレジスタをどのように書いたり読んでいるかのコードスニペットを提供できますか? – pah

+0

私のアプリケーションでは、私が '*(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

+1

は 'volatile'と宣言された' address'ですか? – pah

答えて

1

質問のコメントで議論された内容に基づいて、ここに割り当てられているaddressポインタ:

address = mmap(NULL, PAGE_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0); 

は、潜在的につながる、コンパイラはその上の仮定をプリフォームすることができ、型修飾子volatileで宣言されていませんでした読み取り/書き込み操作よりもコンパイル時間の最適化。

関連する問題