SystemView V3.60 版本新增了多核支持。本文档介绍如何搭建多核录制环境,以及如何在目标设备上配置 RTT。
即便进行多核录制,J-Link 也仅与单个内核建立连接。下文将该 J-Link 所连接的内核称为主内核。
为采集所有内核的运行事件,系统会启用多路 RTT 通道(每个内核独立占用一路),即每个内核会将自身事件存储在专属的 RTT 缓冲区中。
由于 J-Link 仅连接主内核,因此主内核必须具备访问其他所有内核 RTT 缓冲区的权限。
系统通过一个 RTT 控制块统一管理各类 RTT 缓冲区,该控制块包含所有内核的缓冲区描述符。
1. 确保 RTT 控制块仅在主内核中完成单次初始化。
2. 如需了解 RTT 缓冲区通用工作原理,可参考官方文档:
https://kb.segger.com/RTT每个内核独立启动录制流程,彼此完全互不干扰。各内核可运行不同实时操作系统、以不同主频工作。依托独立的 RTT 缓冲区设计,事件写入无需额外加锁机制。
示例目标设备为 LPC4367,搭载 1 颗 Cortex-M4 内核与 2 颗 Cortex-M0 内核,分别命名为 CM4、CM0APP、CM0SUB;J-Link 连接至 M4MAIN 内核。三颗内核均运行应用程序,需通过 SystemView 完成全内核数据录制。
1. RAM1、RAM2、RAM3
通过指令总线、数据总线连接 CM4、CM0APP;
经桥接电路连接 CM0SUB 及所有总线主控设备。
2. AHB_RAM1
通过系统总线连接 CM4、CM0APP;
经桥接电路连接 CM0SUB 及所有总线主控设备。
3. AHB_RAM2、ETB_RAM1
通过系统总线连接 CM4、CM0APP、USB0 总线主控设备。
4. M0SUB_RAM1、M0SUB_RAM2
指令总线、数据总线经桥接电路连接 CM4、CM0APP;
直连 CM0SUB,同时经桥接电路对接所有总线主控设备。
5. BANKA_FLASH1、BANKA_FLASH2、BANKA_FLASH3
指令总线、数据总线连接 CM4、CM0APP;
经桥接电路连接 CM0SUB 及所有总线主控设备。
6. BANKB_FLASH1、BANKB_FLASH2、BANKB_FLASH3
指令总线、数据总线连接 CM4、CM0APP;
对接 DMA、以太网、USB0 总线主控设备。
• CM4 内核
程序存储:BANKA_FLASH1、BANKA_FLASH2
数据存储:RAM1
• CM0APP 内核
程序存储:BANKB_FLASH1(映射地址:0x00000000)
数据存储:RAM2
• CM0SUB 内核
程序存储:BANKA_FLASH3(映射地址:0x00000000)、M0SUB_RAM2(由 CM4 完成初始化)
数据存储:M0SUB_RAM1
• 共享资源
程序存储:BANKA_FLASH3
数据存储:RAM3
SystemView 多核录制的核心要求:划分共享数据内存,同时保证各内核专属内存可被 CM4 对应访问。
1. RTT 控制块:存放于所有内核均可访问的内存区域,仅由 CM4 应用程序初始化。
2. SystemView RTT 缓冲区:需满足录制内核、CM4 内核可访问,且支持 J-Link 通过 CM4 完成读取;内存优先选用可被录制内核高速总线访问的区域。
存储区域 | CM4 访问权限 | CM0APP 访问权限 | CM0SUB 访问权限 | 选用内存区域 |
RTT 控制块 | 支持 | 支持 | 支持 | 共享数据区(RAM3) |
CM4 专属 RTT 缓冲区 | 支持 | 禁止 | 禁止 | CM4 数据区(RAM1) |
CM0APP 专属 RTT 缓冲区 | 支持 | 支持 | 禁止 | CM0APP 数据区(RAM2) |
CM0SUB 专属 RTT 缓冲区 | 支持 | 禁止 | 支持 | CM0SUB 数据区(M0SUB_RAM1) |
SEGGER 链接器配置
#if defined(CORE_M4) initialize by copy with packing=auto { section .shared.data, section .shared.data.* }; #else do not initialize { section .shared.data, section .shared.data.* }; #endif place in SHARED_DATA with fixed order { section .shared.data, section .shared.data.* };GNU 链接器及其他编译工具链,可参照上述逻辑修改链接脚本与运行时初始化代码。
RTT 编译层配置
以下关键配置项需在SEGGER_RTT_Conf.h 中修改,适配多核录制场景:
1. SEGGER_RTT_MAX_NUM_UP_BUFFERS:上下行缓冲区数量,最小值 = 内核数量 + 1
2. SEGGER_RTT_SECTION:指定 RTT 控制块存储段
3. SEGGER_RTT_BUFFER_SECTION:指定终端 RTT 缓冲区存储段
配置代码示例
#define SEGGER_RTT_MAX_NUM_UP_BUFFERS (NUM_CORES + 1) // Max. number of up-buffers (T->H) available on this target (Default: 3)#define SEGGER_RTT_MAX_NUM_DOWN_BUFFERS (NUM_CORES + 1) // Max. number of down-buffers (H->T) available on this target (Default: 3)#if defined(CORE_M4)#define BUFFER_SIZE_UP (1024) // Size of the buffer for terminal output of target, up to host (Default: 1k)#define BUFFER_SIZE_DOWN (16) // Size of the buffer for terminal input to target from host (Usually keyboard input) (Default: 16)#else#define BUFFER_SIZE_UP (4) // Unused. Set minimum on other cores.#define BUFFER_SIZE_DOWN (4) // Unused. Set minimum on other cores.#endif#define SEGGER_RTT_SECTION ".shared.data._SEGGER_RTT"#define SEGGER_RTT_BUFFER_SECTION ".noinit.rtt_buffer"
需在SEGGER_SYSVIEW_Conf.h 中完成内核差异化配置,各内核 RTT 通道号不可重复,禁止使用通道 0。
配置代码示例
#if defined(CORE_M4)#define SEGGER_SYSVIEW_APP_NAME "LPC4367 Multicore Demo - M4"#define SEGGER_SYSVIEW_DEVICE_NAME "LPC4367_M4"#define SEGGER_SYSVIEW_ID_BASE 0x10000000#define SEGGER_SYSVIEW_TIMESTAMP_FREQ SystemCoreClock#define SEGGER_SYSVIEW_CPU_FREQ SystemCoreClock#define SEGGER_SYSVIEW_SYSDESC0 "I#29=TIMER1,I#17=M0APP,I#66=M0SUB"#define SEGGER_SYSVIEW_CORE_NAME "M4MAIN"#define SEGGER_SYSVIEW_GET_INTERRUPT_ID() ((*(U32*)(0xE000ED04)) & 0x1FF)#define SEGGER_SYSVIEW_GET_TIMESTAMP() (*(U32 *)(0x400C000C)) // RIT Counter#define SEGGER_SYSVIEW_RTT_CHANNEL 1#elif defined(CORE_M0)#define SEGGER_SYSVIEW_APP_NAME "LPC4367 Multicore Demo - M0APP"#define SEGGER_SYSVIEW_DEVICE_NAME "LPC4367_M0APP"#define SEGGER_SYSVIEW_ID_BASE 0x10000000#define SEGGER_SYSVIEW_TIMESTAMP_FREQ SystemCoreClock#define SEGGER_SYSVIEW_CPU_FREQ SystemCoreClock#define SEGGER_SYSVIEW_SYSDESC0 "I#28=TIMER0,I#17=M4CORE,I#47=M0SUB"#define SEGGER_SYSVIEW_CORE_NAME "M0APP"#define SEGGER_SYSVIEW_GET_INTERRUPT_ID() ((*(U32*)(0xE000ED04)) & 0x3F)#define SEGGER_SYSVIEW_GET_TIMESTAMP() (*(U32 *)(0x400C000C)) // RIT Counter#define SEGGER_SYSVIEW_RTT_CHANNEL 2#elif defined(CORE_M0SUB)#define SEGGER_SYSVIEW_APP_NAME "LPC4367 Multicore Demo - M0SUB"#define SEGGER_SYSVIEW_DEVICE_NAME "LPC4367_M0SUB"#define SEGGER_SYSVIEW_ID_BASE 0x10000000#define SEGGER_SYSVIEW_TIMESTAMP_FREQ SystemCoreClock#define SEGGER_SYSVIEW_CPU_FREQ SystemCoreClock#define SEGGER_SYSVIEW_SYSDESC0 "I#30=TIMER2,I#17=M4CORE,I#47=M0APP"#define SEGGER_SYSVIEW_CORE_NAME "M0SUB"#define SEGGER_SYSVIEW_GET_INTERRUPT_ID() ((*(U32*)(0xE000ED04)) & 0x3F)#define SEGGER_SYSVIEW_GET_TIMESTAMP() (*(U32 *)(0x400C000C)) // RIT Counter#define SEGGER_SYSVIEW_RTT_CHANNEL 3#endif
多核录制的运行逻辑与单核基本一致,唯一约束:必须由主内核优先调用SEGGER_SYSVIEW_Conf() 或SEGGER_RTT_Init(),再启动其他内核的 SystemView、RTT 接口。
初始化代码示例
void CM4_AppInit(void) { CM0APP_ResetAndStop(); CM0SUB_ResetAndStop(); ... SEGGER_SYSVIEW_Conf(); ... CM0APP_Start(); CM0SUB_Start(); ... }按以下步骤启动多核录制:
1. 打开录制器配置:目标→ 录制器配置;
2. 调试器选型:选择 J-Link;
3. 按常规流程完成 J-Link 与目标设备的连接配置;
4. 内核数量设置:填写 0(自动识别全部 RTT 通道)或实际应用内核总数;
5. 若软件无法自动识别 RTT 控制块,手动填入控制块内存地址;
6. 点击确定保存配置,按下 F5 快捷键启动录制。
联系我们
CONTACT INFORMATION
Windway Technology Hong Kong Limited
Phone: +852 695 952 92
Email: kuang@windway.cn
Add:ROOM 06 BLK A 23/F HOVER IND BLDG ,26-38 KWAI CHEONG RD KWAI CHUNG N.T
广州市风标电子技术有限公司
咨询热线:020 - 8600 3016 | 技术支持:15817074644
销售热线:18928802261 | 19868005704
公司邮箱:sales@windway.cn公司地址:广东省广州市黄埔区科珠路203号广东软件园F座401