SystemView V3.60 版本新增了多核支持。本文档介绍如何搭建多核录制环境,以及如何在目标设备上配置 RTT。 即便进行多核录制,J-Link 也仅与单个内核建立连接。下文将该 J-Link 所连接的内核称为主内核。 为采集所有内核的运行事件,系统会启用多路 RTT 通道(每个内核独立占用一路),即每个内核会将自身事件存储在专属的 RTT 缓冲区中。 由于 J-Link 仅连接主内核,因此主内核必须具备访问其他所有内核 RTT 缓冲区的权限。 系统通过一个 RTT 控制块统一管理各类 RTT 缓冲区,该控制块包含所有内核的缓冲区描述符。 1. 确保 RTT 控制块仅在主内核中完成单次初始化。 2. 如需了解 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 链接器配置 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 缓冲区存储段 配置代码示例 需在SEGGER_SYSVIEW_Conf.h 中完成内核差异化配置,各内核 RTT 通道号不可重复,禁止使用通道 0。 配置代码示例 多核录制的运行逻辑与单核基本一致,唯一约束:必须由主内核优先调用SEGGER_SYSVIEW_Conf() 或SEGGER_RTT_Init(),再启动其他内核的 SystemView、RTT 接口。 初始化代码示例 按以下步骤启动多核录制: 1. 打开录制器配置:目标→ 录制器配置; 2. 调试器选型:选择 J-Link; 3. 按常规流程完成 J-Link 与目标设备的连接配置; 4. 内核数量设置:填写 0(自动识别全部 RTT 通道)或实际应用内核总数; 5. 若软件无法自动识别 RTT 控制块,手动填入控制块内存地址; 6. 点击确定保存配置,按下 F5 快捷键启动录制。 #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.* }; #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"#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 void CM4_AppInit(void) { CM0APP_ResetAndStop(); CM0SUB_ResetAndStop(); ... SEGGER_SYSVIEW_Conf(); ... CM0APP_Start(); CM0SUB_Start(); ... }
联系我们
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