English | 中文
Embedded libc,一个为嵌入式系统和裸机适配的libc库
- 低资源占用
- OpenSource
- Especially for RISC-V..
- 代码结构清晰易懂
- 可扩展
- 移植性强
├───arch -- 硬件相关的优化实现
├───crt -- 硬件相关的启动代码
├───include -- 头文件
│ └───sys -- 系统相关的头文件,引用方式一般为 <sys/head.h>
├───src -- 源文件
│ ├───internal -- 一些内部使用的头文件
│ ├───misc -- 杂项,存放单文件就能实现的模块
| ├───stdio -- 标准IO模块
│ └───stdlib -- 标准工具库模块
├───helloworld -- helloworld测试样例
| └───qemu -- qemu裸机测试代码
| └───qemu-device -- 具体到qemu虚拟机设备的相关脚本及头文件
├───mkconfigs -- 编译相关的make脚本
└───qemu -- qemu 配置
● mlibc 可以支持到多种嵌入式工具链,能够使用 gcc(arm/risc-v)、甚至 LLVM 等编译器
● 为小资源系统设计,完美地支持到一些嵌入式实时操作系统(RT-Thread等)和裸机
● 针对 risc-v 32/64 进行优化,能够适配主流的一些 RISC-V MCU
● 采用 make 和 scons 构建
● reserve
● 使用 QEMU/RISC-V 32GC 模拟主机方式,输出第一个 hello word(已完成)
● 针对裸机版本的 mlibc ,加入最基础的 crt.s,string,printf 函数(已完成)
● 基于此环境,完善 mlibc
windows下的环境配置教程:
通过这个教程我们就可以在 windows 环境下运行 RT-Thread 了。
我们进入rt-thread\bsp\qemu-vexpress-a9
文件夹,打开env,在命令行中输入menuconfig,进入配置界面
将DFS v2.0切换为DFS v1.0:
- RT-Thread Components
- DFS: device virtual file system
- The version of DFS (DFS v1.0)
- DFS: device virtual file system
下载mlibc软件包:
- RT-Thread online packages
- system packages
- 选中当前页面的倒数第六个选项:
mlibc: Embedded libc, especially for RISC-V
- 选中当前页面的倒数第六个选项:
- system packages
完成之后就可以退出配置页面然后在命令行输入scons -j12进行编译了。
不知道哪里下载源码的同学可以参考上面 windows 环境配置教程
进入rt-thread\bsp\stm32\stm32f407-rt-spark
目录,然后打开env,在命令行输入menuconfig,进入配置界面
开启文件系统(可选):
- Hardware Drivers Config
- Onboard Peripheral Drivers
- Enable File System
- Onboard Peripheral Drivers
开启fatfs(可选):
- RT-Thread Components
- DFS: device virtual file system
- Enable elm-chan fatfs
- elm-chan's FatFs, Generic FAT Filesystem Module
- 修改 Maximum sector size to be handled 为 4096
- Enable elm-chan fatfs
- DFS: device virtual file system
下载mlibc软件包:
- RT-Thread online packages
- system packages
- 选中当前页面的倒数第六个选项: mlibc: Embedded libc, especially for RISC-V
- system packages
make + qemu + 工具链
目前已经实现了五种qemu的裸机启动代码
qemu设备 | 硬件架构 | 工具链 |
---|---|---|
vexpress-a9 | arm | arm-none-eabi-gcc |
mps3-an536(要求最新的qemu版本) | arm | arm-none-eabi-gcc |
virt-aarch64 | aarch64 | aarch64-unknown-elf-gcc |
virt-riscv32 | riscv32 | riscv32-unknown-elf-gcc |
virt-riscv64 | riscv64 | riscv64-unknown-elf-gcc |
- 配置工具链对应的环境变量
Linux: 通过命令向 ~/.bashrc
文件中添加以下环境变量,YOUR_PATH_TO_TOOLCHAIN
替换为你对应的工具链路径
echo "" >> ~/.bashrc #追加一个空行 防止内容合并
echo "export MLIBC_TOOLCHAIN_CC='YOUR_PATH_TO_TOOLCHAIN'" >> ~/.bashrc
echo "export MLIBC_TOOLCHAIN_AR='YOUR_PATH_TO_TOOLCHAIN'" >> ~/.bashrc
source ~/.bashrc
Windows: 打开 PowellShell,YOUR_PATH_TO_TOOLCHAIN
替换为你对应的工具链路径
[System.Environment]::SetEnvironmentVariable("MLIBC_TOOLCHAIN_CC", "YOUR_PATH_TO_TOOLCHAIN", "User")
[System.Environment]::SetEnvironmentVariable("MLIBC_TOOLCHAIN_AR", "YOUR_PATH_TO_TOOLCHAIN", "User")
#:配置完后需要重启终端生效
- 进入
mlibc/helloworld/qemu/{qemu-device}
文件夹打开命令行
# 这里使用 qemu-vexpress-a9 举例
make QEMU_BOARD=qemu-vexpress-a9 ARCH=arm
执行完命令之后,mlibc/helloworld/qemu/qemu-vexpress-a9 文件夹下会生成一份可执行文件为 qemu-vexpress-a9.elf
- 运行对应文件夹下的脚本
qemu.bat
# 在命令行敲入下列命令
qemu.bat
各个虚拟环境对应的信息如下:
文件名 | 虚拟设备 | 切换命令 |
---|---|---|
qemu-vexpress-a9 | vexpress-a9 | make QEMU_BOARD=qemu-vexpress-a9 ARCH=arm |
qemu-mps3-an536 | mps3-an536 | make QEMU_BOARD=qemu-mps3-an536 ARCH=arm |
qemu-virt-aarch64 | virt-aarch64 | make QEMU_BOARD=qemu-virt-aarch64 ARCH=aarch64 |
qemu-virt-riscv32 | virt-riscv32 | make QEMU_BOARD=qemu-virt-riscv32 ARCH=riscv32 |
qemu-virt-riscv64 | virt-riscv64 | make QEMU_BOARD=qemu-virt-riscv64 ARCH=riscv64 |
对于单纯的c库编译来说,开发环境就简单一些了,具备make和对应工具链就可以
make + 工具链
- 配置工具链对应的环境变量 :请参考上一节的详细步骤)
编译c库
- 进入 mlibc 文件夹,打开命令行使用 make 编译静态库
# 这里使用 arm 架构的静态库举例
make mlibc ARCH=arm
- 然后会在 mlibc/build/arm 目录下生成一份静态库,文件名为
libmlibc.a
(防止与工具链中的libc.a撞名,便于测试),集成工具链时可以把文件名改为libc.a
进行使用
编译crt0
- 进入mlibc文件夹,打开命令行使用 make 编译 crt0
# 这里使用 arm 架构的 crt0 举例
make crt0 ARCH=arm
- 生成的文件在
mlibc/build/$(ARCH)/crtobj
中,文件名为crt0.o
-
How to
-
Fork 本仓库
-
新建 Feat_xxx 分支
-
提交代码
-
新建 Pull Request
-
mlibc完全开源,遵循MIT协议,允许商用和随意修改,可以放心使用,仅仅需要在软件中声明使用的是MIT协议,没有潜在的商业风险。