哈啰大家好,
最近给 Duo 和 Duo S 的小核移植了 Zephyr RTOS,分享给大家!
仓库地址:GitHub - xingrz/zephyr at milkv-duo/hwmv2/dev
相对于 FreeRTOS,Zephyr 的优势
- 支持 Windows/Linux/macOS 三大平台的开发环境
- 自带了非常多经典 IP、外设(如屏幕和摄像头)的驱动,不需要重复发明轮子
- 内核/驱动/板级配置与用户代码分层,API 一致,让业务真正平台无关,方便移植
支持的特性
- Mailbox
- PINMUX
- GPIO
- PWM
- UART
上手
1. 环境搭建
参考 Getting Started Guide — Zephyr Project Documentation
2. 拉取代码
# 初始化一个目录作为工作区,此处以 ~/zephyrproject 举例
west init ~/zephyrproject -m https://github.com/xingrz/zephyr.git --mr milkv-duo/hwmv2/dev
cd ~/zephyrproject/zephyr
west update
3. 编译
此处以 Duo 为例编译一个 blinky 示例。Duo S 把下面的 milkv_duo
换成 milkv_duos
即可。
west build -s samples/basic/blinky -p -b milkv_duo
该示例会以 1s 间隔闪烁 Duo 开发板上的 LED。因此你需要删除 Linux 下面的 /mnt/system/blink.sh
才能使它生效。
4. 启动
第一步:从官方的 duo-buildroot-sdk 构建出 TF 卡镜像。
注意:因为 Zephyr 这边也实现了 PINMUX 驱动,引脚复用可能会被之后启动的 U-Boot 覆盖,因此如果需要以 Zephyr 里设置 PINMUX 为准的话,则需要删除 U-Boot 里对应的设置(位于 build/boards/cv180x/cv1800b_milkv_duo_sd/u-boot/cvi_board_init.c
);如果以 U-Boot 为准,则需要更改 Zephyr boards/milkv/duo/milkv_duo.dts
里对应的 pinctrl
节点。
第二步:将官方镜像中的 FreeRTOS 替换为 Zephyr,重新打包一个 fip.bin
python3 /path/to/duo-buildroot-sdk/fsbl/plat/cv180x/fiptool.py \
-v genfip "/path/to/new/fip.bin" \
--OLD_FIP="/path/to/old/fip.bin" \
--BLCP_2ND="build/zephyr/zephyr.bin"
将生成的 fip.bin
替换到 SD 卡里即可。
第三步:擦电,开机!
5. 日志打印
Duo 上默认使用 UART1 (GP0) 打印日志,Duo S 上默认使用 UART2 (B11) 打印日志。
谢谢大家, 欢迎交流!