Newlib针对代码大小进行了优化

时间:2012-03-02 16:01:18

标签: embedded arm cortex-m3 newlib

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

2 个答案:

答案 0 :(得分:1)

您只需要构建库,而不是编译器。

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

虽然通常可以通过利用更多内存来加速涉及大量数据移动的高级操作,但我认为这样的机会在C标准库的级别上是最小的,因此&#34 ;喜欢大小超过速度"完全是关于代码大小而不是数据内存的使用。

答案 1 :(得分:0)

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

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