背景

在嵌入式场景中,虽然 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 能力。

MICA:面向复杂嵌入式系统的混合关键性部署框架_html

图1 多 OS 混合部署框架

MICA 框架设计

MICA 主要包含以下功能:

1. 生命周期管理:针对不同的底座、架构提供统一的生命周期管理框架。

2. 跨 OS 通信:提供基于共享内存的、无锁的高效可扩展的通信机制,支持软、硬件多种实现方式。

3. 服务化框架:定义跨OS服务的注册管理框架,支持 tty 服务、gdb 服务、代理服务等。

MICA:面向复杂嵌入式系统的混合关键性部署框架_实时操作系统_02

图2 MICA 功能沙盘

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

MICA:面向复杂嵌入式系统的混合关键性部署框架_html_03

图3 MICA 架构

在上述架构中,virtio-rpmsg 相当于网络协议中的 MAC 层,提供高效的底层通信机制,rpmsg 相当于网络协议中的传输层,提供了基于端点(endpoint)与通道(channel)抽象的通信机制,remoteproc 提供不同南向底座的生命周期管理功能,包括初始化、启动、暂停、结束等。

MICA 使用指导

MICA 主要包含三部分组件:

1. 内核模块:提供 RTOS 启动、专用中断收发、保留内存管理等功能。不同的部署模式会有对应的内核态实现,例如 bare-metal 部署模式,对应的内核模块是 mcs_km.ko。

2. micad:MICA 的守护进程。负责管理和控制 RTOS 实例的创建、运行及销毁。micad 监听来自于 mica 命令行工具的调用,并根据这些调用执行相应的操作。此外,micad 还负责不同实例上的服务注册等功能。

3. mica:MICA 的命令行工具。可以使用 mica 命令根据配置文件来创建、启动、停止 RTOS 实例,并且能够查看实例的状态和关联的服务信息。

下面介绍下基于 openEuler Embedded 树莓派4B的混合部署镜像介绍 MICA 的使用流程。

1. 镜像准备

下载树莓派4B的混合部署镜像[1],并按照树莓派 UEFI 启动指导[2]完成镜像的烧录和启动。

2. 部署 RTOS

镜像启动时默认会根据 /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
# 回车后可以连上 UniProton
# UniProton 接收到终端键入的字符后,会转发回 Linux 并回显
# 例如,键入字符 C
Hello, UniProton! Recv: C

之后,可以通过 Ctrl-a k 或 Ctrl-a Ctrl-k 组合键退出 shell,可参考 Linux 使用手册-DEFAULT KEY BINDINGS 章节[3]。

3. 停止 RTOS

通过 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

4. 销毁 RTOS

raspberrypi4-64:~$ mica rm uniproton
removing uniproton...
rm uniproton successfully!
raspberrypi4-64:~$ mica status
Name          Assigned CPU      State          Service

通过 mica rm <Name>  销毁实例:

raspberrypi4-64:~$ mica rm uniproton
removing uniproton...
rm uniproton successfully!
raspberrypi4-64:~$ mica status
Name          Assigned CPU      State          Service

销毁实例后,可以执行 mica create rpi4-uniproton.conf 重新创建实例。

参考资料

[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 混合关键性部署框架介绍:https://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