将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_Reserved、SCMI_IPC_Reserved、FREERTOS_HEAP、MCU_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 快速入门指南(main 函数 core0/core1 分支说明、启动流程)
- MCU1 开发指南(中断号分配、MCU0 已占用中断清单)
改 MCU 固件属于深度定制,如果涉及自定义中断分配、核间通信协议、低功耗时序这类超出文档范围的问题,建议报名 DGP 开发者计划获取官方深度支持:
Split-Lock是什么意思?没有Split-Lock开关那就没有lock模式吗
Split-Lock 是什么:这是 S100 MCU 所用的 ARM Cortex-R52+ 核的两种运行形态——
- Split(拆分)模式:两个核独立跑各自的代码,算力翻倍;
- Lock(锁步)模式:两个核错拍执行同一条指令,硬件比对器实时检测不一致,用于功能安全(检出随机硬件故障),代价是只当一个核用。
S100 现状:官方固件里 MCU1 默认就工作在 Split 模式(main.c 按 GetCurrentCoreID() 分流:core0 跑 FreeRTOS 调度,core1 跑裸机任务,AMP 架构),SDK 和文档中没有提供 Split/Lock 切换开关。
所以回答你的第二个问题:不是"没有开关就没有 lock 模式"——R52+ 硬件本身支持锁步,但 lock 模式的使能在启动链固件(SBL/MCU0,不开源、属商业版范围)里,目前官方没有对开发者开放配置入口,公开文档也查不到相关说明。
- MCU1 双核使用方法可参考官方文档:7.5.2 MCU 快速入门指南 | RDK S100/S600 DOC (明确写了 MCU 核为 ARM R52+)
- 如果你是出于功能安全(锁步检错)需求要用 lock 模式,这属于商业版/定制支持范围,建议报名 DGP 开发者计划对接官方确认:https://developer.d-robotics.cc/dgp
如果目标是让 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