Jlink 使用 RTT 输出调试信息总结
一天的突然消息,听说Jlink 可以仅仅使用自身就可以输出调试信息,不在使用多余的其他UART 外界接口,所以就花了3天时间折腾了下(网上搜索,使用很简单,但是自己去使用三天才正常输出,踩了不少坑,所以现在记录一下),
Jlink 输出调试信息可以通过两种方法
一,Jlink的 Target功能,该方法需要用到Jlink 的SWO引脚,如果外设芯片没有这个脚的话,说明这个方式是行不通的 ,
其实配置很简单
1.1如下配置Jlink的配置
1.2,添加printf的重定向,到SWO
#define ITM_Port8(n) (*((volatile unsigned char *)(0xE0000000+4*n)))
#define ITM_Port16(n) (*((volatile unsigned short*)(0xE0000000+4*n)))
#define ITM_Port32(n) (*((volatile unsigned long *)(0xE0000000+4*n)))
#define DEMCR (*((volatile unsigned long *)(0xE000EDFC)))
#define TRCENA 0x01000000
int fputc(int ch, FILE *f)
{
if (DEMCR & TRCENA) {
while (ITM_Port32(0) == 0);
ITM_Port8(0) = ch;
}
return(ch);
}
1.3,在如MDK IDE的Debug printf 窗口就可以看到你的调试信息
二,使用Jlink的 RTT功能 ,
其实我主要是使用这个功能,这个功能是不需要另外接其他引脚的,如果使用SW连接方式,仅仅两根线就可以,
RTT 是Jlink的一种实时终端的方式连接输出调试信息,网上有很多说明之间按照做就可以,我仅仅是记录一下自己的步骤,和自己遇到的坑,记录一下自己的解决方案,
1,就是下载RTT软件包,
下载RTT文件: http://download.segger.com/J-Link/RTT/RTT_Implementation_140925.zip
2,按照V4.9e上的Jlink驱动,因为版本是不支持Jlink RTT的传输,
3,添加RTT文件到自己的工程
4,添加必要的头文件,
5,输出函数打印
这个时候RTT在程序中就添加成功了,,我们可以使用使用Jlink带的3各工具进行查看数据
如打开RTT Viewer 提升连接,点击OK 不出意外的化,你就可以看到调试信息了,
其实到这里 ,一般就完事了,但是 我的之前就是出意外了,最后一步就是不能输出信息,,网上搜索了很多放到就是不行,
我的现象是:
1,添加RTT文件这些感觉一切正常,
2,我是用RTT Client 连接,能连接上,但是不会输出调试信息
3, RTT Viewer RTT Logger 等也是都可以连接
4,Jlink的连接窗口一直在提示是在读取
可是就是一直没有数据输出,可怜我的心了 ,,,
解决:
一开始以为是Jlink驱动不对,因为是我的电脑上安装了多个版本的Jlink版本,在MDK的 Jlink文件夹内还是会给你拷贝一份驱动在那保存,每次启动会直接用那份驱动,具体那份驱动是哪个版本,直接点击Jlink.exe或者从Keil的这个窗口可以看出
我再使用单独安装的Jlink 驱,可能会和这个版本不一样,每次点击RTT 的那三个创,一意孤行的认为不对,可能就是驱动的问题,结果, 换了最新,又后退版本的折腾好久,结果,很确定的说,,,,和这个没有关系,,
2,网上看到可能是需要修改RTT的源码,什么识别的字符不对,等等,研究了半天,感觉他们的修改就是非必要的, 在SEGGER_RTT_Conf,h就已经有一个宏是区分程序在RAM中的情况,
#define SEGGER_RTT_IN_RAM, 把他定义为1,即就是他们修改的方式了,
但是在我的工程中也是未能成功输出,
气的不行,为毛我的还不出来,网上真没有其他说法了,
狠下心去看看 这个RTT是个什么鬼,,
终极解决方案:RTT是什么鬼, 不用说我们都可以知道Jlink是做什么的, 就是下载程序,调试程序,也就是说Jlink可以任意读写片上的内存,,RTT是怎么出来了,其中的具体实现是不清楚的,这是封闭的,但是我们可以看出
1,在RTT打开后从Jlink的Control Panel可以看出,RTT是一直在读取数据的过程,
2,我们在代码中去看SEGGER_RTT.c 其实就是一个在往一个buffer中写数据就是
这下明白了,,RTT其实就是一个Jlink读片子上的一个内存buffer中的读写,即,_SEGGER_RTT 中定义;这个buffer中的第一项是acID[16],它是做什么的,就是Jlink去读内存时,回去中这部分字符串,如果匹配上了,就是找到了这个buffer,就在这部分内存中读取数据,,会根据规定的数据机构就解析内存上的数据, 来实现RTT是读写,如果找不到那读写数据就办不到了,
而我的RTT连接正常,但是没有数据也就是找不到这片内存,
为什么找不到:我使用的片子不是市面上常用的 XXX片子, 这是一个私有定制的片子,内存偏移的这些存在很多不同的地方,
具体Jlnk 是怎样的搜索这片内存就没再去深究了,我们先来测试一下我们的研究成果过吧,
1,启动程序,
2,打开RTT Viewer,提示配置, 居然它找不到我就直接给它吧,不要让它再去找了,累坏它咋办,
点击OK,我去,终于出来了,3天时间,====不够聪明啊。。。。
有点小纠结: RTT Viewer 在每次调试启动后需要重启点击,不知道这有为毛,(直接快捷键F2,再重启连接即可)先用着吧,
总结: 很多工具我们可能是想用用就算了,不想深入研究其中东西,但是有时候还是事宜愿为,凡事需要弄懂其中道理才会真正的使用自如。。。。
Jlink 使用 RTT 输出调试信息总结相关推荐
- STM32 使用 ITM 输出调试信息
本文开发环境: MCU型号:STM32F103ZE IDE环境: MDK 5.27 调试器:ST-LINK 本文内容: 使用 ITM 输出调试信息 文章目录 一.ITM 简介 二.ITM 输出功能的配 ...
- 嵌入式开发输出调试信息的几种方法(常规法及非常规法)
这篇文章对于研发查找问题和测试都有很大帮助,在这里保存记录一下. 论语>有云:"工欲善其事,必先利其器".输出调试信息是软件开发中必不可少的调试利器,在出现bug时如果没有调 ...
- Qt 使用#define+qDebug()输出调试信息
/******************************************************************************************** Qt 使用# ...
- C++ MFC控制台输出调试信息
C++ MFC控制台输出调试信息 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 1.#include <conio.h> 2.在需要开启控制台窗口的地方调用 ...
- 跟踪Makefile输出调试信息
/********************************************************************** 跟踪Makefile输出调试信息* 说明:* 有时候为了 ...
- C++ 输出调试信息 类似MFC的TRACE等宏
在MFC程序中有TRACE等一系列的宏可以输出调试信息, 但是其他的地方不能用了, 下面这个小程序测试了怎么输出调试信息, // Test_ErrorCode.cpp : 定义控制台应用程序的入口点. ...
- DebugView输出调试信息
在写windows程序时,需要输出一些调试信息,这里介绍一种极其方便的方法.即使用OutputDebugString 在Debug模式下输出调试信息,在Release模式下不输出. 我们可以在VS的集 ...
- 在MFC,Win32程序中向控制台(Console)窗口输出调试信息
在MFC程序中输出调试信息的方法有两种,一种是使用TRACE宏,可以向Output窗口输出调试信息:另一种是用MessageBox,弹出消息框来输出调试信息,但会影响程序的运行. 其实有一种方法可以更 ...
- php语法中可以输出调试信息,怎么优雅的输出PHP调试信息
如何优雅的输出PHP调试信息 经常因为出现紧急bug而被老板骂的同事,为了更快的修复而直接利用线上的错误环境现场debug,并直接在页面上echo和dump.结果被老板发现了,又是一通臭骂.那么有没有 ...
最新文章
- 在asp.net中调用Office来制作各种(3D)统计图
- WINDOWS 逻辑坐标 设备坐标 屏幕坐标 客户区坐标
- 科大星云诗社动态20210509
- 搞定系统设计 01:从 0 到百万用户的系统
- PLSQL_性能优化系列15_Oracle Explain Plan解析计划解读
- react中嵌入网页_在网站中添加 React
- python中的构造函数_python构造函数init实例方法解析
- 关于有窗口元素和无窗口元素
- Android学习系列--App缓存管理
- 外联样式表添加到html中,CSS联样式表之内联式、外联式和嵌入式
- c语言周信东实验答案,桂林电子科技大学-C语言-程序设计-习题-答案(周信东)-实验4--数-组...
- [Tizen开发]SDB调试工具使用简介
- PHP PDO的简单使用(query(),exec(),prepare(),Transaction,行锁)
- 黑马MFC教程总结(后续更新)
- 安卓客户端代码中修改服务器ip,安卓客户端代码中修改服务器ip
- redis源码阅读—hyperloglog(基数统计)
- javascript中的字符串编码转换
- Stochastic Variance Reduced Ensemble Adversarial Attack for Boosting the Adversarial Transferability
- 【无人机航测实习简明教程】1 无人机航测常见名词术语解释
- Android App设计架构