Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
KPIT GCC将文本字符串分配给特定链接器节_C_String_Gcc_Linkage - Fatal编程技术网

KPIT GCC将文本字符串分配给特定链接器节

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

我正在尝试为Renesas M16 cpu使用KPIT gcc。编译器将指针限制为16位,因此所有字符串在启动时都从ROM复制到RAM。这填满了我的公羊。芯片在前64K中有一些可用的数据ROM,如果我能让编译器把字符串放在那里,这可以通过小指针寻址。我找不到用于控制字符串位置的编译器开关,因此我尝试了以下方法:

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,以便所有内容都能正确编译,并使用链接器命令文件,以便所有数据类型(代码、文本、中断表等)都位于内存映射中的正确位置。