用于嵌入式系统的小型 libc [关闭]

Posted

技术标签:

【中文标题】用于嵌入式系统的小型 libc [关闭]【英文标题】:Small libc for embedded systems [closed] 【发布时间】:2011-06-22 17:38:48 【问题描述】:

我正在寻找一个小型 libc,用于在 ARM7 微控制器上与 freertos 一起使用。 我看过 newlib,但它对我的需要来说有点太复杂了。 Newlib 调用 malloc() 在 一些函数(例如 printf()),这对于小型嵌入式实时系统来说并不好。

有人知道适合我的应用程序的小型、可移植、开源的 libc 实现吗?

【问题讨论】:

您使用的是什么操作系统/内核?这是确定您的选择的关键。 我正在使用 freertos - freertos.org 【参考方案1】:

您可能想查看Embedded Artistry libc,它承诺最小且经过良好测试。它包括一个无 malloc 的printf()。免责声明:我没有使用过它,但它看起来结构良好且正在积极开发。

【讨论】:

【参考方案2】:

我也有类似的需求,发现klibc 非常适合。唯一的缺点(用于商业用途)是该发行版包含一些 GPL 许可的文件,尽管其中大部分是 BSD 许可的。我已经破解了它的最小版本here。

这比 PDCLib 更受限制,如果您只需要一些基本功能,例如 printf 和 strtok,则适用。编译到只有 4kB,包含所有功能。

【讨论】:

【参考方案3】:

PDCLib 可能满足您的需求。不过,它是still incomplete [broken link],可能需要更多的实际测试。它的作者在这里通过DevSolar SO。

2012 年 11 月 1 日更新: 自 2012 年 8 月 14 日起,开发工作已由 Owen Shepherd 接管,并配有 new homepage 和 bitbucket repository [断开的链接,请使用this one]

2015 年 10 月 31 日更新: 专用网站似乎已经死了,但仍然可以找到代码 on bitbucket。对该存储库的最后一次提交发生在 2014 年 11 月 24 日。

2016 年 7 月 12 日更新: 网站已备份,DevSolar 于 2016 年 3 月 1 日再次开始提交。

【讨论】:

该页面似乎指向pdclib.e43.eu 以进行当前开发。它充满了死链接,似乎没有说明可能的操作系统/硬件要求/支持。 @XTL:posix 和 win32 都存在platform overlays,该项目的目标之一是易于移植(参见原作者写的事后分析:他将其开发为为爱好 OS 社区服务);不知道这在实践中是如何工作的......【参考方案4】:

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

【讨论】:

【参考方案5】:

我在具有 32kB RAM 的 Cortex_M3 上使用 newlib,要消除 malloc(),您可以使用 siprintf()sniprintf()

专业人士:不再拨打malloc()

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

【讨论】:

【参考方案6】:

printf() 不适用于小型嵌入式实时系统!

实际上它在很多方面都比 malloc 差。可变参数列表、非常复杂的格式、不需要时的浮点数支持等。 printf() 会带来巨大的开销,编译器将无法减少它,因为传递给它的每个参数都在运行时。

printf() 对于仍在学习 C 的业余爱好者和初学者来说可能没问题。但如果你是一名专业程序员,你真的应该编写自己的串行监视器/LCD 例程。您将显着提高程序性能和闪存消耗。

【讨论】:

虽然技术上不是答案,但我喜欢它。 @Lundin:如果 printf() 可以解决手头的问题,我认为使用它没有问题。为了遵循您的逻辑,您不应该在 c 中编写代码,因为汇编需要更少的闪存并且执行得更快。哎呀,你为什么还要使用微控制器,纯 ASIC 会更高效,并且需要更少的闪存 ;-) 在嵌入式系统中使用printf 没有任何问题。 printf 调用 malloc 并做各种无用的事情的实现有问题。一个没有浮点的简单printf 实现(或者在打印浮点时忽略准确性问题)并且没有POSIX i18n %n$ 参数说明符,可以在大约2k 的代码中实现,并允许调用应用程序更小更简单而不是必须在整个地方复制printf-like 功能。 "Printf 没有任何问题..." /--" "...可以在大约 2k 的代码中实现"。您显然没有使用过小型微控制器应用程序。2k 是巨大的。而且如果你连一个简单的 RS-232 串行监视器都不能自己编写来代替 printf(),那么你一开始就不应该对嵌入式系统进行编程。 @Lundin:正如 Chris 所说,嵌入式系统的范围很广,并且经常出现 realtime(限时操作)和 failure-case-free 等条件 比极小的内存大小更重要。对于使用 1 MB 内存但始终工作的嵌入式设备,我会更满意,因为我知道分配发生在哪里,而不是“通常”使用 128 kB 并具有 256 kB 物理内存但没有严格限制的设备分配失败时无法完成其工作。【参考方案7】:

您可以查看 LGPL µClibc,它应该接近 glibc,但更适合嵌入式系统。

它还有一个 page 引用其他开源 C 库,包括 newlib 和 eCos,它们可能更适合非 Linux 环境。

【讨论】:

uClibc 是否支持除 linux 之外的任何东西? 不。请参阅我对原始问题的评论。【参考方案8】:

也许看看uClibc 和EGLIBC。

【讨论】:

OP 显然没有使用 Linux,所以这些基于 Linux 的选择不会很有帮助..

以上是关于用于嵌入式系统的小型 libc [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

基于FS4412嵌入式系统移植 glib库的交叉编译与移植

有人可以为嵌入式项目建议一个小型Flash文件系统

微型的操作系统都有哪些各有啥特点?

RTOS 和嵌入式 Linux 有啥区别? [关闭]

专门用于小型数据且几乎没有写入的嵌入式数据库?

MATLAB:嵌入式系统的范围是啥[关闭]