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

背景

在嵌入式场景中,虽然 Linux 已经得到了广泛应用,但并不能覆盖所有需求,例如高实时、高可靠、高安全的场合。这些场合往往是实时操作系统的用武之地。有些应用场景既需要 Linux 的管理能力、丰富的生态,又需要实时操作系统的高实时、高可靠、高安全。一种典型的设计是采用一颗性能较强的处理器运行 Linux 负责富功能,一颗微控制器/DSP/实时处理器运行实时操作系统负责实时控制或者信号处理,两者之间通过 I/O、网络或片外总线的形式通信。这种方式存在的问题是:硬件上需要两套系统、集成度不高,通信受限于片外物理机制的限制(如速度、时延等),软件上 Linux 和实时操作系统两者之间是割裂的,在灵活性上、可维护性上存在改进空间。

得益于集成电路技术与制造工艺的快速发展,嵌入式处理器硬件性能越来越强大。单核能力不断提升,单核正在向多核、异构多核乃至众核的方向演进,使得在一个片上系统(SoC)中部署多个 OS 具备了坚实的基础。

同时,受应用需求的推动,如物联网化、智能化、功能安全与信息安全的整合,嵌入式软件系统也越发复杂,由单一 OS 承载所有功能所面临的挑战越来越大。解决方式之一就是不同系统负责各自所擅长的功能,如 OpenHarmony 负责 UI、Linux 负责网络通信与管理、实时操作系统负责高实时与高可靠等,而且整个方案还要易于开发、部署、扩展,目前实现的形式可以是容器和虚拟化等技术。

面对上述硬件和应用的变化,OpenAtom openEuler(简称"openEuler") Embedded 提出了多 OS 混合关键性部署框架(MI xed C riticA lity,MICA),能够实现多 OS 高效混合部署,各尽其才,各取所需,满足嵌入式系统以功能、实时、功耗为代表的多目标约束。通过 MICA,实现 SoC 上融合部署、管理、协同多个 RTOS 能力。

图1 多 OS 混合部署框架

MICA 框架设计

MICA 主要包含以下功能:

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

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

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

图2 MICA 功能沙盘

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

图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 查看该实例状态:

bash 复制代码
raspberrypi4-64:~$ mica status
Name          Assigned CPU      State          Service
uniproton     3                 Offline

可以看到默认创建了一个 uniproton 实例,关联的 CPU ID 为 3,状态为 Offline。

通过 mica start <Name> 启动实例:

bash 复制代码
raspberrypi4-64:~$ mica start uniproton
starting uniproton...
start uniproton successfully!

启动成功后,执行 mica status 查询状态及服务:​​​​​​​

bash 复制代码
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 的通信:

bash 复制代码
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> 停止实例:

bash 复制代码
raspberrypi4-64:~$ mica stop uniproton
stopping uniproton...
stop uniproton successfully!
raspberrypi4-64:~$ mica status
Name          Assigned CPU      State          Service
uniproton     3                 Offline

4. 销毁 RTOS

bash 复制代码
raspberrypi4-64:~$ mica rm uniproton
removing uniproton...
rm uniproton successfully!
raspberrypi4-64:~$ mica status
Name          Assigned CPU      State          Service

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

bash 复制代码
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]。如果您对相关技术感兴趣,欢迎您的参加和加入。您可以添加小助手vx:openeuler123,加入 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 混合关键性部署框架介绍: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

相关推荐
清灵xmf几秒前
揭开 Vue 3 中大量使用 ref 的隐藏危机
前端·javascript·vue.js·ref
su1ka1116 分钟前
re题(35)BUUCTF-[FlareOn4]IgniteMe
前端
测试界柠檬7 分钟前
面试真题 | web自动化关闭浏览器,quit()和close()的区别
前端·自动化测试·软件测试·功能测试·程序人生·面试·自动化
多多*8 分钟前
OJ在线评测系统 登录页面开发 前端后端联调实现全栈开发
linux·服务器·前端·ubuntu·docker·前端框架
2301_801074159 分钟前
TypeScript异常处理
前端·javascript·typescript
小阿飞_10 分钟前
报错合计-1
前端
caperxi11 分钟前
前端开发中的防抖与节流
前端·javascript·html
霸气小男12 分钟前
react + antDesign封装图片预览组件(支持多张图片)
前端·react.js
susu108301891112 分钟前
前端css样式覆盖
前端·css
学习路上的小刘14 分钟前
vue h5 蓝牙连接 webBluetooth API
前端·javascript·vue.js