2013-02-14 71 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了。