我正在寻找一个小型 libc,用于在 ARM7 微控制器上与 freertos 一起使用。我看过 newlib,但它对我的需要来说有点太复杂了。Newlib 在许多函数(例如 printf())中调用 malloc(),这对小型嵌入式实时系统不利。
有谁知道适合我的应用程序的小型可移植开源 libc 实现?
PDCLib 可能适合您的需求。但是,它仍然不完整 [broken link],可能需要更多的实际测试。它的作者在 SO 上是DevSolar。
2012 年 11 月 1 日更新:截至 2012 年 8 月 14 日,开发工作已由 Owen Shepherd 接管,并配备了新的主页和bitbucket 存储库 [断开的链接,使用此链接]。
2015 年 10 月 31 日更新:专用网站似乎已经死了,但仍然可以在 bitbucket上找到代码。对该存储库的最后一次提交发生在 2014 年 11 月 24 日。
2016 年 7 月 12 日更新:网站已备份,DevSolar 于 2016 年 3 月 1 日再次开始提交。
我在具有 32kB RAM 的 Cortex_M3 上使用 newlib,并消除malloc()
您可以使用siprintf()
或sniprintf()
.
优点:不再调用malloc()
.
缺点:它不支持格式化float和double,并且这种方式不是真正可移植的。
如果您使用 newlib 并且没有实现 sbrk 系统调用,那么您使用的任何需要 malloc 的函数都会生成链接器错误,这将防止您无意中使用需要动态内存的调用。所以我建议你这样做,然后简单地避免那些导致链接器错误的函数。您可以修改或覆盖您不想使用的任何库函数。
printf () 不适合小型嵌入式实时系统!
实际上它在很多方面都比 malloc 差。可变参数列表、非常复杂的格式、不需要时的浮点数支持等。 printf() 会带来巨大的开销,编译器将无法减少它,因为传递给它的每个参数都在运行。
printf() 对于仍在学习 C 的业余爱好者和初学者来说可能还可以。但如果你是一名专业程序员,你真的应该编写自己的串行监视器/LCD 例程。您将显着提高程序性能和闪存消耗。
您可能想查看Embedded Artistry libc,它承诺最小化且经过良好测试。它包括一个无 malloc 的printf()
. 免责声明:我没有使用过它,但它看起来结构良好并且正在积极开发。