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