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

KPIT GCC Allocation of text strings to specific linker sections

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

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

如果放在文件中的外部函数似乎可以工作。但是,在一个函数中,相同的代码会给出错误:第一行的 "storage size of 'fmt' isn't known" 。 我希望它在函数中工作的原因是我正在考虑将所有 printf() 调用更改为宏,如:

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

将字符串放入正确的部分。

有谁知道如何将字符串放入特定部分?

基于GCC documentation你应该可以在变量定义的同一行指定属性,例如:

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

它确实说您只能对全局变量执行此操作,但看起来像您的示例代码一样可以对静态变量执行此操作。 (我没有你的编译器所以我不能实际尝试)