KPIT GCC将文本字符串分配到特定的链接器部分

问题描述:

我正在尝试为瑞萨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

基础上GCC documentation你应该能够在同一行变量定义到指定的属性,如:

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

它说,你可以只对全局变量做到这一点,但它看起来就像它可能被允许用于你的示例代码中的静态变量一样。 (我没有你的编译器,所以我不能真正尝试它)

+0

谢谢@kerch,完全按照需要工作。现在我的问题是数据ROM对于我所有的字符串来说都太小了;-(。Nevemind它几乎可以工作。 – Colin

+0

好吧,很高兴能够有效地工作,但是不能帮助你解决你的ROM问题,但是...... :-) – kerch