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

embedded/2024/10/22 15:32:48/

背景

在嵌入式场景中,虽然 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 多 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 查看该实例状态:

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 重新创建实例。

加入我们

文中所述的特性支持,由 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


http://www.ppmy.cn/embedded/86708.html

相关文章

Boost搜索引擎:关键词搜索模块的构建

关键词搜索模块是基于索引构建模块编写的。 搜索模块&#xff1a; 搜索模块是在服务器构建索引之后进行的&#xff0c;在构建好的索引的服务器上进行关键词搜索。 首先将用户提供的搜索内容进行&#xff0c;关键词分割&#xff0c;将分割好的关键词存放到一个数组中&#xf…

爬职业热度--兼职cat

免责声明:本文仅做技术交流与学习...请勿不正当使用... 循环页数爬取 import pandas as pd import requests from lxml import etree # 初始化一个空的 DataFrame df pd.DataFrame() data_list []headers {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Wi…

(数据结构)二叉树

1.树型结构 1.1.概念 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限节点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树&#xff0c;也就是说它是根朝上&#xff0c;而叶朝下的。它具有以下的特点&#xff1a; 有…

xLua | xLua Framework | 1 打包

0. 热更新做什么 1、资源 热更资源和热更步骤&#xff08;Bundle&#xff09; 2、代码 Lua与C#的交互&#xff08;xLua&#xff09; 3、框架开发流程第一阶段&#xff1a;Bundle处理 构建&#xff1b;加载&#xff1b;更新第二阶段&#xff1a;C#调用Lua Lua加载与管理 Lua绑…

JMeter接口测试:测试中奖概率!

介绍 Apache JMeter 是 Apache 组织基于 Java 开发的压力测试工具&#xff0c;用于对软件做压力测试。JMeter 最初被设计用于 Web 应用测试&#xff0c;但后来扩展到了其他测试领域&#xff0c;可用于测试静态和动态资源&#xff0c;如静态文件、Java 小服务程序、CGI 脚本、J…

linux mysql 添加环境变量

要在Linux上添加MySQL的环境变量&#xff0c;可以按照以下步骤进行操作&#xff1a;打开终端窗口。使用文本编辑器&#xff08;如vi或nano&#xff09;打开~/.bashrc文件&#xff1a;vi ~/.bashrc或nano ~/.bashrc在文件的末尾添加以下内容&#xff1a;export PATH$PATH:/path/…

Spring Boot 项目中使用事件发布和监听来实现消息推送和处理

对于在 Spring Boot 项目内部不同函数间或不同线程间的消息推送和处理机制&#xff0c;您可以使用 Spring 内置的事件发布/订阅机制。这种机制允许不同组件之间异步通信&#xff0c;而不需要它们彼此直接依赖。 以下是一个示例&#xff0c;展示了如何在 Spring Boot 项目中使用…

elementplus菜单组件的那些事

在使用 elementplus 的菜单组件时&#xff0c;我发现有很多东西是官方没有提到但是需要注意的点 1. 菜单组件右侧会有一个边框 设置css .el-menu {border: 0 !important; } 2. 使用其他的 icon 文字内容一定要写在 这个 名字为 title 的插槽中 <el-menu-itemv-for"it…