0

ベースアドレスと最上位アドレスで指定されたメモリブロックにパターンを書き込む (FPGA 上で実行される) コードを書いています。データ幅は 64 ビット、アドレス空間は 32 ビットです。私のシステムでは long は 32 ビットで、long long は 64 ビットです。コードは次のようになります。

unsigned long base_addr = 0xC0000000;
unsigned long high_addr = 0xFFFFFFFF;
unsigned long long i;

for(i = base_addr; i <= high_addr; i += 4){
    *((unsigned long *) i) = some_pattern; 
}

すべて正常に動作しますが、コンパイラから「異なるサイズの整数からポインタへのキャスト」という警告が表示されます。32 ビットのイテレータ変数を使用すると、イテレータが 0xFFFFFFFC にヒットし、再び 0 にオーバーフローするため、コードは無限にループします。

これを行うより良い方法はありますか?問題なく 32 ビット イテレータを使用する方法がたくさんあることは知っていますが (オーバーフローを検出/予測し、high_addr から 3 を引く)、このコードが最も単純で最も読みやすいと思います。既知のコンパイラ エラーでコードを記述することは悪いスタイルと見なされますか?

4

2 に答える 2

2

なぜあなたはとして宣言しiていunsigned long longますか?そのポイントは何ですか?

あなたが言ったように、あなたのプラットフォームのアドレスは 32 ビットです。と同様に宣言しiます。警告が消えるはずです。unsigned longbase_addrhigh_addr

一方、「データ幅が64ビット」とはどういう意味ですか?データ (およびパターン) が実際に 64 ビットの場合、次のことを行う必要があります。

for (i = base_addr; i <= high_addr; i += 8){ /* or i += sizeof(unsigned long long) */
    *((unsigned long long *) i) = some_pattern; 
}

また、たとえば、反復中にiが等しくなった場合high_addrでも、サイクル本体は引き続き実行され、 を超える 7 バイトの余分なバイトにアクセスすることに注意してくださいhigh_addr。そのつもりだったの?

于 2013-02-14T00:36:14.837 に答える
2

それを行うためのより良い方法の私の考え:

unsigned long long *base_addr = (unsigned long long *)0xC0000000;
unsigned long long *high_addr = (unsigned long long *)0xFFFFFFFF;
unsigned long long *i;

for (i = base_addr; i < high_addr; ++i) {
    *i = some_pattern;
}

for ループ if も中止することにより、ポインター (i) のラップアラウンドに注意する必要がある場合がありi < base_addrます。

于 2013-02-14T00:43:34.927 に答える