S100的MCU侧四个物理核如何充分利用起来?

S100的MCU侧四个物理核如何充分利用起来?
目前架构为1× DCLS, 1× Split-Lock,其中1× Split-Lock已明确表示可以拆分为两个独立核进行使用,若使MCU1的两个核分别运行FreeRTOS系统,是否存在可行性,难度如何,地瓜技术支持是否可以帮助实现该目标;其二1× DCLS由MCU0运行,这两个核是否可以给用户进行相关的功能任务开发,请教一下大家是否存在这样的问题?

你好!针对你关于 RDK S100 MCU 侧四个物理核利用 的问题,结合社区现有资料和 S100 的架构特性,为你做如下解答:

核心结论

  1. MCU1 (Split-Lock 架构):官方 SDK 默认支持 将其作为两个独立核使用,但不支持分别运行两个独立的 FreeRTOS 系统。官方方案是在一个 FreeRTOS 系统内,将两个核配置为 AMP(非对称多处理)模式,即一个核做主核(Master)运行 FreeRTOS 调度,另一个核做从核(Slave)运行裸机代码或特定任务,通过共享内存和中断通信。
  2. 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 模式的详细配置指南。

建议操作:

  1. 检查你的 SDK 版本(建议更新至最新 v4.0.x 或以上)。
  2. Build/FreeRtos_mcu1_community 目录下,查看 build_freertos.py 的脚本参数,寻找是否有 ampsplit 相关的编译选项。
  3. 查阅 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 算力,建议按以下路径进行:

  1. 主攻 MCU1 的 AMP 开发

    • 联系地瓜技术支持(通过工单或社区私信),明确询问:“如何在 SDK 中配置 MCU1 的 Split-Lock 模式为 AMP 架构?是否有 Core1 裸机运行的 Example?”
    • 目标:将高实时性、低延迟的控制任务(如电机 FOC 电流环)放在从核(Slave Core)裸机运行,将通信、逻辑判断等任务放在主核(Master Core)的 FreeRTOS 中。
  2. 利用 Linux 侧算力

    • S100 的强项在于 AI 和 Linux 应用。复杂的决策、感知算法应部署在 Linux (A53) 侧。
    • MCU 侧仅负责高频率、确定性的底层控制(如 10kHz+ 的电机控制、传感器数据采集)。
  3. 参考现有资源

总结

  • MCU1 双 FreeRTOS?不建议/不支持。请采用 AMP 模式(1 个 FreeRTOS + 1 个裸机核)。
  • MCU0 能开发吗?不能。这是系统保留核,不开放给用户。
  • 技术支持能帮吗?。针对 MCU1 的 AMP 配置和底层驱动开发,技术支持可以提供指导,但不会帮你写业务代码。

建议你在该帖子下补充回复,说明你具体的应用场景(例如:需要控制几个电机?采样频率多少?),这样技术支持或社区大佬能给出更具体的架构建议。

若有明确商业/项目技术支持需求,可以从 地心引力计划 DGP - 地瓜机器人全球创业支持与生态加速计划 建联

分别运行FreeRTOS系统,我理解实现比较困难

MCU0 不对社区用户开放~

请问如何设置AMP模式(1 个 FreeRTOS + 1 个裸机核)

好消息:S100 的 MCU1 官方固件本身就是「core0 跑 FreeRTOS + core1 裸机循环」的 AMP 结构,没有单独的开关要开,你要做的是把自己的代码挂进 core1 分支。

要点:

  1. 入口在 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();  /* 自己的裸机逻辑 */
        }
    }
}
  1. 保留 power_on_core1 / deep_sleep_core1 判断和 Cross_Core_Ins3/4/5 处理,否则 remoteproc stop/start 和低功耗流程会异常。
  2. 中断想落 core1,参考 core0 里 SetCanInterruptAffinity(1) 的做法配 GIC 亲和性;同一中断只能在 MCU0 / core0 / core1 中的一方使能。
  3. 核间通信用共享内存 + 核间中断;链接脚本里 LOG_SHARE_ReservedSCMI_IPC_ReservedFREERTOS_HEAPMCU_STATE_START_ADDR 不要动。
  4. 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 开发者计划获取官方深度支持:

https://developer.d-robotics.cc/dgp