2013-02-14 58 views
0

我在写一些代码(在FPGA上运行),它将一个模式写入由其基地址和最高地址指定的内存块。数据宽度是64位,地址空间是32位。在我的系统中,长整型是32位,长整型是64位。该代码看起来是这样的:使用64位整数迭代器的32位地址空间?

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),但我认为这个代码是最简单和最易读的。编写具有已知编译器错误的代码是否被认为是不好的风格?

回答

2

你为什么要宣布iunsigned long long?那是什么意思?

正如你所说,你的平台上的地址是32位。声明iunsigned long,就像base_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,你的循环体仍将执行,访问超出high_addr 7个额外的字节。这是意图吗?

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)环绕式,通过中止for循环,如果i < base_addr了。