在嵌入式场景中,虽然 linux 已经得到了广泛应用,但并不能覆盖所有需求,例如高实时、高可靠、高安全的场合。
这些场合往往是实时操作系统的用武之地。
有些应用场景既需要 linux 的管理能力、丰富的生态,又需要实时操作系统的高实时、高可靠、高安全。
一种典型的设计是采用一颗性能较强的处理器运行 linux 负责富功能,一颗微控制器/dsp/实时处理器运行实时操作系统负责实时控制或者信号处理,两者之间通过 i/o、网络或片外总线的形式通信。
这种方式存在的问题是:
硬件上需要两套系统、集成度不高,通信受限于片外物理机制的限制(如速度、时延等),软件上 linux 和实时操作系统两者之间是割裂的,在灵活性上、可维护性上存在改进空间。
得益于集成电路技术与制造工艺的快速发展,嵌入式处理器硬件性能越来越强大。单核能力不断提升,单核正在向多核、异构多核乃至众核的方向演进,使得在一个片上系统(soc)中部署多个 os 具备了坚实的基础。
同时,受应用需求的推动,如物联网化、智能化、功能安全与信息安全的整合,嵌入式软件系统也越发复杂,由单一 os 承载所有功能所面临的挑战越来越大。解决方式之一就是不同系统负责各自所擅长的功能,如 openharmony 负责 ui、linux 负责网络通信与管理、实时操作系统负责高实时与高可靠等,而且整个方案还要易于开发、部署、扩展,目前实现的形式可以是容器和虚拟化等技术。
面对上述硬件和应用的变化,openatom openeuler(简称"openeuler") embedded 提出了多 os 混合关键性部署框架(mixed criticality,mica),能够实现多 os 高效混合部署,各尽其才,各取所需,满足嵌入式系统以功能、实时、功耗为代表的多目标约束。通过 mica,实现 soc 上融合部署、管理、协同多个 rtos 能力。

1. 生命周期管理:针对不同的底座、架构提供统一的生命周期管理框架。
2. 跨 os 通信:提供基于共享内存的、无锁的高效可扩展的通信机制,支持软、硬件多种实现方式。
3. 服务化框架:定义跨os服务的注册管理框架,支持 tty 服务、gdb 服务、代理服务等。

mica 引入了开源框架 openamp 作为基础,并结合自身需要进一步创新。

在上述架构中,virtio-rpmsg 相当于网络协议中的 mac 层,提供高效的底层通信机制,rpmsg 相当于网络协议中的传输层,提供了基于端点(endpoint)与通道(channel)抽象的通信机制,remoteproc 提供不同南向底座的生命周期管理功能,包括初始化、启动、暂停、结束等。
1. 内核模块:
提供 rtos 启动、专用中断收发、保留内存管理等功能。不同的部署模式会有对应的内核态实现,例如 bare-metal 部署模式,对应的内核模块是 mcs_km.ko。
2. micad:
mica 的守护进程。负责管理和控制 rtos 实例的创建、运行及销毁。micad 监听来自于 mica 命令行工具的调用,并根据这些调用执行相应的操作。此外,micad 还负责不同实例上的服务注册等功能。
3. mica:
mica 的命令行工具。可以使用 mica 命令根据配置文件来创建、启动、停止 rtos 实例,并且能够查看实例的状态和关联的服务信息。
下面介绍下基于 openeuler embedded 树莓派4b的混合部署镜像介绍 mica 的使用流程。
下载树莓派4b的混合部署镜像[1],并按照树莓派 uefi 启动指导[2]完成镜像的烧录和启动。
镜像启动时默认会根据 /etc/mica/rpi4-uniproton.conf 创建 client os 实例。可通过 mica status 查看该实例状态:
raspberrypi4-64:~$ mica status
name assigned cpu state service
uniproton 3 offline
可以看到默认创建了一个 uniproton 实例,关联的 cpu id 为 3,状态为 offline。
通过 mica start <name>
启动实例:
raspberrypi4-64:~$ mica start uniproton
starting uniproton...
start uniproton successfully!
启动成功后,执行 mica status 查询状态及服务:
raspberrypi4-64:~$ mica status
name assigned cpu state service
uniproton 3 running rpmsg-tty(/dev/ttyrpmsg0) rpmsg-rpc
状态更新为 running,并且能观察到该实例提供了两个服务:rpmsg-tty 以及 rpmsg-rpc。可以通过 screen /dev/ttyrpmsg0 打开 tty 设备来测试与 uniproton 的通信:
raspberrypi4-64:~$ screen /dev/ttyrpmsg0
hello, uniproton! recv: c
之后,可以通过 ctrl-a k 或 ctrl-a ctrl-k 组合键退出 shell,可参考 linux 使用手册-default key bindings 章节[3]。
通过 mica stop <name>
停止实例:
raspberrypi4-64:~$ mica stop uniproton
stopping uniproton...
stop uniproton successfully!
raspberrypi4-64:~$ mica status
name assigned cpu state service
uniproton 3 offline
raspberrypi4-64:~$ mica rm uniproton
removing uniproton...
rm uniproton successfully!
raspberrypi4-64:~$ mica status
name assigned cpu state service
销毁实例后,可以执行 mica create rpi4-uniproton.conf 重新创建实例。
文中所述的特性支持,由 embedded sig 参与,相关源码均已在 openeuler 社区开源,可以参考下方链接进一步了解[4][5][6]。如果您对相关技术感兴趣,欢迎您的参加和加入。您可以添加小助手微信,加入 sig embedded 微信群。

[1] 树莓派 4b 的混合部署镜像下载地址:https://mirror.sjtu.edu.cn/openeuler/openeuler-24.03-lts/embedded_img/aarch64/raspberrypi4-64-rt-hmi-mcs/
[2] 树莓派 uefi 启动指导:
https://yocto-meta-openeuler.pages.openeuler.org/master/bsp/arm64/raspberrypi4/uefi.html#raspberrypi4-uefi-guide
[3] linux 使用手册-default key bindings 章节:
https://man7.org/linux/man-pages/man1/screen.1.html#default_key_bindings
[4]openeuler embedded 多 os 混合关键性部署框架介绍:
h
ttps://yocto-meta-openeuler.pages.openeuler.org/master/features/mica/index.html
[5] 在 arm64 qemu 上运行 mica:
https://yocto-meta-openeuler.pages.openeuler.org/master/features/mica/instruction.html#arm64-qemu
[6] mcs 代码仓库:
https://gitee.com/openeuler/mcs
发表评论