站点图标 CNX中文站

嵌入式系统的轻量级C库—PicoLibC

2019年9月底,知名开发者 Keith Packard通过他的博客宣布推出了“picolibc”。Picolibc 是一种适用于小型微控制器嵌入式系统的C标准库,该库的API甚至允许在低内存 (RAM) 设备中运行。picolibc其实是“newlib-nano”的升级版本,这个升级版本有一些有趣的变化,比如:用从avrlibc采用 ATMEL 特定的 printf 代码替换“stdio”库。作为这个库的一部分,Keith 还推出了 picocrt,它负责在调用自己的 C 程序主函数之前初始化内存和调用各种构造函数。

特征

开始使用 picolibc

Picolibc 使用meson构建系统在 GCC 的 Linux 主机上为各种硬件平台编译源代码树。除了默认参数外,该库还允许构建多个属性,通过使用属性行“-D=”来启用和禁用各种功能。

即使 Picolibc 在来自 avrlibc 的小型 stdio 库上运行,用户也可以选择使用属性 (newlib-tinystdio=false) 来启用旧的 newlibc stdio 库。默认情况下,它会是 newlib-tinystdio=true,这意味着它将使用基于 avrlibc 的小型 stdio 进行编译。

在开始构建 picolibc 之前,你们记得要确保meson构建系统是构建环境的一部分,具体请参阅meson设置说明

作为meson标准,交叉编译构建的所有构建配置都是单独配置文件的一部分,也是源代码树的一部分。下面是各种构建环境的示例配置文件。

RISC-V 的配置文件(cross-riscv32 -unknown -elf.txt)

使用meson编译 picolibc 源代码树

源码树本身提供了用于各种架构的配置脚本,包括riscv、arm、x86等。下面是我列出的针对 arm的示例编译脚本。


一旦你们准备好meson和所需的交叉编译器 gcc lib 环境,请按照以下步骤构建具有特定目标(用于 arm)的 picolibc。我的测试构建环境是 ubuntu 18.04。

安装meson

安装交叉编译器 GCC(用于arm)

编译和构建 picolibc


成功构建后,你们可以通过在构建文件夹的“test”目录中运行 printf 和 scanf 的示例测试用例应用程序进行验证。

Picolibc 代码编译过程

Picolibc 使用GCC.spec文件来编译源代码,这会使得设置系统头文件的路径和链接器指向 Picolibc。下面是编译单个文件并生成 a.o 文件的示例:

Picocrt (picolibc.specs)—启动代码

Picocrt 是 picolib 的一部分,名为 crt0.o,在使用 -specs= picolibc.specs时默认是启用的。Picocrt 启用初始化步骤,包括如下

小标题:参考

分享这篇文章
退出移动版