C 标准库 链接到标题
Zephyr 提供了几种 C 标准库供用户使用:
- 通用 C 库
- Minimal libc
- Newlib
- Picolib
通用 C 库 链接到标题
通用 C 库并不是完整的 C 标准库,它提供一些 C 库函数与其它 C 标准库结合使用,主要是为了应对:
- 提供其它 C 标准库没有的功能
- 替换其它 C 库中的功能为更适合在 Zephyr 环境中使用的代码
代码实现在
zephyr/lib/libc/common
,主要有:
time
strnlen
abort
- 动态内存管理,
malloc
相关函数,基于 sys_heap 进行内存管理。
sys_heap 参考 Zephyr 内存管理之 Heap
Minimal libc 链接到标题
3.5.0 之前 Minimal libc 是作为 Zephyr 默认的标准 C 库,在 Zephyr 中 Minimal libc 实现了 ISO/IEC 9899:2011 标准 C 库函数的最小子集,满足 Zephyr 编码指南规则 A.4 定义的 Zephyr 内核需求。
该库包装 cbprintf()
函数实现格式化输出。参考Zephyr 格式化输出-cbprintf
该库使用通用 C 库的动态内存管理。
该库定义了自己的 erron.h,但尽量和 posix 的保持一致。
Newlib 链接到标题
Newlib 是为嵌入式系统编写的完整 C 库实现。它是一个单独的开源项目,不以源代码的形式出现的 Zephyr 中,而是编译成 libc.a 和 libm.a 打包进 Zephyr SDK, 在 SDK 中每种架构都有自己的 libc.a 和 libm.a。
Zephyr 中 zephyr/lib/libc/newlib/libc-hooks.c
文件实现了 Newlib 标准库函数要求的钩子函数,提供了以下钩子的实现:
- 堆管理
- open/close/read/write ….
- lock
- time
- stdin/stdout
- errno
Newlib 提供两种库:
- CONFIG_NEWLIB_LIBC : 完整的 Newlib 库
- CONFIG_NEWLIB_LIBC_NANO : Nano Newlib 库 libc_nano.a, libm_nano.a
Newlib nano 变体 ( libc_nano.a 和 libm_nano.a ) 是 Newlib 优化尺寸的版本,其支持完整变体支持的所有功能。
注意,Newlib nano 变体并非适用于所有架构。nano 变体的可用性由 CONFIG_HAS_NEWLIB_LIBC_NANO 指定, 你使用 SOC 的架构是否有 nano Newlib 可以通过该配置项搜索。
Newlib 使用自己动态内存管理算法,通过堆管理的钩子函数对内存进行动态分配管理。
Picolib 链接到标题
Picolibc 是为嵌入式系统编写的完整 C 库实现,面向 C17 ( ISO/IEC 9899:2018 ) 和 POSIX 2018 ( IEEE Std 1003.1-2017 ) 标准。Picolibc 是一个外部开源项目,它既可以作为模块提供给 Zephyr,同时 Zephyr SDK 也为每个支持的架构预编译了 Picolib 库。
从 v3.5.0 开始 Picolib 被作为 Zephyr 默认的标准 C 库。
Zephyr 中 zephyr/lib/libc/picolib/libc-hooks.c
文件实现了 Newlib 标准库函数要求的钩子函数,提供了以下钩子的实现:
- lock
- stdin/stdout
- errno
当配置使用 Picolib 时,动态内存管理使用通用 C 库下的实现。
第三方工具链 链接到标题
Zephyr 支持第三方工具链,一些第三方工具链有自己的标准 C 库需要 Zephyr 为其实现钩子函数:
- Arm Compiler 6: 钩子函数实现在 zephyr/lib/libc/armstdc
- DesignWare ARC MetaWare Development Toolkit ( MWDT ) : 钩子函数实现在
zephyr/lib/libc/arcmwdt
参考 链接到标题
https://docs.zephyrproject.org/3.5.0/develop/languages/c/index.html#standard-library