6

我为 LPC1114 编译,这是一个小型 ARM(实际上是 Cortex)目标。RAM 比 ROM 受限得多。我使用最新的 Mentor (CodeBenchLite) GCC 编译器 (GCC 4.6.3)。我有一些我想在 ROM 中拥有的常量对象。据我了解,下面代码中的 ffx 对象应该以 ROM(代码)结尾,而是放在 DATA 中。

class flop {
    public:
       int x;
       constexpr flop( int x ) : x(x){}
};

 extern constexpr flop ffx( 1 );

如何说服编译器预先计算对象并将其放入 ROM 中?

或者我应该问:

  • 我能以某种方式期望 G++ 编译器为 ffx 生成 ROMable 数据吗
  • 如果是这样,我的代码是否正确
  • 如果是这样,它支持哪个 G++ 版本(我使用 4.6,也许我需要 4.7?)

========================================

这个 bugzilla 条目c++/49673似乎表明我的问题是一个已知问题,可能已在 GCC 4.7 中修复。不幸的是,我更喜欢使用 Mentor/CodeSourcery,它仍然是 4.6.3。所以我想我暂时被这个错误所困扰。:(

4

2 回答 2

1

更新 #2:使用 gcc 4.7.0 的测试结果

这确实在 gcc 4.7.0 中得到修复。您的代码生成以下汇编器输出:

    .file   "constexpr.cpp"
    .globl  _ffx
    .section .rdata,"dr"
    .align 4
_ffx:
    .long   1

这可能是您想要的。升级?

我认为您需要一个特定于平台的解决方案。请参阅在内存中定位代码和数据(分散加载)

分散加载允许您将应用程序划分为多个独立的代码和数据区域,这些区域分布在整个地址映射中。这些区域的位置在加载时间和运行时间之间可能不同:

  1. 加载区域包含应用程序在开机/加载时使用的应用程序代码和/或数据(通常是 ROM)。

与其单独依赖 gcc,不如尝试按照armlink上面提供的链接中的建议使用。

更新:我看到了你提到的 gcc 错误。LLVM/MinGW 同样没有希望。但是,我一直在使用 GCC 4.6,我认为这可能会对您有所帮助:

struct Data
{
    int i;    
};
constexpr Data getData() { return Data{1}; }

如果您没有 ctor,而是有一个constexpr函数,并尝试生成汇编器输出,则输出通常为空(无.data节)。如果您使用它来初始化一些变量(在全局范围内),如下所示:

const Data foo = getData();

你会得到一个程序集,如下所示:

    .file   "constexpr.cpp"
    .section .rdata,"dr"
    .align 4
__ZL3foo:
    .long   1

(这是g++ -std=c++0x -S命令行)。那对你有用吗?

于 2012-06-11T14:53:10.630 回答
0

以我的经验,const数据被放置在一个只读部分中,因此该部分中的所有数据都可以进入 ROM(或被编程到 FLASH 中)。

GCC 链接器指令文件 (*.ld) 可以为不同的部分分配地址。

另一种选择是将大型数据结构(例如字体)放入汇编语言中。汇编语言可以比 C 或 C++ 语言更容易地将数据放入段中。

我们的下一个目标是将数据与我们的可执行文件分开。这缩短了可执行文件并减少了对可执行文件的测试时间。

于 2012-06-11T15:19:28.420 回答