如何配置RDKS100的MCU1的Split-Lock模式?

将MCU1配置为FreeRTOS+裸核的AMP模式

S100 的 MCU1(Cortex-R52+ Split-Lock 核)在官方固件里默认就是拆分模式:core0 跑 FreeRTOS,core1 跑裸机 while(1) 循环。没有单独的「Split-Lock 开关」要配置,你要做的是把自己的裸机任务挂进 core1 分支。

1. 改 core1 入口mcu/Target/Target_S100/Target-hobot-lite-freertos-mcu1/target/main.c,按 GetCurrentCoreID() 分流:

} 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();   /* 你的裸机逻辑 */
        }
    }
}

2. 几条硬约束

  • power_on_core1 / deep_sleep_core1 判断和 Cross_Core_Ins3/4/5 核间中断必须保留,否则 remoteproc stop/start 和低功耗流程会异常;
  • core1 不要调用任何 FreeRTOS API(内核只在 core0 跑);
  • 想让中断落到 core1,参考 core0 里 SetCanInterruptAffinity(1) 的 GIC 亲和性写法;同一中断只能在 MCU0/core0/core1 一方使能(MCU0 已占用清单见 MCU1 开发指南);
  • 链接脚本里 LOG_SHARE_ReservedSCMI_IPC_ReservedFREERTOS_HEAPMCU_STATE_START_ADDR 这些共享区域不要动。

3. 编译加载

cd mcu/Build/FreeRtos_mcu1
python build_freertos.py lite matrix B s100 mcu1 gcc debug
# 把 S100_MCU_DEBUG.elf 推到板端 /lib/firmware 后:
cd /sys/class/remoteproc/remoteproc_mcu0
echo S100_MCU_DEBUG.elf > firmware
echo start > state

参考文档:

改 MCU 固件属于深度定制,如果涉及自定义中断分配、核间通信协议、低功耗时序这类超出文档范围的问题,建议报名 DGP 开发者计划获取官方深度支持:

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

Split-Lock是什么意思?没有Split-Lock开关那就没有lock模式吗

Split-Lock 是什么:这是 S100 MCU 所用的 ARM Cortex-R52+ 核的两种运行形态——

  • Split(拆分)模式:两个核独立跑各自的代码,算力翻倍;
  • Lock(锁步)模式:两个核错拍执行同一条指令,硬件比对器实时检测不一致,用于功能安全(检出随机硬件故障),代价是只当一个核用。

S100 现状:官方固件里 MCU1 默认就工作在 Split 模式(main.cGetCurrentCoreID() 分流:core0 跑 FreeRTOS 调度,core1 跑裸机任务,AMP 架构),SDK 和文档中没有提供 Split/Lock 切换开关

所以回答你的第二个问题:不是"没有开关就没有 lock 模式"——R52+ 硬件本身支持锁步,但 lock 模式的使能在启动链固件(SBL/MCU0,不开源、属商业版范围)里,目前官方没有对开发者开放配置入口,公开文档也查不到相关说明。

如果目标是让 MCU1 的 core0 跑 FreeRTOS、core1 跑裸机任务,当前公开 MCU1 工程已经是这条使用路径,不需要再找一个应用层的 “Split-Lock 开关”。按官方 MCU 快速入门指南main() 会通过 GetCurrentCoreID() 分流:core0 完成 FreeRTOS 初始化和任务调度,core1 进入独立的裸机循环。可以在官方工程的 core1 分支中加入裸机业务逻辑,但要保留现有的中断初始化、power_on_core1 判断以及 stop/deepsleep 处理,否则会影响 remoteproc 启停和低功耗流程。

这里还要区分硬件能力和当前 SDK 能力。Split 模式表示两个 R52+ 核独立执行,Lock 模式表示两个核执行同一指令流并进行硬件比较,用于功能安全。没有应用层开关不代表芯片没有 Lock 能力;RDK S100 官方产品页明确写有一组支持 Split-Lock 的 R52+ 核。不过,公开 MCU1 文档没有给出 Split/Lock 切换步骤,RDK S100 V4.0.5 发布说明还将“MCU1 目前不支持锁步解锁”列为已知问题。因此不建议自行写未公开寄存器或修改启动链来切换模式。

如果需求只是 FreeRTOS + 裸核 AMP,直接基于官方 MCU1 工程的 core0/core1 分支开发即可;如果需求是功能安全锁步、启动即 Lock 或运行时切换,请补充板卡型号、RDK OS/MCU SDK 版本和所需切换时机,再由官方研发评估对应版本是否开放。这部分涉及启动固件和功能安全配置,属于深度定制支持范围。

完整资料地址:

  • MCU 快速入门指南:https://developer.d-robotics.cc/rdk_s_doc/Advanced_development/mcu_development/basic_information
  • RDK S100 产品页:https://developer.d-robotics.cc/rdks100
  • RDK S100 V4.0.5 发布说明:https://developer.d-robotics.cc/rdk_s_doc/Release_Note/s100/v4_0_5