GCC允許控制其中的變量被放置於使用部屬性的節:如何在物理內存中指定變量位置?
struct duart a __attribute__ ((section ("DUART_A"))) = { 0 };
是否有我的C代碼,以指定在物理內存中此部分的精確位置的方法嗎?我假設不存在虛擬內存,或者,也可以將虛擬地址直接轉換爲物理地址。
我知道我可以通過一個腳本我傳給連接器處理它,但它會更好,如果我能在我的(自動生成)C.
GCC允許控制其中的變量被放置於使用部屬性的節:如何在物理內存中指定變量位置?
struct duart a __attribute__ ((section ("DUART_A"))) = { 0 };
是否有我的C代碼,以指定在物理內存中此部分的精確位置的方法嗎?我假設不存在虛擬內存,或者,也可以將虛擬地址直接轉換爲物理地址。
我知道我可以通過一個腳本我傳給連接器處理它,但它會更好,如果我能在我的(自動生成)C.
一個簡單的方法,直接指定它是定義一個指針到你的結構並用正確的值初始化它,所以你不需要特殊的鏈接器選項。當然,只有當你不需要任何speciel連接時功能時,這個技巧纔有效。
再見!
可以通過使用宏,例如實現具有某些物理地址變量的效果:
#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
你的例子不是 '物理內存'。除非您使用某些不使用虛擬內存的操作系統,否則您無法指定var的物理位置。也許有些人可以在一些嵌入式系統中做到這一點。 – tristan 2011-04-04 16:02:14
你說得對。我的假設不是虛擬記憶。 – Vitali 2011-04-06 05:18:14
**爲什麼**不使用鏈接器會更好?這就是連接器**的**! – detly 2011-04-06 05:18:51