2011-04-04 47 views
2

GCC允許控制其中的變量被放置於使用部屬性的節:如何在物理內存中指定變量位置?

struct duart a __attribute__ ((section ("DUART_A"))) = { 0 }; 

是否有我的C代碼,以指定在物理內存中此部分的精確位置的方法嗎?我假設不存在虛擬內存,或者,也可以將虛擬地址直接轉換爲物理地址。

我知道我可以通過一個腳本我傳給連接器處理它,但它會更好,如果我能在我的(自動生成)C.

+0

你的例子不是 '物理內存'。除非您使用某些不使用虛擬內存的操作系統,否則您無法指定var的物理位置。也許有些人可以在一些嵌入式系統中做到這一點。 – tristan 2011-04-04 16:02:14

+0

你說得對。我的假設不是虛擬記憶。 – Vitali 2011-04-06 05:18:14

+0

**爲什麼**不使用鏈接器會更好?這就是連接器**的**! – detly 2011-04-06 05:18:51

回答

0

一個簡單的方法,直接指定它是定義一個指針到你的結構並用正確的值初始化它,所以你不需要特殊的鏈接器選項。當然,只有當你不需要任何speciel連接時功能時,這個技巧纔有效。

再見!

1

可以通過使用宏,例如實現具有某些物理地址變量的效果:

#define a (*(volatile struct duart *)0xdeadbeef) 

此不使用連接體;它沒有聲明任何變量,所以你不會在目標文件中看到a。但我想你不需要這個。

注意volatile關鍵字,這是使用內存映射硬件時總是需要的。它通常會在沒有volatile的情況下運行,但有時它不會,並且調試此類故障很難 - 所以請不要忘記volatile關鍵字!

用法:

// I assume the duart structure has fields write_buf and read_buf of type uint8_t 
a.write_buf = 0x55; // write data to DUART 
a.write_buf = 0xaa; // write more data to DUART 
uint8_t byte1 = a.read_buf; // read data from DUART 
uint8_t byte2 = a.read_buf; // read more data from DUART 
+1

如果系統使用虛擬內存,該怎麼辦? – 2011-04-04 16:38:48

+0

@波佩爾森然後,我不知道。 – anatolyg 2011-04-04 17:43:24

+0

@ Bo-Persson我假定沒有虛擬內存。我糾正了我的問題 – Vitali 2011-04-06 05:21:40

相關問題