KPIT GCC将文本字符串分配给特定链接器节
我正在尝试为Renesas M16 cpu使用KPIT gcc。编译器将指针限制为16位,因此所有字符串在启动时都从ROM复制到RAM。这填满了我的公羊。芯片在前64K中有一些可用的数据ROM,如果我能让编译器把字符串放在那里,这可以通过小指针寻址。我找不到用于控制字符串位置的编译器开关,因此我尝试了以下方法:KPIT GCC将文本字符串分配给特定链接器节,c,string,gcc,linkage,C,String,Gcc,Linkage,我正在尝试为Renesas M16 cpu使用KPIT gcc。编译器将指针限制为16位,因此所有字符串在启动时都从ROM复制到RAM。这填满了我的公羊。芯片在前64K中有一些可用的数据ROM,如果我能让编译器把字符串放在那里,这可以通过小指针寻址。我找不到用于控制字符串位置的编译器开关,因此我尝试了以下方法: static const char fmt[] __attribute__ ((section ("nrodata"))); static const char fmt[]="Hello
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)
将字符串放入正确的部分
有人知道如何将字符串放入特定部分吗?基于变量定义,您应该能够在变量定义的同一行中指定属性,例如:
static const char __attribute__ ((section ("nrodata"))) fmt[]="Hello World";
它确实说您可以只对全局变量执行此操作,但看起来它可能允许对静态变量执行此操作,就像您的示例代码一样。(我没有你的编译器,所以我实际上无法尝试)谢谢@kerch,它完全按照预期工作。现在我的问题是数据ROM对于我所有的字符串来说都太小了-(.Nevemind它几乎成功了。好的,很高兴有些东西成功了。虽然…:-)CPU有1兆的地址空间,但不能帮助您解决ROM问题。编译器应该处理该地址空间中的任何地址。因此,无需将文本移到数据ROM之外。我强烈建议使用makefile,以便所有内容都能正确编译,并使用链接器命令文件,以便所有数据类型(代码、文本、中断表等)都位于内存映射中的正确位置。