2015-07-21 20 views
1

我正在嘗試爲瑞薩M16 cpu使用KPIT gcc。編譯器將指針限制爲16位,因此所有字符串在啓動時從ROM複製到RAM。這填充我的RAM。該芯片在第一個64K中有一些數據ROM可用,如果我可以讓編譯器將字符串放在那裏,那麼可以通過小指針尋址。我找不到編譯器開關來控制串的位置,所以我嘗試了以下內容:KPIT GCC將文本字符串分配到特定的鏈接器部分

static const char fmt[] __attribute__ ((section ("nrodata"))); 
static const char fmt[]="Hello World"; 

這似乎如果放置在文件中的外部功能工作。但是,在一個函數內,相同的代碼會給出錯誤:「對於第一行,」存儲大小'fmt'未知「。 我希望它在功能工作的原因是,我在考慮換所有的printf()調用像宏:

#define PRINTF(fmt,args...) do { \ 
     static const char _fmt_[] __attribute__ ((section ("nrodata"))); \ 
     static const char _fmt_[]=#fmt; \ 
     printf(_fmt_ , ##args); \ 
    } while (0) 

得到的字符串到正確的部分。

有誰知道我可以如何將字符串放入特定的部分?

+0

CPU有1兆的地址空間。編譯器應該處理該地址空間內的任何地址。所以不需要將文字移動到數據ROM之外。我強烈建議使用makefile,以便正確編譯所有內容並使用鏈接器命令文件,以便所有數據類型(代碼,文字,中斷表等)都位於內存映射中的正確位置。 – user3629249

回答

1

基礎上GCC documentation你應該能夠在同一行變量定義到指定的屬性,如:

static const char __attribute__ ((section ("nrodata"))) fmt[]="Hello World"; 

它說,你可以只對全局變量做到這一點,但它看起來就像它可能被允許用於你的示例代碼中的靜態變量一樣。 (我沒有你的編譯器,所以我不能真正嘗試它)

+0

謝謝@kerch,完全按照需要工作。現在我的問題是數據ROM對於我所有的字符串來說都太小了;-(。Nevemind它幾乎可以工作。 – Colin

+0

好吧,很高興能夠有效地工作,但是不能幫助你解決你的ROM問題,但是...... :-) – kerch