【问题标题】:KPIT GCC Allocation of text strings to specific linker sectionsKPIT GCC 将文本字符串分配给特定的链接器部分
【发布时间】:2015-07-21 01:16:07
【问题描述】:

我正在尝试将 KPIT gcc 用于 Renesas M16 cpu。编译器将指针限制为 16 位,因此所有字符串在启动时都从 ROM 复制到 RAM。这填满了我的 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)

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

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

【问题讨论】:

  • CPU 有 1 兆的地址空间。编译器应该处理该地址空间内的任何地址。因此无需将文字移出数据 ROM。我强烈建议使用 makefile,以便正确编译所有内容并使用链接器命令文件,以便所有数据类型(代码、文字、中断表等)都位于内存映射中的正确位置。

标签: c string gcc linkage


【解决方案1】:

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

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

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

【讨论】:

  • 感谢@kerch,这完全符合预期。现在我的问题是数据 ROM 对我所有的字符串来说都太小了 ;-(。不知道它几乎工作了。
  • 好的,很高兴有些东西奏效了。不过,无法帮助您解决 ROM 问题... :-)
猜你喜欢
  • 2014-02-04
  • 1970-01-01
  • 2015-05-27
  • 2011-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-05
  • 1970-01-01
相关资源
最近更新 更多