嵌入式系统的小型libc

26

我正在寻找一款适用于ARM7微控制器上的嵌入式小型libc,结合freertos使用。

我已经看过了newlib,但它对我的需求来说有些过于复杂。Newlib在许多函数(如printf())中调用malloc(),这对于小型嵌入式实时系统来说并不好。

是否有人知道一款小巧、可移植、开源的libc实现,能够适用于我的应用程序?


你使用的是什么操作系统/内核?这是确定你的选择的关键。 - R.. GitHub STOP HELPING ICE
我正在使用FreeRTOS - http://www.freertos.org/ - GT.
8个回答

13

PDCLib 可能 适合您的需求。然而,它仍然是不完整的 [链接失效],可能需要进行更多的实际测试。其作者在SO上使用用户名DevSolar

更新2012-11-01:从2012-08-14开始,Owen Shepherd接管了开发工作,配备有一个新主页bitbucket存储库 [链接失效,请使用此链接]

更新2015-10-31:专用网站似乎已经无法访问,但代码仍可在bitbucket上找到。该存储库的最后一次提交发生在2014-11-24。

更新2016-07-12:网站已经恢复,并且DevSolar在2016-03-01开始提交。


该页面似乎指向 http://pdclib.e43.eu/ 进行当前开发。它充满了死链接,似乎没有提到可能的操作系统/硬件要求/支持。 - XTL
@XTL:对于posix和win32,存在平台叠加层,该项目的目标之一是易于移植(请参阅原始作者撰写的事后报告:他将其开发为业余操作系统社区的服务)。不知道实际情况如何... - Christoph

11

我在我的32kB RAM Cortex_M3上使用newlib,为了消除malloc(),你可以使用siprintf()sniprintf()

优点:不再调用malloc()

缺点:它不支持格式化floatdouble,而且这种方式并不是真正的可移植性。


7
如果您使用newlib并且没有实现sbrk系统调用,则任何需要malloc的函数都会生成链接器错误,这将防止您意外地使用需要动态内存的调用。因此,我建议您这样做,然后避免那些会导致链接器错误的函数。您可以修改或覆盖任何您不想使用的库函数。

3

printf()并不适用于小型嵌入式实时系统!事实上,它比许多方面的malloc还要糟糕。变量参数列表、非常复杂的格式化、在您不需要时支持浮点数等等。printf()带有巨大的开销,并且编译器无法将其减少,因为传递给它的每个参数都在运行时评估。

printf()可能适用于业余爱好者和初学C语言的人。但如果您是一名专业程序员,您真的应该编写自己的串行监视器/LCD例程。这将显著提高程序性能和闪存消耗。


1
虽然严格来说不是一个答案,但我喜欢它。 - Prof. Falken
1
@Lundin:如果printf()能解决手头的问题,我认为使用它没有问题。按照你的逻辑,你不应该用C语言编写代码,因为汇编语言需要更少的闪存并且执行速度更快。甚至,为什么你还在使用微控制器呢?一个纯ASIC将会更加高效,并且需要更少的闪存;-) - GT.
17
在嵌入式系统中使用 printf 并无不妥,问题在于某些 printf 实现会调用 malloc 和执行各种无用操作。一个简单的 printf 实现(不带浮点数或者打印浮点数时忽略精度问题),也不包含 POSIX i18n 的 %n$ 参数限定符,只需要约 2k 的代码便可实现。这样的实现使得调用应用程序可以更小、更简单,避免了将类似 printf 的功能无处不在地重复。 - R.. GitHub STOP HELPING ICE
4
正如Chris所说,嵌入式系统有很大的范围,通常像实时(有限时间操作)和无故障情况等条件比极小的内存更为重要。如果一个嵌入式设备使用1MB的内存但始终正常工作,因为我们知道内存分配的位置,我会感到更加满意,而不是一个“通常”使用128KB并具有256KB物理内存的设备,但对使用没有严格的限制,在分配失败时无法完成任务。 - R.. GitHub STOP HELPING ICE
1
"2K是巨大的"这取决于情况。我写过两个大约2K的RTOS。在那2K中实现的功能数量为一些令人惊叹的应用程序(其中一个是机器人技术)提供了支持。如果printf可以使我免于重新发明轮子的烦恼,那么你猜怎么着?我会使用它。时间就是金钱,滴答,滴答,滴答。而且,是的,我曾经使用过全部采用汇编语言的小型系统。 - Lloyd Sargent
显示剩余13条评论

3
我有类似的需求,发现klibc非常适合。唯一的缺点(商业使用)是发行版包含一些GPL许可文件,尽管大部分是BSD许可。我已经在这里砍掉了它的最小版本。
这比PDCLib还要有限,适用于只需要一些基本函数,如printf和strtok。包括所有函数的编译仅为4kB。

2
你可能想看看Embedded Artistry libc,它承诺是极简和经过充分测试的。它包括一个没有使用的printf()。免责声明:我没有使用过它,但它似乎结构良好且正在积极开发中。
最初的回答: 建议查看 Embedded Artistry libc,这是一个经过充分测试的精简库,其中包含一个不需要 malloc 的 printf() 函数。免责声明:我没有使用过它,但它似乎结构良好且有活跃的开发。

1

你可以查看 LGPL 的 µClibc,它被认为接近于 glibc,但更适用于嵌入式系统。

它还有一个页面引用其他开源的 C 库,包括 newlibeCos,这些库可能更适用于非 Linux 环境。


uClibc支持除了Linux以外的其他系统吗? - GT.
2
不行。请看我在原问题上的评论。 - R.. GitHub STOP HELPING ICE

-2

4
OP 显然没有使用 Linux,因此这些基于 Linux 的选择对他们并没有太大帮助。 - R.. GitHub STOP HELPING ICE

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接