用于嵌入式系统的小型 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()
。
缺点:它不支持 float 和 double 格式,而且这种方式不是真正可移植的。
【讨论】:
【参考方案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 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章