amoBBS 阿莫电子论坛

 找回密码
 注册
搜索
bottom↓
查看: 43833|回复: 361

开贴研究:JLINK RTT,完爆各种printf形式,从此swo是路人

  [复制链接]
发表于 2014-9-10 22:53:03 | 显示全部楼层 |阅读模式
本帖最后由 gwnpeter 于 2014-9-11 12:53 编辑

已经成功运行...............
还有点小问题,大家讨论一下怎么优化

不知道怎么置顶,这里加说明吧:
这个是原帖
http://www.amobbs.com/forum.php? ... 0&highlight=rtt
谢谢myxiaonia提供的信息

教程在2楼
15楼有非调试模式的log记录方式的实现方式
30楼有非调试模式的补充
48楼有在sram中运行的补丁,感谢shangdawei
67楼,72楼有jlink升级的方式

图片来了:


先占位.....
慢慢上教程

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
 楼主| 发表于 2014-9-10 23:24:01 | 显示全部楼层
本帖最后由 gwnpeter 于 2014-9-11 00:14 编辑

顶顶.................
教程来了.............

1.安装SEGGER jlink V4.9以上版本,否则没有rtt软件
文件自己到 SEGGER 官网下载

2.jlink V8可以使用,但是安装了之后需要升级jlink...
升级失败的,自己搜索论坛哈,已经是讲了无数遍的东西了..................................................


3.确保keil目录下的JLinkARM.dll是最新版本的


4.ok啦.............可以开始了

就是加入rtt目录下面的4个文件
自己加一点代码.........
文件:

5.keil编译,并进入调试模式,全速运行

6.记得要打开J-Link RTT Client 哈.....................................


收工...................


存在问题:
怎么脱离调试模式运行.....还在研究中.........看看谁能指导一下

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
发表于 2014-9-10 23:30:33 | 显示全部楼层
是不是可以理解为是共享内存的实现思路。。。
发表于 2014-9-10 23:34:32 | 显示全部楼层
期待教程啊,还有文件下载以及4.9e版本的文件。
谢谢。
发表于 2014-9-10 23:40:20 | 显示全部楼层
mark 这个必须占位
发表于 2014-9-10 23:43:32 | 显示全部楼层
楼主最好能说明 是否jlink v8 或者v9 的,是否必须使用Setup_JLink_V490e.zip,RTT_Implementation_140806.zip 这个里面的代码怎么合进工程,keil 要怎么设置,Jlink ARM-OB 是否可以使用?
 楼主| 发表于 2014-9-10 23:48:18 | 显示全部楼层
mxzwish 发表于 2014-9-10 23:30
是不是可以理解为是共享内存的实现思路。。。

没错,就是jlink在运行的时候同时读取内存
发表于 2014-9-11 00:00:24 | 显示全部楼层
感觉和观察在线仿真变量的区别是,这个可以把过程记录输出在屏幕,可以输出在文件里吗?另外jlink解法是JTAG还是swd 接法?
 楼主| 发表于 2014-9-11 00:02:27 | 显示全部楼层
本帖最后由 gwnpeter 于 2014-9-11 00:03 编辑
ztg328 发表于 2014-9-10 23:43
楼主最好能说明 是否jlink v8 或者v9 的,是否必须使用Setup_JLink_V490e.zip,RTT_Implementation_140806. ...


V8可以,v9肯定可以,V7版本的OB就不清楚了。
Setup_JLink_V490e.zip这是必须的,或者你能找到文件吧keil里面的jlinkarm.dll直接用最新的覆盖了也行,keil里面的那个jlinkarm.dll才是实际用到的,
Setup_JLink_V490e  里面的 JLinkRTTClient.exe 反而不是一定的,用telnet也可以代替
RTT_Implementation_140806 里面的rtt目录下的文件要加入工程的,你有了就可以了

keil不用特别的设置,选择jlink仿真就是了,和平时用jlink一样
 楼主| 发表于 2014-9-11 00:05:12 | 显示全部楼层
本帖最后由 gwnpeter 于 2014-9-11 00:06 编辑
887799 发表于 2014-9-11 00:00
感觉和观察在线仿真变量的区别是,这个可以把过程记录输出在屏幕,可以输出在文件里吗?另外jlink解法是JTA ...


书上说jtag和swd都可以,我只是实验了swd接口

JLinkRTTLogger.exe这个就是专门用来log的,但是还没有搞清楚用法
发表于 2014-9-11 00:14:44 来自手机 | 显示全部楼层
lz真给力,这么快就搞定了,恭喜。。。
发表于 2014-9-11 00:19:21 来自手机 | 显示全部楼层
话说490e的驱动程序,我在家里和公司升级固件都失败了,不过还是很容易救活了
发表于 2014-9-11 00:22:04 来自手机 | 显示全部楼层
至于脱离调试模式运行,我估计直接运行rttclient即可,因为我以前用过jlink的swoviewer,也是直接就能输出的
 楼主| 发表于 2014-9-11 00:55:20 | 显示全部楼层
myxiaonia 发表于 2014-9-11 00:19
话说490e的驱动程序,我在家里和公司升级固件都失败了,不过还是很容易救活了 ...

如果老是升级失败,估计你要换个序列号了
 楼主| 发表于 2014-9-11 00:56:56 | 显示全部楼层
本帖最后由 gwnpeter 于 2014-9-11 01:34 编辑

直接运行rttclient还真的不行。不过搞定了JLinkRTTLogger,需要修改官方源代码

也不能说是修改官方代码,正规应该是在程序里调用 SEGGER_RTT_ConfigUpBuffer  函数,只是我略过了,直接修改了

static SEGGER_RTT_CB _SEGGER_RTT = {
  "SEGGER RTT",
  SEGGER_RTT_MAX_NUM_UP_BUFFERS,
  SEGGER_RTT_MAX_NUM_DOWN_BUFFERS,
  {{ "Terminal",         &_acUpBuffer[0],           BUFFER_SIZE_UP,   0, 0, SEGGER_RTT_MODE_NO_BLOCK_SKIP },
   { "Log",                 &_acUpBuffer1[0],          BUFFER_SIZE_UP,   0, 0, SEGGER_RTT_MODE_NO_BLOCK_SKIP }},
  {{ "Terminal",         &_acDownBuffer[0],         BUFFER_SIZE_DOWN, 0, 0, SEGGER_RTT_MODE_NO_BLOCK_SKIP },
   { "Log",                 &_acDownBuffer1[0],  BUFFER_SIZE_DOWN, 0, 0, SEGGER_RTT_MODE_NO_BLOCK_SKIP }},
};



ps:JLinkRTTLogger是在非调试模式下运行的,需要先用jlink下载好程序,并离开调试模式,全速运行。然后再打开JLinkRTTLogger进行记录的

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
发表于 2014-9-11 05:27:09 | 显示全部楼层
务实派,动作好快
发表于 2014-9-11 07:53:30 | 显示全部楼层
gwnpeter 发表于 2014-9-11 00:56
直接运行rttclient还真的不行。不过搞定了JLinkRTTLogger,需要修改官方源代码

也不能说是修改官方代码, ...

JLinkRTTLogger  这样的话就不能实时看到日志内容了,有点小遗憾啊
发表于 2014-9-11 08:11:41 | 显示全部楼层
小结一下:JLinkRTTLogger  是在非调试模式下运行的,输出记录在JLinkRTTLogger。
                 J-Link RTT Client 在调试模式下运行的,输出记录在屏幕。
非常感谢楼主的心得。
发表于 2014-9-11 08:16:46 | 显示全部楼层
我刚才试了一下,也成功了。
发表于 2014-9-11 08:19:01 | 显示全部楼层
要是ST——LINK也有这个功能就好了
发表于 2014-9-11 08:26:59 | 显示全部楼层
非调试模式 能直观显示出来就非常棒了
发表于 2014-9-11 08:28:45 | 显示全部楼层
先收藏 慢慢学习
发表于 2014-9-11 08:43:20 | 显示全部楼层
楼主的教程很清晰
发表于 2014-9-11 08:50:47 | 显示全部楼层

RTT Client 可以连接到 JLink, 但是无法读取缓冲区内容 ...


JLINK V9 EDU, STM32F103RE, IAR EWARM 7.20.2.7431







数据已经写入缓冲区



RTT Client 可以连接到 JLink, 但是无法读取缓冲区内容 ...









本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
 楼主| 发表于 2014-9-11 09:01:23 | 显示全部楼层
本帖最后由 gwnpeter 于 2014-9-11 09:02 编辑
shangdawei 发表于 2014-9-11 08:50
RTT Client 可以连接到 JLink, 但是无法读取缓冲区内容 ...


地址错啦吧!!?查查看

应该是检测  _SEGGER_RTT  里面的  acID[16]; 是不是  “SEGGER RTT”  来判断的

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
发表于 2014-9-11 09:03:07 | 显示全部楼层
点个赞!  不过这和printf调试 过程没多大优势呀?
发表于 2014-9-11 09:08:16 | 显示全部楼层
gwnpeter 发表于 2014-9-11 09:01
地址错啦吧!!?查查看

应该是检测  _SEGGER_RTT  里面的  acID[16]; 是不是  “SEGGER RTT”  来判断 ...


地址没错

如果用 SEGGERRTT 则搜索不到

SEGGER RTT 可以搜索到正确的地址

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
发表于 2014-9-11 09:12:43 | 显示全部楼层
这个很好啊,起码不用另外挂一个串口了
发表于 2014-9-11 09:13:54 | 显示全部楼层
这样调试起来就更方便了,
以前一直是用的串口。
 楼主| 发表于 2014-9-11 09:18:24 | 显示全部楼层
myxiaonia 发表于 2014-9-11 07:53
JLinkRTTLogger  这样的话就不能实时看到日志内容了,有点小遗憾啊

可以不过得..............

在程序里面修改一下,log的数据通道是1,Client的数据通道是0,程序请参考15楼
需要JLinkRTTLogger运行了,再打开Client,就可以直接看到数据了,不是在调试模式下的,可以在客户现场使用,很方便

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
发表于 2014-9-11 09:21:48 | 显示全部楼层
给力,收藏。。。
 楼主| 发表于 2014-9-11 09:23:27 | 显示全部楼层
shangdawei 发表于 2014-9-11 09:08
地址没错

如果用 SEGGERRTT 则搜索不到

看你的图片,Client是连接到IARIDE上面的,表示你现在是进入了IAR的调试模式,确认你的IAR是全速运行的??
发表于 2014-9-11 09:25:47 | 显示全部楼层
楼主动作真快,学习了
发表于 2014-9-11 09:26:58 | 显示全部楼层
gwnpeter 发表于 2014-9-11 09:23
看你的图片,Client是连接到IARIDE上面的,表示你现在是进入了IAR的调试模式,确认你的IAR是全速运行的? ...

不是全速运行, 是单步执行的, 我下载到Flash全速运行试试
发表于 2014-9-11 09:27:19 | 显示全部楼层
myxiaonia 发表于 2014-9-11 07:53
JLinkRTTLogger  这样的话就不能实时看到日志内容了,有点小遗憾啊

我记得昨天看你的帖子上官网好像看到上位机的SDK之类的东西. 等有时间我也试试
发表于 2014-9-11 09:28:54 | 显示全部楼层
gwnpeter 发表于 2014-9-11 09:18
可以不过得..............

在程序里面修改一下,log的数据通道是1,Client的数据通道是0,程序请参考15 ...

又更进一步了,测试时调试日志相当有效。
 楼主| 发表于 2014-9-11 09:32:12 | 显示全部楼层
本帖最后由 gwnpeter 于 2014-9-11 09:54 编辑
zky26 发表于 2014-9-11 09:03
点个赞!  不过这和printf调试 过程没多大优势呀?


最大的优势我觉得是 速度 ..........内存共享,所以 jlink理论上是和cpu并行的,不占用cpu时间,当然cpu调用SEGGER_RTT_printf的时间除外
如果uart没有加fifo,你得占用多长时间??如果加了fifo,是不是又要加uart的tx中断??
当然是不是又少了一个uart啦....
发表于 2014-9-11 09:38:29 | 显示全部楼层
gwnpeter 发表于 2014-9-11 09:32
最大的优势我觉得是 速度 ..........
如果uart没有加fifo,你得占用多长时间??如果加了fifo,是不是又 ...

的确省去了uart与pc机通信的时间,但是Jlink 通信也需要时间!对于人为的的调试,感觉不到速度的提升!  
但是你这种新的调试方法值得我们学习!谢谢!
 楼主| 发表于 2014-9-11 09:40:26 | 显示全部楼层
887799 发表于 2014-9-11 08:11
小结一下:JLinkRTTLogger  是在非调试模式下运行的,输出记录在JLinkRTTLogger。
                 J-Link ...

不完全正确,client必须附加在其他的进程上面的,所以....看30楼
发表于 2014-9-11 09:44:43 | 显示全部楼层
收藏回去弄,Jlink ARM-OB可用否?
发表于 2014-9-11 09:58:48 | 显示全部楼层
标记。有时间测试下。
发表于 2014-9-11 10:04:42 | 显示全部楼层
谢谢分享
发表于 2014-9-11 10:09:27 | 显示全部楼层
期待教程,谢谢分享
 楼主| 发表于 2014-9-11 10:11:42 | 显示全部楼层
mypear 发表于 2014-9-11 09:44
收藏回去弄,Jlink ARM-OB可用否?

网友 wangyu_2011   用过了,可以 OB
发表于 2014-9-11 10:12:24 | 显示全部楼层
这个好啊,立马试验,么有问题

链接:Setup_JLink_V490e 密码:nnf4
发表于 2014-9-11 10:16:37 | 显示全部楼层
试了一下,还得好好学习
发表于 2014-9-11 10:34:30 | 显示全部楼层
好,谢谢楼主,我也试试。
发表于 2014-9-11 10:58:59 | 显示全部楼层
本帖最后由 shangdawei 于 2014-9-11 11:01 编辑
gwnpeter 发表于 2014-9-11 09:01
地址错啦吧!!?查查看

应该是检测  _SEGGER_RTT  里面的  acID[16]; 是不是  “SEGGER RTT”  来判断 ...

//
// Allocate buffers for channel 0
//
static char _acUpBuffer  [BUFFER_SIZE_UP];
static char _acDownBuffer[BUFFER_SIZE_DOWN];
//
// Initialize SEGGER Real-time-Terminal control block (CB)
//
static SEGGER_RTT_CB _SEGGER_RTT = {
  "SEGGER RTT",
  SEGGER_RTT_MAX_NUM_UP_BUFFERS,
  SEGGER_RTT_MAX_NUM_DOWN_BUFFERS,
  {{ "Terminal", &_acUpBuffer[0],   sizeof(_acUpBuffer),   0, 0, SEGGER_RTT_MODE_NO_BLOCK_SKIP }},
  {{ "Terminal", &_acDownBuffer[0], sizeof(_acDownBuffer), 0, 0, SEGGER_RTT_MODE_NO_BLOCK_SKIP }},
};

_SEGGER_RTT 会有两个副本, 第一个副本用来初始化第二个副本
当在FLASH中运行, 第一个副本位于FLASH, 第二个副本位于SRAM, 程序启动时, 从第一个副本复制到第二个副本.
这样在SRAM中只有一个字符串 "SEGGER RTT" RTT 可以正确定位 _SEGGER_RTT 在 SRAM 中的地址 ( 搜索整个SRAM区域 )


当在SRAM中运行, 两个副本均在 SRAM, 这样 RTT 可能错误定位 _SEGGER_RTT 于用来初始化第二个副本的第一个副本
用来初始化第二个副本的第一个副本的 RING_BUFFER 的 WrOff 和 RdOff 一直是 0, 所以没有数据可读取.

修改 static SEGGER_RTT_CB _SEGGER_RTT = {  "SEGGER RTT", ...
成为 static SEGGER_RTT_CB _SEGGER_RTT = {  "SEGGER_RTT", ...

然后添加函数

void SEGGER_RTT_Init( void )
{
  _SEGGER_RTT.acID[6] = ' '; // SEGGER RTT
}

然后

  SEGGER_RTT_Init(); // 初始化之后, RTT 可以正确定位 _SEGGER_RTT 在 SRAM 中的地址 ( 搜索整个SRAM区域 )

  SEGGER_RTT_ConfigUpBuffer( 0, NULL, NULL, 0, SEGGER_RTT_MODE_BLOCK_IF_FIFO_FULL );
  SEGGER_RTT_WriteString( 0, "SEGGER Real-Time-Terminal Sample\r\n\r\n" );




发表于 2014-9-11 11:04:13 | 显示全部楼层
初始化之前搜索SRAM区域, 无法定位




初始化之后搜索SRAM区域, 可以定位


现在 SEGGER_RTT_WriteString(), 可以被读取了








本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
发表于 2014-9-11 11:09:44 | 显示全部楼层
gwnpeter 发表于 2014-9-11 10:11
网友 wangyu_2011   用过了,可以 OB

ok,今晚试试
 楼主| 发表于 2014-9-11 11:10:24 | 显示全部楼层
shangdawei 发表于 2014-9-11 10:58
//
// Allocate buffers for channel 0
//

晕,原来问题是程序在ram中运行......
之前就估计是地址的问题,因为我的keil的 _SEGGER_RTT起始地址  和 _acUpBuffer的起始地址   只相差几十个字节,而你的相差甚远。
还以为是iar编译器的原因,没有想到是程序在ram中运行..........
发表于 2014-9-11 11:12:10 | 显示全部楼层
楼主务实,感谢
发表于 2014-9-11 11:13:20 | 显示全部楼层
gwnpeter 发表于 2014-9-11 11:10
晕,原来问题是程序在ram中运行......
之前就估计是地址的问题,因为我的keil的 _SEGGER_RTT起始地址  和 ...

感谢提示, 否则解决不了这个问题.

赞一个!
发表于 2014-9-11 11:16:44 | 显示全部楼层
一定会火.............
发表于 2014-9-11 11:17:41 | 显示全部楼层
mypear 发表于 2014-9-11 09:44
收藏回去弄,Jlink ARM-OB可用否?

可用, 我的就是自己做的3根线的那种, 如图

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
发表于 2014-9-11 11:17:47 | 显示全部楼层
需要升级SEGGE版本啊,会提示升级固件,JLINK8貌似升级变砖,只能刷回。
发表于 2014-9-11 11:18:59 | 显示全部楼层
这绝对是好东西啊...........支持啊....
发表于 2014-9-11 11:19:35 | 显示全部楼层
huangqi412 发表于 2014-9-11 11:17
需要升级SEGGE版本啊,会提示升级固件,JLINK8貌似升级变砖,只能刷回。

修改一下序列号看看
发表于 2014-9-11 11:22:10 | 显示全部楼层
shangdawei 发表于 2014-9-11 11:19
修改一下序列号看看

如何修改序列号,这个还真没用过
发表于 2014-9-11 11:22:33 | 显示全部楼层
还有序列号修改成什么样合适
发表于 2014-9-11 11:25:27 | 显示全部楼层
在SRAM调试解决方法

修改 static SEGGER_RTT_CB _SEGGER_RTT = {  "SEGGER RTT", ...
成为 static SEGGER_RTT_CB _SEGGER_RTT = {  "SEGGER_RTT", ...

然后添加函数

void SEGGER_RTT_Init( int UpFlags, int DownFlags )
{
  _SEGGER_RTT.acID[6] = ' '; // SEGGER RTT  _SEGGER_RTT.aUp[ 0 ].Flags = UpFlags;
  _SEGGER_RTT.aDown[ 0 ].Flags = DownFlags;
}

  // 初始化之后, RTT 可以正确定位 _SEGGER_RTT 在 SRAM 中的地址 ( 搜索整个SRAM区域 )
  SEGGER_RTT_Init( SEGGER_RTT_MODE_NO_BLOCK_SKIP, SEGGER_RTT_MODE_NO_BLOCK_SKIP );
  SEGGER_RTT_WriteString( 0, "SEGGER Real-Time-Terminal Sample\r\n\r\n" );

发表于 2014-9-11 11:25:50 | 显示全部楼层
gwnpeter 发表于 2014-9-10 23:24
顶顶.................
教程来了.............

升级成功了,但是被认为是Clone的;有什么办法绕过这个吗?
发表于 2014-9-11 11:27:40 | 显示全部楼层
li.wen 发表于 2014-9-11 11:25
升级成功了,但是被认为是Clone的;有什么办法绕过这个吗?

修改一下序列号看看
发表于 2014-9-11 11:33:49 | 显示全部楼层
动作却是块,支持一下
 楼主| 发表于 2014-9-11 11:40:00 | 显示全部楼层
huangqi412 发表于 2014-9-11 11:22
还有序列号修改成什么样合适

(急!急!)烧写程序时,出现the emulator is JLink-Clone, the segger...
http://www.amobbs.com/thread-5529411-1-1.html
(出处: amoBBS 阿莫电子论坛)

12楼正解
发表于 2014-9-11 11:47:02 | 显示全部楼层
IAR的有没有这个功能?
发表于 2014-9-11 11:47:47 | 显示全部楼层
打开J-LINK   COMMANDER中输入 : exec setsn=xxxxxxxx 即可


打开segger自带的jlink commander,这时会跳出一个界面叫我们更新最新的firmware,到这里一定先不要更新;
我们需要做的工作是修改jlink的SN码,当然了在之前的修改V8.bin固件里面也可以完成这一步骤,但修改的相对
麻烦,还得找SN码的OFFset,但是在commander里面直接一个指令就可以很方便的修改:Exec SetSN=xxxxxxxx,
但是这个SN码千万不能是11111117 或 805306163,因为SEGGER正是对这两个固件SN进行了强制校验,修改为其他
值才可以完美地达到我们的目的。

发表于 2014-9-11 11:52:11 | 显示全部楼层
ysu533 发表于 2014-9-11 11:17
可用, 我的就是自己做的3根线的那种, 如图

我也是自己弄的SWD
发表于 2014-9-11 11:54:23 | 显示全部楼层
huangqi412 发表于 2014-9-11 11:17
需要升级SEGGE版本啊,会提示升级固件,JLINK8貌似升级变砖,只能刷回。

重新刷下固件后一般都能成功升级了
发表于 2014-9-11 11:59:13 | 显示全部楼层
shangdawei 发表于 2014-9-11 11:25
在SRAM调试解决方法

修改 static SEGGER_RTT_CB _SEGGER_RTT = {  "SEGGER RTT", ...

nice   建议将此楼设置为置顶
发表于 2014-9-11 12:00:59 | 显示全部楼层
慢慢看看。
发表于 2014-9-11 12:03:50 | 显示全部楼层
shangdawei 发表于 2014-9-11 11:47
打开J-LINK   COMMANDER中输入 : exec setsn=xxxxxxxx 即可

谢谢,亲测成功!
总结下来简单的几步:
1. 装4.90e的驱动
2. 识别为Clone;所以刷老固件
3. 设SN;我设置的是和楼主一样的87878787
4. 由Keil自动升级最新固件
5. OK
发表于 2014-9-11 12:24:10 | 显示全部楼层
原来改序列号即可,呵呵。

没有看代码,不知道会不会缓冲区不够的时候替换老的。
发表于 2014-9-11 12:35:19 | 显示全部楼层
调试好帮手啊,晚点再试试
发表于 2014-9-11 12:35:27 | 显示全部楼层
gwnpeter 发表于 2014-9-11 00:56
直接运行rttclient还真的不行。不过搞定了JLinkRTTLogger,需要修改官方源代码

也不能说是修改官方代码, ...

调试模式下可以打印了       非调试模式下,这样修改后,还是不能打印      Log貌似没识别成功
 楼主| 发表于 2014-9-11 12:56:22 | 显示全部楼层
abutter 发表于 2014-9-11 12:24
原来改序列号即可,呵呵。

没有看代码,不知道会不会缓冲区不够的时候替换老的。 ...

#define SEGGER_RTT_MODE_NO_BLOCK_SKIP         (0)
#define SEGGER_RTT_MODE_NO_BLOCK_TRIM         (1 << 0)
#define SEGGER_RTT_MODE_BLOCK_IF_FIFO_FULL    (1 << 1)

三种模式可以设置
 楼主| 发表于 2014-9-11 13:01:20 | 显示全部楼层
leijiayou 发表于 2014-9-11 12:35
调试模式下可以打印了       非调试模式下,这样修改后,还是不能打印      Log貌似没识别成功 ...

确认你的程序是好的,下载程序之后,要退出keil的调试模式,否则keil会和JLinkRTTLogger冲突
你打开JLinkRTTClient看看里面的   process  是不是JLinkRTTLogger,
如果是uv4,代表现在是keil在占用了jlink
发表于 2014-9-11 13:32:48 | 显示全部楼层
leijiayou 发表于 2014-9-11 12:35
调试模式下可以打印了       非调试模式下,这样修改后,还是不能打印      Log貌似没识别成功 ...

Log 模式需要使用 Channel 1 : 添加另外一组缓冲区


SEGGER_RTT_printf(1, ... )



static char _acUpBuffer1[ BUFFER_SIZE_UP ];
static char _acDownBuffer1[ BUFFER_SIZE_DOWN ];

static SEGGER_RTT_CB _SEGGER_RTT = {
  "SEGGER RTT",
  SEGGER_RTT_MAX_NUM_UP_BUFFERS,
  SEGGER_RTT_MAX_NUM_DOWN_BUFFERS,
  {{ "Terminal",         &_acUpBuffer[0],           BUFFER_SIZE_UP,   0, 0, SEGGER_RTT_MODE_NO_BLOCK_SKIP },
   { "Log",                 &_acUpBuffer1[0],          BUFFER_SIZE_UP,   0, 0, SEGGER_RTT_MODE_NO_BLOCK_SKIP }},
  {{ "Terminal",         &_acDownBuffer[0],         BUFFER_SIZE_DOWN, 0, 0, SEGGER_RTT_MODE_NO_BLOCK_SKIP },
   { "Log",                 &_acDownBuffer1[0],  BUFFER_SIZE_DOWN, 0, 0, SEGGER_RTT_MODE_NO_BLOCK_SKIP }},
};


RTT multiple channels

So I reckon there is some API to address the debugger hardware to read out the other buffers as well?

Yes, there is. Can be accessed via the J-Link SDK.
The RTT Client does not read other channels than 0 because it is undefined in what format data comes over there... this would probably result in garbage being shown...
The RTT client is *an example* for using RTT for printf. As said, it is just an example for what RTT can be used.

We are currently working on a utility called RTT-Logger which will capture data on channel 1 and just store it to a file (just in binary form as it comes from the target, so a third party application can evaluate this data)

The executable will be part of one of the next J-Link software versions.
The source code will be available for J-Link SDK Users.





本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
发表于 2014-9-11 13:35:03 | 显示全部楼层
在segger RTT里边打印出来的东西可以复制到记事本里面不???
发表于 2014-9-11 13:36:39 | 显示全部楼层
mark!!!谢谢!
发表于 2014-9-11 13:46:20 | 显示全部楼层
gwnpeter 发表于 2014-9-11 13:01
确认你的程序是好的,下载程序之后,要退出keil的调试模式,否则keil会和JLinkRTTLogger冲突
你打开JLink ...


代码改成这样         然后用jlink下载程序      再打开JLinkRTTLogger

就变成这样了      

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
发表于 2014-9-11 13:48:37 | 显示全部楼层
shangdawei 发表于 2014-9-11 13:32
Log 模式需要使用 Channel 1 : 添加另外一组缓冲区

你好,代码改了     然后     SEGGER_RTT_printf(1,"len=%d\r\n",len);    没用         看上面的回复
发表于 2014-9-11 13:48:44 | 显示全部楼层
xl1736 发表于 2014-9-11 13:35
在segger RTT里边打印出来的东西可以复制到记事本里面不???

C:\Program Files (x86)\SEGGER>jlinkrttclient >> c:\log.txt

打开 c:\log.txt 文件查看
 楼主| 发表于 2014-9-11 13:49:30 | 显示全部楼层
leijiayou 发表于 2014-9-11 13:46
代码改成这样         然后用jlink下载程序      再打开JLinkRTTLogger

就变成这样了       ...

晕...........这是提示你要你输入信息,手工打字输入  stm32f103c8 或者你的mcu型号
下面的哪几行直接回车使用默认值就行了
发表于 2014-9-11 13:52:55 | 显示全部楼层
leijiayou 发表于 2014-9-11 13:48
你好,代码改了     然后     SEGGER_RTT_printf(1,"len=%d\r\n",len);    没用         看上面的回复 ...

设备名可以通过对话框选择的

我测试了文件名输入 c:\log.txt 可以的
发表于 2014-9-11 13:54:27 | 显示全部楼层
MARK不错,学习了...
发表于 2014-9-11 13:54:34 | 显示全部楼层
sokou 发表于 2014-9-11 11:47
IAR的有没有这个功能?

IAR EWARM 可以用的
发表于 2014-9-11 13:54:59 | 显示全部楼层
试验成功!!!感谢分享
发表于 2014-9-11 13:55:35 | 显示全部楼层
gwnpeter 发表于 2014-9-11 13:49
晕...........这是提示你要你输入信息,手工打字输入  stm32f103c8 或者你的mcu型号
下面的哪几行直接回 ...

谢谢          是的     输入后,一直按回车       但是到最后就闪退。。。。
发表于 2014-9-11 14:07:58 | 显示全部楼层
有没有办法让MDK或者IAR在点完调试按钮后自动启动RTT Client,结束调试后自动关闭?
发表于 2014-9-11 14:09:09 | 显示全部楼层
gwnpeter 发表于 2014-9-11 13:49
晕...........这是提示你要你输入信息,手工打字输入  stm32f103c8 或者你的mcu型号
下面的哪几行直接回 ...

出现这界面,然后马上闪退

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
 楼主| 发表于 2014-9-11 14:09:19 | 显示全部楼层
本帖最后由 gwnpeter 于 2014-9-11 14:17 编辑
leijiayou 发表于 2014-9-11 13:55
谢谢          是的     输入后,一直按回车       但是到最后就闪退。。。。


按键太快,你会看不到黄色这行字的


如果不是这个原因,
打开client看看,是不是这样的


另外你输入 stm32f103ze 试试,不加t6

还有一个,你的cpu下载之后程序有没有运行了,试试复位看看

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
发表于 2014-9-11 14:17:48 | 显示全部楼层
\033 不能用...
发表于 2014-9-11 14:25:53 | 显示全部楼层
myxiaonia 发表于 2014-9-11 07:53
JLinkRTTLogger  这样的话就不能实时看到日志内容了,有点小遗憾啊

JLink Logger和JLink Client同时运行就能实时输出内容,不需要进入调试模式。
发表于 2014-9-11 14:28:47 | 显示全部楼层
shandian 发表于 2014-9-11 14:07
有没有办法让MDK或者IAR在点完调试按钮后自动启动RTT Client,结束调试后自动关闭? ...

RTT Client可以一直开在那儿,不影响调试。
发表于 2014-9-11 14:40:40 | 显示全部楼层
gwnpeter 发表于 2014-9-11 14:09
按键太快,你会看不到黄色这行字的


安装你说的试了    还是之前那个样         按的很慢也是一样      程序是在运行          情况如图

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
发表于 2014-9-11 14:51:55 | 显示全部楼层
连续printf,速度29KB/s。



SWO的有500多KB/s

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
发表于 2014-9-11 14:53:15 | 显示全部楼层
leijiayou 发表于 2014-9-11 14:09
出现这界面,然后马上闪退

你要确定在C盘确实有个temp的文件夹,然后里面确实有个文件名为RTT.log才行  对于RTT Loger而言 是不会主动创建文件的 所以你要提前建立好才行
我刚开始也是这样不知道为什么 然后试着创建了文件后就可以了
发表于 2014-9-11 15:04:35 | 显示全部楼层
湛无双 发表于 2014-9-11 14:53
你要确定在C盘确实有个temp的文件夹,然后里面确实有个文件名为RTT.log才行  对于RTT Loger而言 是不会主 ...

非常感谢。。。。    就是这个原因导致的,我重新建一个文件就OK 了          但是现在又出现问题了      
即 log这边数据量有更新,打算client那边不能打印出来。。。。。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
发表于 2014-9-11 15:17:02 | 显示全部楼层
leijiayou 发表于 2014-9-11 15:04
非常感谢。。。。    就是这个原因导致的,我重新建一个文件就OK 了          但是现在又出 ...

确实打印不出来 但是你可以打开那个RTT.Log这个文件 输出的都到了这个文件里面 并且是实时保存的。 我觉得这也算是离线调试的一个不足之处吧,就是只能输出到电脑 并不能输入控制 应该是这样的了
友情提示:标题不合格、重复发帖,将会被封锁ID。详情请参考:论坛通告:封锁ID、获得注册邀请码、恢复被封ID、投诉必读
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|阿莫电子论坛(原ourAVR/ourDEV) ( 工信部备案:粤ICP备09047143号 公安备案:44190002001997(交互式论坛) )

GMT+8, 2018-5-25 05:45

阿莫电子论坛, 原"中国电子开发网"

© 2004-2018 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表