SystemView 多核使用指南
来源: | 作者:风标电子工程师 | 发布时间: 2026-04-29 | 7 次浏览 | 🔊 点击朗读正文 ❚❚ | 分享到:

SystemView 多核使用指南

点击蓝字 关注我们



SystemView V3.60 版本新增了多核支持。本文档介绍如何搭建多核录制环境,以及如何在目标设备上配置 RTT。


01
工作原理

即便进行多核录制,J-Link 也仅与单个内核建立连接。下文将该 J-Link 所连接的内核称为主内核

为采集所有内核的运行事件,系统会启用多路 RTT 通道(每个内核独立占用一路),即每个内核会将自身事件存储在专属的 RTT 缓冲区中。

由于 J-Link 仅连接主内核,因此主内核必须具备访问其他所有内核 RTT 缓冲区的权限。

系统通过一个 RTT 控制块统一管理各类 RTT 缓冲区,该控制块包含所有内核的缓冲区描述符。


02
注意事项

1. 确保 RTT 控制块仅在主内核中完成单次初始化

2. 如需了解 RTT 缓冲区通用工作原理,可参考官方文档:

https://kb.segger.com/RTT

每个内核独立启动录制流程,彼此完全互不干扰。各内核可运行不同实时操作系统、以不同主频工作。依托独立的 RTT 缓冲区设计,事件写入无需额外加锁机制。


03
配置示例

示例目标设备为 LPC4367,搭载 1 颗 Cortex-M4 内核与 2 颗 Cortex-M0 内核,分别命名为 CM4、CM0APP、CM0SUB;J-Link 连接至 M4MAIN 内核。三颗内核均运行应用程序,需通过 SystemView 完成全内核数据录制。


04
设备内存资源分配

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 总线主控设备。


05
示例系统内核内存使用规划

• CM4 内核

程序存储:BANKA_FLASH1、BANKA_FLASH2

数据存储:RAM1

• CM0APP 内核

程序存储:BANKB_FLASH1(映射地址:0x00000000)

数据存储:RAM2

• CM0SUB 内核

程序存储:BANKA_FLASH3(映射地址:0x00000000)、M0SUB_RAM2(由 CM4 完成初始化)

数据存储:M0SUB_RAM1

• 共享资源

程序存储:BANKA_FLASH3

数据存储:RAM3


06
RTT 内存布局规划

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)


07
链接脚本配置

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"


08
SystemView 编译层配置


需在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

09
运行时配置

多核录制的运行逻辑与单核基本一致,唯一约束:必须由主内核优先调用SEGGER_SYSVIEW_Conf() 或SEGGER_RTT_Init(),再启动其他内核的 SystemView、RTT 接口。

初始化代码示例











 void CM4_AppInit(void) {   CM0APP_ResetAndStop();   CM0SUB_ResetAndStop();   ...   SEGGER_SYSVIEW_Conf();   ...   CM0APP_Start();   CM0SUB_Start();   ... }

010
SystemView 软件端配置

按以下步骤启动多核录制:

1. 打开录制器配置:目标→ 录制器配置;

2. 调试器选型:选择 J-Link;

3. 按常规流程完成 J-Link 与目标设备的连接配置;

4. 内核数量设置:填写 0(自动识别全部 RTT 通道)或实际应用内核总数;

5. 若软件无法自动识别 RTT 控制块,手动填入控制块内存地址;

6. 点击确定保存配置,按下 F5 快捷键启动录制。



END