Jlink 使用 RTT 输出调试信息总结

版权声明: https://blog.csdn.net/u012529163/article/details/84852540

一天的突然消息,听说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,再重启连接即可)先用着吧,

总结: 很多工具我们可能是想用用就算了,不想深入研究其中东西,但是有时候还是事宜愿为,凡事需要弄懂其中道理才会真正的使用自如。。。。

猜你喜欢

转载自blog.csdn.net/u012529163/article/details/84852540
RTT
今日推荐