【发布时间】:2013-05-25 01:32:36
【问题描述】:
我创建了一个小程序作为要在嵌入式平台上实现的系统的概念验证。该程序是用 C++11 编写的,使用 std 并编译为在笔记本电脑上运行。稍后应该实现的最终程序是嵌入式系统。我们无权访问嵌入式平台的编译器。
我想知道在将程序移植到嵌入式平台时,是否有办法以合理且可比较的方式确定程序的静态内存(编译后的二进制文件的大小)。 要求是二进制文件的大小小于 10kb。 使用以下标志编译和剥离时,我们的二进制文件大小为 700Kb:
g++ options: -Os -s -ffunction-sections -fdata-sections
linker options: -s -Wl,--gc-sections
strip libmodel.a -s -R .comment -R .gnu.version --strip-unneeded -R .note
在我们使用剥离和优化选项之前,它占用了 4MB。
我还有很长的路要走,而且它并不是一个真正的大项目。如何以任何方式与嵌入式平台上的等效程序进行比较。
【问题讨论】:
-
虽然可能有一些很容易消除的膨胀,但您很有可能需要以嵌入式思维方式进行一些重大的重新架构和重写,以达到 10Kb 的目标大小。此外,您的笔记本电脑是否是静态链接的(今天通常很难做到)?如果需要嵌入式版本,那么比较也是公平的。尽管您没有提及,但大多数将您限制为 10Kb 代码的平台也有严格的 RAM 限制。
-
每个使用和静态链接的库都会使您的最终代码膨胀。还有,这么小的app,有浮点支持吗?如果没有,还有另一个需要注意的地方。 POD 类型与数组中的类也可能会严重膨胀。我已经做了很多次这种类型的事情,下面建议的地图文件/部分是一个很好的起点。
-
你能用
-fno-rtti和-fno-exceptions编译吗?这些生成的大表通常位于 PC 的磁盘上。但是,它们需要占用嵌入式设备上的 RAM/Flash。典型的节省是 10-30%,这是我上次测量的。 CPU ISA 也可以将代码大小减少/增加 +/-30%。不过,正如Chris 指出的那样,您还有一些工作要做。
标签: c++ optimization g++ embedded