news 2026/4/30 3:08:22

二十六、RZN2L CR52 RTT打印移植与固定地址

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
二十六、RZN2L CR52 RTT打印移植与固定地址

一、目的/概述

1、在RZN2L CR52内核上移植SEGGER RTT打印功能

2、解决RTT地址不固定的问题确保J-Link能稳定连接

3、强制放置到nocache SRAM地址保证数据一致性

二、问题背景

2.1 为什么需要nocache地址?

RZN2L使用的是Cortex-R52内核,有多块内存区域,其中部分使用了Cache:

内存区域

地址

是否Cache

ATCM

0x00000000

BTCM

0x00100000

SYSTEM_RAM_MIRROR

0x30000000

NONCACHE_BUFFER

0x30160000

无(nocache)

RTT需要放在nocache区域,否则J-Link读取时数据可能还在Cache里未刷到RAM。

2.2 地址不固定的问题

默认情况下,RTT的三个变量在.noncache_buffersection中按链接顺序排列:

.noncache_buffer 0x30160000 0x4b8 0x30160410 _SEGGER_RTT ← 不是起始地址!

每次编译顺序不同,地址也会变化,导致J-Link无法稳定连接。

三、移植步骤

3.1 复制RTT文件到工程

从SEGGER官网下载RTT源码,复制以下文件到工程:

src/SEGGER_RTT/ ├── SEGGER_RTT.c ├── SEGGER_RTT.h ├── SEGGER_RTT_Conf.h └── SEGGER_RTT_printf.c

3.2 配置log.h

src/log.h中配置打印方式:

/* * 打印方式选择: 0=UART, 1=RTT */ #definePRINTF_METHOD1 #if(PRINTF_METHOD ==1) #defineUSE_RTT_PRINT1 #defineSEGGER_INDEX(0) #include"SEGGER_RTT/SEGGER_RTT.h" #defineprintf(...)SEGGER_RTT_printf(SEGGER_INDEX, __VA_ARGS__) #endif

3.3 修改SEGGER_RTT.c

修改src/SEGGER_RTT/SEGGER_RTT.c第274-276行,使用nocache section:

#ifSEGGER_RTT_CPU_CACHE_LINE_SIZE // 有cache的系统使用对齐 SEGGER_RTT_CB _SEGGER_RTT __attribute__((section(".noncache_buffer"),aligned(SEGGER_RTT_CPU_CACHE_LINE_SIZE))); // ... #else // 无cache的系统直接放到nocache段 SEGGER_RTT_CB _SEGGER_RTT __attribute__((section(".noncache_buffer"))); staticchar _acUpBuffer[BUFFER_SIZE_UP]__attribute__((section(".noncache_buffer"))); staticchar _acDownBuffer[BUFFER_SIZE_DOWN]__attribute__((section(".noncache_buffer"))); #endif

3.4 修改链接脚本

script/fsp_xspi0_boot.ld中固定顺序:

.noncache_bufferNONCACHE_BUFFER_START(NOLOAD):AT(NONCACHE_BUFFER_START) { .=ALIGN(32); _ncbuffer_start =.; KEEP(*(.noncache_buffer._SEGGER_RTT))) KEEP(*(.noncache_buffer._acUpBuffer))) KEEP(*(.noncache_buffer._acDownBuffer))) KEEP(*(.noncache_buffer*)) _ncbuffer_end =.; }> NONCACHE_BUFFER

3.5 定义起始标记

为了确保_SEGGER_RTT在section起始位置,需要添加一个起始标记:

// 在RTT控制块前面添加一个标记变量 staticchar _SEGGER_RTT_Start[1]__attribute__((section(".noncache_buffer"))); SEGGER_RTT_CB _SEGGER_RTT __attribute__((section(".noncache_buffer"),aligned(32))); staticchar _acUpBuffer[BUFFER_SIZE_UP]__attribute__((section(".noncache_buffer"))); staticchar _acDownBuffer[BUFFER_SIZE_DOWN]__attribute__((section(".noncache_buffer")));

链接脚本更新为:

KEEP(*(.noncache_buffer._SEGGER_RTT_Start))) KEEP(*(.noncache_buffer._SEGGER_RTT))) KEEP(*(.noncache_buffer._acUpBuffer))) KEEP(*(.noncache_buffer._acDownBuffer))) KEEP(*(.noncache_buffer*))

四、验证方法

4.1 查看map文件

编译后在map文件中确认地址:

.noncache_buffer 0x30160000 0x4b8 0x30160000 . = ALIGN (0x20) 0x30160000 _ncbuffer_start = . *(.noncache_buffer._SEGGER_RTT_Start) *(.noncache_buffer._SEGGER_RTT) *(.noncache_buffer._acUpBuffer) *(.noncache_buffer._acDownBuffer) .noncache_buffer 0x30160000 0x4b8 ./src/SEGGER_RTT/SEGGER_RTT.o 0x30160000 _SEGGER_RTT ← 固定在起始地址 0x301604b8 _ncbuffer_end = .

4.2 J-Link连接测试

在J-Link Commander中验证:

J-Link> exec device = R52 J-Link> mem 0x30160000, 4

五、常见问题

5.1 RTT不打印

检查项:

  1. 是否正确包含SEGGER_RTT.h

  2. 缓冲区是否放到nocache section

  3. J-Link是否连接正确

5.2 地址不固定

原因:变量未放到相同的section或链接脚本ORDER不对

解决:按本文第3.5节添加起始标记

5.3 有cache和无cache的区别

配置

说明

有L1 Cache

必须放nocache,否则数据不一致

无Cache

可以放普通RAM,nocache可选

六、总结

步骤

关键操作

1

复制RTT源文件到工程

2

配置log.h,使用RTT打印

3

修改SEGGER_RTT.c,放到noncache_buffer section

4

添加起始标记_SEGGER_RTT_Start

5

修改链接脚本,固定排列顺序

6

验证map文件确认地址固定

核心要点:必须定义起始标记 + 链接脚本固定ORDER,才能保证_SEGGER_RTT固定在0x30160000地址。

七、附录

测试环境

  • MCU

    :Renesas RZN2L

  • 内核

    :Cortex-R52 @ 400MHz

  • 编译器

    :ARM GCC 13.3.1

  • IDE

    :e2studio

  • J-Link

    :V11

相关地址定义

符号

地址

说明

NONCACHE_BUFFER_START

0x30160000

nocache区域起始

NONCACHE_BUFFER_LENGTH

0x00020000

128KB

_SEGGER_RTT

0x30160000

RTT控制块

_acUpBuffer

0x30160410

上行缓冲区

_acDownBuffer

0x30160810

下行缓冲区

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/30 3:07:24

基于Haskell与纯文本的smos任务管理器:构建可编程的个人工作流系统

1. 项目概述:一个用Haskell编写的现代化待办事项管理器如果你和我一样,在寻找一个能完全掌控、高度可定制且能伴随你工作流成长的待办事项工具,那么你很可能已经厌倦了那些界面花哨但数据被锁在云端、功能看似丰富却无法按需调整的商业软件。…

作者头像 李华
网站建设 2026/4/30 3:07:22

视频扩散模型(VDMs):视觉智能的时空理解新范式

1. 视频预训练模型:视觉智能的新范式在计算机视觉领域,我们正见证着一场由视频扩散模型(Video Diffusion Models, VDMs)引领的范式转变。传统视觉模型往往局限于静态图像理解,而VDMs通过大规模时空数据预训练&#xff…

作者头像 李华
网站建设 2026/4/30 3:05:23

LangChain 文档加载器与文本分割器

一、LangChain 文档加载器与文本分割器核心概念这两个模块是 RAG(检索增强生成) 的基石,解决了「如何把非结构化文档(PDF、Word、网页)变成大模型能处理的文本块」的问题,核心目标是保留语义完整性&#xf…

作者头像 李华
网站建设 2026/4/30 3:02:27

3D部件分割新突破:SegviGen框架的生成式着色技术

1. 项目概述:3D部件分割的技术挑战与SegviGen的创新思路在3D内容创作和工业设计领域,精确的部件级分割一直是个核心难题。想象一下,当你需要将一个复杂的3D模型分解成可独立编辑的部件时——比如将汽车模型拆解为车门、轮胎、引擎盖等组件——…

作者头像 李华
网站建设 2026/4/30 3:02:24

AI编程助手授权机制解析:从Cursor Pro试用项目看软件安全与合规

1. 项目概述:当AI编程助手遇上“试用”的诱惑 最近在开发者圈子里,一个名为 aigem/cursor-pro-trial 的项目悄然流传。光看名字,很多朋友可能就心领神会了——这大概率是一个围绕当下最炙手可热的AI编程工具 Cursor 的“专业版试用”相关项…

作者头像 李华