openEuler RISC-V 上使用 MICA 对 MilkV-Duo 小核管理
演示视频效果
此处无法放置过大的gif 图,给出链接,进入可直接看到效果图
项目介绍
MICA
- 介绍 : 在一颗片上系统中部署多个OS,同时提供Linux的服务管理能力以及实时OS带来的高实时、高可靠的关键能力。
- 仓库链接 : mcs: The linux side's codes of openeuler embedded's mixed criticality system related feature
- 在 MilkV-Duo 上适配修改过的仓库链接 : mcs: The linux side's codes of openeuler embedded's mixed criticality system related feature
- 作用 : 在 Linux 上 提供管理小核生命周期以及和小核交流
UniProton
- 介绍 : UniProton 是一款实时操作系统,具备极致的低时延和灵活的混合关键性部署特性,可以适用于工业控制场景,既支持微控制器 MCU,也支持算力强的多核 CPU。
- 仓库链接 : UniProton: A lightweight real-time operating system
- 在 MilkV-Duo 上适配修改过的仓库链接 : UniProton: A lightweight real-time operating system
- 作用 : 在 MIlkV-Duo 小核上运行,并和 MilkV-Duo 大核 Linux 交流通信
SD 卡镜像烧录
1. 镜像烧录,开箱即用
我事先准备好了可以直接烧录的镜像,镜像里面跑的是 大核 openEuler RISC-V 2303 , 小核 UniProton , 可以直接使用 mica 对小核进行管理,也可以对小核镜像进行热更新
需要准备的硬件
-
MilkV-Duo 硬件 (64M)
-
至少 16G 的 SD卡
-
读卡器
需要准备的软件
- Ubuntu 或其他发行版
- oe2303 + uniproton 镜像
烧录流程
- 根据提供的链接,下载镜像
- 使用
gunzip path2img/oe2303_uniproton.img.gz
解压镜像,得到oe2303_uniproton.img
- 将 SD 卡插入读卡器一端,再将读卡器插入到电脑的 USB 卡槽 [此处电脑是 Ubuntu 或 其他发行版]
- 使用
lsblk
查看是否正确识别到 SD 卡 , 比如/dev/sda
- 使用
sudo dd if=oe2303_uniproton.img of=/dev/sda bs=1M status=progress
烧录到 SD 卡中 - 烧录成功后,直接插入 MilkV-Duo 的 SD 卡槽,开机启动即可。
- 登陆系统
- 用户名 : root
- 密码 : openEuler12#$
- 注意 :RNDIS可能不可用,因此建议使用UART连接。
2. SDK编译,自DIY
MICA 的运行并不一定需要 openEuler , 只要能够解决 mica 的软件依赖 libsysfs, libmetal, libopenamp 即可在其他发行版上运行 MICA , 此前已经有很多社区的伙伴在 MilkV-Duo 上运行过其他的发行版
- 下面给出编译烧录openEuler 2303 + UniProton 的步骤 [ 下面的步骤参考了社区运行MilkV-Duo on openEuler 的案例,在此致谢!!]
-
下载 sdk [魔改后的版本]
git clone https://github.com/openeuler-riscv/duo-buildroot-sdk.git cd duo-buildroot-sdk/
-
编译烧录出镜像
docker run -itd --name duodocker -v $(pwd):/home/work milkvtech/milkv-duo:latest /bin/bash docker exec -it duodocker /bin/bash -c "cd /home/work && cat /etc/issue && ./build.sh milkv-duo"
-
拷贝镜像
cd .. cp duo-buildroot-sdk/out/milkv-duo-yyyyMMdd-hhmm.img .
-
烧录镜像
sudo dd if=milkv-duo-yyyyMMdd-hhmm.img of=/dev/your-device bs=1M status=progress
-
准备替换根文件系统。由于原始镜像的根文件系统空间不足,需要重新分区。由于我们不会使用原始的根文件系统,因此简单地删除原始分区即可。
sudo fdisk /dev/your-device # In fdisk d 3 d 2 n p 2 w # In bash sudo mkfs.ext4 /dev/your-device-p2
-
从这里下载已经带有 MICA 和 UniProton 的 openEuler 2303 的根文件系统
-
将 SD 卡的第二个分区挂到一个目录上并解压根文件系统到该目录
mkdir mnt sudo mount /dev/your-device-p2 mnt sudo tar -zxvf /path/to/oe2303_uniproton_rootfs.tar.gz -C mnt
-
取消挂载,拔出 SD 卡 ,安装到 MilkV-Duo上
sudo umount mnt
-
登陆系统
- 用户名 : root
- 密码 : openEuler12#$
- 注意 :RNDIS可能不可用,因此建议使用UART连接。
再给出在其他发行版上使用 MICA 的大体步骤:
- 根据 社区支持 基于改动过的 sdk [上文有链接] 成功运行 其他发行版 [其中 sdk 主要是提供 mica 需要的驱动模块,修改了相关的设备树 ]
- 根据对应发行版的包管理工具自行下载 libsysfs, libmetal, libopenamp 或者自己根据源码编译
- 根据 MICA README 文档编译 MICA 项目, 能够在 Duo 上适配的 MICA 项目在这里 [链接在上文项目介绍中]
- 体验 MICA
使用 MICA 管理小核
小核生命周期管理,小核热插拔、热更新
-
首先抑制内核日志的打印等级,防止内核信息打印到屏幕上 , 导致信息错乱
echo "1 4 1 7" > /proc/sys/kernel/printk
-
检查 Client OS 的状态 , 这里可以观察到 Client OS 的状态和名字
mica status
-
启动 Client OS , 可以看到 uniproton 输出的一些日志信息 [如果不想要,自己可以后续热更新小核镜像的时候去掉就好了]
mica start uniproton
-
关闭 Client OS
mica stop uniproton
小核tty service
-
在执行
mica status
的时候,可以看到 Client OS 绑定的服务 , 比如 可能会绑定 tty service 到/dev/ttyRPMSG1
设备上 -
可以执行 screen 打开 Client OS 的 shell
screen /dev/ttyRPMSG0
-
体验 Client OS [UniProton] 的shell
小核 rpc service
- 暂未支持 【 TODO 会在完成支持后对这部分文档进行完善 】
添加自己的 service
- 详情请见项目 UniProton [上文有链接] 和 项目 MICA [上文有链接]【 TODO 会在上游仓库的 PR 合入后对这部分的文档进行完善 】
在线热更新小核镜像
- 小核镜像在
/lib/firmware/milkvduo_uniproton.elf
- 小核开发详情请见 UniProton [上文有链接]【 TODO 在上游支持的 PR 合入后对这部分的文档进行完善 】