C 标准库 链接到标题

Zephyr 提供了几种 C 标准库供用户使用:

  • 通用 C 库
  • Minimal libc
  • Newlib
  • Picolib

通用 C 库 链接到标题

通用 C 库并不是完整的 C 标准库,它提供一些 C 库函数与其它 C 标准库结合使用,主要是为了应对:

  1. 提供其它 C 标准库没有的功能
  2. 替换其它 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