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

我对一个更好的方法的想法:

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;
}

可能需要小心指针 (i) 环绕,如果i < base_addr也中止 for 循环。

于 2013-02-14T00:43:34.927 回答
2

你为什么声明iunsigned long long?那有什么意义呢?

正如您自己所说,您平台上的地址是 32 位的。声明iunsigned long,就像base_addrand一样high_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 回答