2011-03-07 73 views
6

我正在將ARM芯片的程序從IAR編譯器移植到gcc。如何從C代碼引用段起始和大小

在原始代碼中,IAR特定運算符(如__segment_begin__segment_size)分別用於獲取某些內存段的開始和大小。

有沒有辦法用GCC做同樣的事情?我搜查了GCC手冊,但無法找到任何相關的內容。


更多細節:
所討論的內存段必須在固定的位置,使得程序能夠與芯片上的某些外圍設備正確地對接。原始代碼使用__segment_begin運算符來獲取此內存的地址,並使用__segment_size以確保它不會溢出此內存。

我可以通過添加變量來指示這些內存段的開始和結束來實現相同的功能,但是如果GCC有類似的操作符,這將有助於最小化編譯器相關代碼的數量,最終我不得不編寫和維護。

+0

您能更具體地瞭解您需要哪些細分地址和尺寸以及哪些細分受衆羣? – JeSuisse 2011-03-07 13:49:58

回答

2

鏈接器的標誌--section-start?我讀的是支持here

關於如何使用它的一個例子可以在AVR Freaks Forum發現:

const char __attribute__((section (".honk"))) ProjString[16] = "MY PROJECT V1.1"; 

這樣您就可以添加到鏈接器的選項:-Wl,--section-start=.honk=address

+0

謝謝。我想避免不得不更改鏈接器設置,因爲我正在移植的代碼旨在用於圖書館,這意味着圖書館的所有用戶將不得不編輯鏈接器設置才能使其工作,如果可能, d喜歡避免。 – tomsgd 2011-03-18 00:43:57

0

GCC的現代版本將爲每個分段聲明兩個變量,即__start_MY_SEGMENT和__stop_MY_SEGMENT。要使用這些變量,您需要將它們聲明爲具有所需類型的extern。之後,您然後使用'&'運算符來獲取該段的開始和結束地址。

extern uint8_t __start_MY_SEGMENT; 
extern uint8_t __stop_MY_SEGMENT; 
#define MY_SEGMENT_LEN (&__stop_MY_SEGMENT - &__start_MY_SEGMENT)