一天的突然消息,听说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,再重启连接即可)先用着吧,
总结: 很多工具我们可能是想用用就算了,不想深入研究其中东西,但是有时候还是事宜愿为,凡事需要弄懂其中道理才会真正的使用自如。。。。