2012-03-02 64 views
2

在我的嵌入式应用程序中,这对内存非常敏感,我注意到一些使用大量堆栈空间的newlib函数。通过查看newlib的源代码,特别是在这种情况下memmem.c,我注意到两个定义,PREFER_SIZE_OVER_SPEED和__OPTIMIZE_SIZE__,它可以大大减少内存使用量。 据我所知,这些应该在编译newlib时使用“优化大小”库来定义。由于我使用的是cortex-M3微控制器,是否有任何ARM工具链使用“优化尺寸”newlib或提供使用它的选项,或者我应该自己尝试构建它。 此外,在构建newlib时,我是否也应该构建GCC,或者可以只创建库并将其用于当前工具链。目前我正在使用CoIDE和他们提供的工具链。针对代码大小优化的Newlib

回答

1

你只需要建立库,而不是编译器。

但是,我期望任何大小优化与代码大小而不是堆栈大小有关。如果自动变量的大小或数量减少,堆栈大小只会减小,并且通常由所需的功能而不是算法的优化来确定。

虽然通过利用更多的内存可以加速涉及大量数据移动的高级操作,但我认为在C标准库级别这种机会是最小的,因此“比较喜欢大小超速“是关于代码大小而不是数据存储器使用情况。

+0

这只是我在做Z.T时注意到的事情。也建议。我知道对大小标记进行优化只会减小代码的大小,而且它对这个特定函数使用较少的堆栈的事实只是一个令人高兴的巧合。但就像我在我的评论中也说过的,我想知道还有什么可以通过这个获得,并且想要尝试一下 – Merwe 2012-03-04 10:31:00

+0

我想说,要确定你知道图书馆是如何构建的,你要么需要从库提供者(如果包含可能提供线索的构建脚本),或者根据自己的需求自行构建它。 – Clifford 2012-03-04 19:40:17

0

您正在使用不是标准功能的memmem。这是glibc中的一个GNU扩展。你实际运行的代码是在str-two-way.h中。我没有研究它,但它说它是一个像Boyer-Moore这样的子线性字符串搜索,并且提供了关于Boyer-Moore的维基百科文章。当然这会有一些内存成本。

因为它甚至不是标准函数,所以如果你不喜欢它,没有理由使用newlib的实现。只需使用您自己的子字符串搜索功能。如果您知道二次时间足够好,只需使用memmem.c中的5行循环代码即可。您可能想要检查memcmp是否正确地使用未对齐的负载(如果您的架构支持这些负载)。如果没有,手动嵌套循环可能比调用memcmp快。

+0

我实际上做了你的建议,使用来自memmem.c的简短版本的代码,但是这让我想知道是否没有任何其他优势的建设与优化大小旗帜newlib。我还从uClibc的memmem中看到了根本不使用memcmp的源代码。我并不是真的关心这个性能,因为我在应用程序的初始化阶段只使用memmem,但正如我所说的,我也想知道从“更小”的newlib中还能获得什么。 – Merwe 2012-03-04 09:59:08

+0

我建议对这些定义的源代码进行清理,并在其邮件列表上询问更多节省内存的方法。 :-) – 2012-03-07 00:41:34