S100的MCU侧四个物理核如何充分利用起来?
目前架构为1× DCLS, 1× Split-Lock,其中1× Split-Lock已明确表示可以拆分为两个独立核进行使用,若使MCU1的两个核分别运行FreeRTOS系统,是否存在可行性,难度如何,地瓜技术支持是否可以帮助实现该目标;其二1× DCLS由MCU0运行,这两个核是否可以给用户进行相关的功能任务开发,请教一下大家是否存在这样的问题?
你好!针对你关于 RDK S100 MCU 侧四个物理核利用 的问题,结合社区现有资料和 S100 的架构特性,为你做如下解答:
核心结论
- MCU1 (Split-Lock 架构):官方 SDK 默认支持 将其作为两个独立核使用,但不支持分别运行两个独立的 FreeRTOS 系统。官方方案是在一个 FreeRTOS 系统内,将两个核配置为 AMP(非对称多处理)模式,即一个核做主核(Master)运行 FreeRTOS 调度,另一个核做从核(Slave)运行裸机代码或特定任务,通过共享内存和中断通信。
- MCU0 (DCLS 架构):不对普通用户开放开发。MCU0 运行的是地平线私有的实时操作系统(非 FreeRTOS),主要负责芯片启动、电源管理、安全启动、视频编解码底层控制等核心底层任务。用户无法在此运行自定义 FreeRTOS 或进行功能开发。
详细解答与技术路径
1. 关于 MCU1 (Split-Lock) 的双核利用
现状:
目前的官方 SDK (mcu-community) 默认配置是将 MCU1 的两个核作为一个整体(Lockstep 或 Split 模式下的单系统)来编译和运行。
可行性与难度:
- 双 FreeRTOS 实例(不可行/极难):在每个物理核上分别运行一个完整的 FreeRTOS 内核(即两个独立的 OS 实例)在 S100 上没有官方支持,且实现难度极大。你需要解决两个 OS 实例之间的中断路由、共享资源竞争、启动时序等底层问题,这通常涉及修改芯片的 BootROM 行为和底层初始化代码,需要芯片原厂深度支持。
- AMP 模式(可行/推荐):官方推荐的“充分利用”方式是 AMP (Asymmetric Multi-Processing)。
- 架构:Core A (Master) 运行 FreeRTOS,Core B (Slave) 运行裸机循环或特定高实时性任务。
- 实现:需要在编译配置中开启 AMP 选项,并编写 Core B 的入口代码。两个核之间通过共享内存(Shared Memory)和 Mailbox 中断进行通信。
- 官方支持:这是地平线技术支持可以协助的范围。社区已有相关讨论涉及 MCU1 的多核任务分配,但具体 AMP 配置需参考最新版 SDK 文档或联系技术支持获取
Split-Lock模式的详细配置指南。
建议操作:
- 检查你的 SDK 版本(建议更新至最新
v4.0.x或以上)。 - 在
Build/FreeRtos_mcu1_community目录下,查看build_freertos.py的脚本参数,寻找是否有amp或split相关的编译选项。 - 查阅 SDK 中
docs文件夹下关于 “Multi-core” 或 “AMP” 的说明。
2. 关于 MCU0 (DCLS) 的开发
现状:
MCU0 是 S100 的系统控制核心,运行的是地平线自研的实时 OS(并非 FreeRTOS),负责:
- 系统上电启动流程
- 电源管理 (PMIC 控制)
- 安全启动 (Secure Boot)
- 多媒体底层编解码控制
- 与 Linux 侧的 Remoteproc 通信
用户开发权限:
- 不可用:MCU0 的代码不对外开放,用户无法获取源码,也无法在上面运行自定义的 FreeRTOS 或应用程序。
- 接口方式:用户通过 Linux 侧的
remoteproc框架与 MCU0 交互(如启动/停止 MCU1,查看状态),或通过 MCU1 间接与底层通信。
社区佐证:
社区帖子 请问 RDK S100 的 MCU1 的源码从哪里获取? 中明确提到 MCU0 源码一般不对外开放。
推荐行动方案
如果你想充分利用 S100 的 MCU 算力,建议按以下路径进行:
-
主攻 MCU1 的 AMP 开发:
- 联系地瓜技术支持(通过工单或社区私信),明确询问:“如何在 SDK 中配置 MCU1 的 Split-Lock 模式为 AMP 架构?是否有 Core1 裸机运行的 Example?”
- 目标:将高实时性、低延迟的控制任务(如电机 FOC 电流环)放在从核(Slave Core)裸机运行,将通信、逻辑判断等任务放在主核(Master Core)的 FreeRTOS 中。
-
利用 Linux 侧算力:
- S100 的强项在于 AI 和 Linux 应用。复杂的决策、感知算法应部署在 Linux (A53) 侧。
- MCU 侧仅负责高频率、确定性的底层控制(如 10kHz+ 的电机控制、传感器数据采集)。
-
参考现有资源:
- 阅读社区精华帖:【S100-MCU-UseGuide】-1- 环境准备与开发流程,熟悉标准的 MCU1 开发流程。
- 查看 SDK 包中的
HorizonTask.c,了解官方预留的任务接口。
总结
- MCU1 双 FreeRTOS? → 不建议/不支持。请采用 AMP 模式(1 个 FreeRTOS + 1 个裸机核)。
- MCU0 能开发吗? → 不能。这是系统保留核,不开放给用户。
- 技术支持能帮吗? → 能。针对 MCU1 的 AMP 配置和底层驱动开发,技术支持可以提供指导,但不会帮你写业务代码。
建议你在该帖子下补充回复,说明你具体的应用场景(例如:需要控制几个电机?采样频率多少?),这样技术支持或社区大佬能给出更具体的架构建议。
请问如何设置AMP模式(1 个 FreeRTOS + 1 个裸机核)
好消息:S100 的 MCU1 官方固件本身就是「core0 跑 FreeRTOS + core1 裸机循环」的 AMP 结构,没有单独的开关要开,你要做的是把自己的代码挂进 core1 分支。
要点:
- 入口在
mcu/Target/Target_S100/Target-hobot-lite-freertos-mcu1/target/main.c,按GetCurrentCoreID()分流:core0 做外设初始化并FreeRtos_Task_Init()启动调度;core1 默认就是裸机while(1)(处理 Can5~Can9 中断)。在 core1 分支加你的任务即可:
} else if (core_id == 1) {
__asm__ volatile("cpsie i");
__asm__ volatile("cpsie f");
while (1) {
if (0 == power_on_core1) {
/* stop/deepsleep 流程,勿删 */
} else {
Your_Baremetal_Task(); /* 自己的裸机逻辑 */
}
}
}
- 保留
power_on_core1/deep_sleep_core1判断和 Cross_Core_Ins3/4/5 处理,否则 remoteproc stop/start 和低功耗流程会异常。 - 中断想落 core1,参考 core0 里
SetCanInterruptAffinity(1)的做法配 GIC 亲和性;同一中断只能在 MCU0 / core0 / core1 中的一方使能。 - 核间通信用共享内存 + 核间中断;链接脚本里
LOG_SHARE_Reserved、SCMI_IPC_Reserved、FREERTOS_HEAP、MCU_STATE_START_ADDR不要动。 - core1 上不要调用 FreeRTOS API(内核只在 core0 跑)。
改完正常编译、加载:
cd mcu/Build/FreeRtos_mcu1
python build_freertos.py lite matrix B s100 mcu1 gcc debug
# elf 推到板端 /lib/firmware 后:
cd /sys/class/remoteproc/remoteproc_mcu0
echo S100_MCU_DEBUG.elf > firmware
echo start > state
参考文档:MCU 快速入门指南(含 main 函数 core0/core1 分支说明)。
这类改 MCU 固件属于深度定制开发,如果涉及自定义中断分配、低功耗时序等超出文档范围的问题,建议报名 DGP 开发者计划获取官方深度支持: