amobbs.com 阿莫电子技术论坛

标题: 开贴研究:JLINK RTT,完爆各种printf形式,从此swo是路人 [打印本页]

作者: gwnpeter    时间: 2014-9-10 22:53
标题: 开贴研究:JLINK RTT,完爆各种printf形式,从此swo是路人
本帖最后由 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升级的方式

图片来了:
[attach]219569[/attach]
[attach]219570[/attach]
先占位.....
慢慢上教程

作者: gwnpeter    时间: 2014-9-10 23:24
本帖最后由 gwnpeter 于 2014-9-11 00:14 编辑

顶顶.................
教程来了.............
[attach]219577[/attach]
1.安装SEGGER jlink V4.9以上版本,否则没有rtt软件
文件自己到 SEGGER 官网下载

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

3.确保keil目录下的JLinkARM.dll是最新版本的
[attach]219582[/attach]

4.ok啦.............可以开始了
[attach]219584[/attach]
就是加入rtt目录下面的4个文件
自己加一点代码.........
文件:[attach]219585[/attach]

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

6.记得要打开J-Link RTT Client 哈.....................................
[attach]219586[/attach]

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


存在问题:
怎么脱离调试模式运行.....还在研究中.........看看谁能指导一下
作者: mxzwish    时间: 2014-9-10 23:30
是不是可以理解为是共享内存的实现思路。。。
作者: sblpp    时间: 2014-9-10 23:34
期待教程啊,还有文件下载以及4.9e版本的文件。
谢谢。
作者: ztg328    时间: 2014-9-10 23:40
mark 这个必须占位
作者: ztg328    时间: 2014-9-10 23:43
楼主最好能说明 是否jlink v8 或者v9 的,是否必须使用Setup_JLink_V490e.zip,RTT_Implementation_140806.zip 这个里面的代码怎么合进工程,keil 要怎么设置,Jlink ARM-OB 是否可以使用?
作者: gwnpeter    时间: 2014-9-10 23:48
mxzwish 发表于 2014-9-10 23:30
是不是可以理解为是共享内存的实现思路。。。

没错,就是jlink在运行的时候同时读取内存
作者: 887799    时间: 2014-9-11 00:00
感觉和观察在线仿真变量的区别是,这个可以把过程记录输出在屏幕,可以输出在文件里吗?另外jlink解法是JTAG还是swd 接法?
作者: gwnpeter    时间: 2014-9-11 00:02
本帖最后由 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一样
作者: gwnpeter    时间: 2014-9-11 00:05
本帖最后由 gwnpeter 于 2014-9-11 00:06 编辑
887799 发表于 2014-9-11 00:00
感觉和观察在线仿真变量的区别是,这个可以把过程记录输出在屏幕,可以输出在文件里吗?另外jlink解法是JTA ...


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

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

如果老是升级失败,估计你要换个序列号了
作者: gwnpeter    时间: 2014-9-11 00: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 }},
};

[attach]219593[/attach]

ps:JLinkRTTLogger是在非调试模式下运行的,需要先用jlink下载好程序,并离开调试模式,全速运行。然后再打开JLinkRTTLogger进行记录的
作者: lmhtz    时间: 2014-9-11 05:27
务实派,动作好快
作者: myxiaonia    时间: 2014-9-11 07:53
gwnpeter 发表于 2014-9-11 00:56
直接运行rttclient还真的不行。不过搞定了JLinkRTTLogger,需要修改官方源代码

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

JLinkRTTLogger  这样的话就不能实时看到日志内容了,有点小遗憾啊
作者: 887799    时间: 2014-9-11 08:11
小结一下:JLinkRTTLogger  是在非调试模式下运行的,输出记录在JLinkRTTLogger。
                 J-Link RTT Client 在调试模式下运行的,输出记录在屏幕。
非常感谢楼主的心得。
作者: wangyu_2011    时间: 2014-9-11 08:16
我刚才试了一下,也成功了。

作者: johncoop    时间: 2014-9-11 08:19
要是ST——LINK也有这个功能就好了
作者: 4058665    时间: 2014-9-11 08:26
非调试模式 能直观显示出来就非常棒了
作者: lzyr    时间: 2014-9-11 08:28
先收藏 慢慢学习
作者: gamep    时间: 2014-9-11 08:43
楼主的教程很清晰
作者: shangdawei    时间: 2014-9-11 08:50

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


JLINK V9 EDU, STM32F103RE, IAR EWARM 7.20.2.7431

[attach]219601[/attach]


[attach]219609[/attach]


数据已经写入缓冲区

[attach]219608[/attach]

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

[attach]219599[/attach]

[attach]219600[/attach]






作者: gwnpeter    时间: 2014-9-11 09:01
本帖最后由 gwnpeter 于 2014-9-11 09:02 编辑
shangdawei 发表于 2014-9-11 08:50
RTT Client 可以连接到 JLink, 但是无法读取缓冲区内容 ...


地址错啦吧!!?查查看
[attach]219624[/attach]
应该是检测  _SEGGER_RTT  里面的  acID[16]; 是不是  “SEGGER RTT”  来判断的
作者: zky26    时间: 2014-9-11 09:03
点个赞!  不过这和printf调试 过程没多大优势呀?
作者: shangdawei    时间: 2014-9-11 09:08
gwnpeter 发表于 2014-9-11 09:01
地址错啦吧!!?查查看

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

[attach]219626[/attach]
地址没错

如果用 SEGGERRTT 则搜索不到

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


作者: ssavr568    时间: 2014-9-11 09:12
这个很好啊,起码不用另外挂一个串口了
作者: ddz123abcdef    时间: 2014-9-11 09:13
这样调试起来就更方便了,
以前一直是用的串口。
作者: gwnpeter    时间: 2014-9-11 09:18
myxiaonia 发表于 2014-9-11 07:53
JLinkRTTLogger  这样的话就不能实时看到日志内容了,有点小遗憾啊

可以不过得..............
[attach]219628[/attach]
在程序里面修改一下,log的数据通道是1,Client的数据通道是0,程序请参考15楼
需要JLinkRTTLogger运行了,再打开Client,就可以直接看到数据了,不是在调试模式下的,可以在客户现场使用,很方便
作者: rgzdb    时间: 2014-9-11 09:21
给力,收藏。。。
作者: gwnpeter    时间: 2014-9-11 09:23
shangdawei 发表于 2014-9-11 09:08
地址没错

如果用 SEGGERRTT 则搜索不到

看你的图片,Client是连接到IARIDE上面的,表示你现在是进入了IAR的调试模式,确认你的IAR是全速运行的??
作者: 落叶随风    时间: 2014-9-11 09:25
楼主动作真快,学习了
作者: shangdawei    时间: 2014-9-11 09:26
gwnpeter 发表于 2014-9-11 09:23
看你的图片,Client是连接到IARIDE上面的,表示你现在是进入了IAR的调试模式,确认你的IAR是全速运行的? ...

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

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

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

又更进一步了,测试时调试日志相当有效。
作者: gwnpeter    时间: 2014-9-11 09:32
本帖最后由 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啦....
作者: zky26    时间: 2014-9-11 09:38
gwnpeter 发表于 2014-9-11 09:32
最大的优势我觉得是 速度 ..........
如果uart没有加fifo,你得占用多长时间??如果加了fifo,是不是又 ...

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

不完全正确,client必须附加在其他的进程上面的,所以....看30楼
作者: mypear    时间: 2014-9-11 09:44
收藏回去弄,Jlink ARM-OB可用否?
作者: 32MCU    时间: 2014-9-11 09:58
标记。有时间测试下。
作者: boycn    时间: 2014-9-11 10:04
谢谢分享
作者: zzage    时间: 2014-9-11 10:09
期待教程,谢谢分享
作者: gwnpeter    时间: 2014-9-11 10:11
mypear 发表于 2014-9-11 09:44
收藏回去弄,Jlink ARM-OB可用否?

网友 wangyu_2011   用过了,可以 OB
作者: hushaoxin    时间: 2014-9-11 10:12
这个好啊,立马试验,么有问题

链接:Setup_JLink_V490e 密码:nnf4
作者: lyl2022    时间: 2014-9-11 10:16
试了一下,还得好好学习
作者: Excellence    时间: 2014-9-11 10:34
好,谢谢楼主,我也试试。
作者: shangdawei    时间: 2014-9-11 10:58
本帖最后由 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" );





作者: shangdawei    时间: 2014-9-11 11:04
初始化之前搜索SRAM区域, 无法定位

[attach]219677[/attach]


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

[attach]219676[/attach]
现在 SEGGER_RTT_WriteString(), 可以被读取了

[attach]219678[/attach]


[attach]219681[/attach]




作者: mypear    时间: 2014-9-11 11:09
gwnpeter 发表于 2014-9-11 10:11
网友 wangyu_2011   用过了,可以 OB

ok,今晚试试
作者: gwnpeter    时间: 2014-9-11 11:10
shangdawei 发表于 2014-9-11 10:58
//
// Allocate buffers for channel 0
//

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

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

赞一个!
作者: RainKing    时间: 2014-9-11 11:16
一定会火.............
作者: ysu533    时间: 2014-9-11 11:17
mypear 发表于 2014-9-11 09:44
收藏回去弄,Jlink ARM-OB可用否?

可用, 我的就是自己做的3根线的那种, 如图
[attach]219683[/attach]
作者: huangqi412    时间: 2014-9-11 11:17
需要升级SEGGE版本啊,会提示升级固件,JLINK8貌似升级变砖,只能刷回。
作者: RainKing    时间: 2014-9-11 11:18
这绝对是好东西啊...........支持啊....
作者: shangdawei    时间: 2014-9-11 11:19
huangqi412 发表于 2014-9-11 11:17
需要升级SEGGE版本啊,会提示升级固件,JLINK8貌似升级变砖,只能刷回。

修改一下序列号看看
作者: huangqi412    时间: 2014-9-11 11:22
shangdawei 发表于 2014-9-11 11:19
修改一下序列号看看

如何修改序列号,这个还真没用过
作者: huangqi412    时间: 2014-9-11 11:22
还有序列号修改成什么样合适
作者: shangdawei    时间: 2014-9-11 11:25
在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" );


作者: li.wen    时间: 2014-9-11 11:25
gwnpeter 发表于 2014-9-10 23:24
顶顶.................
教程来了.............

升级成功了,但是被认为是Clone的;有什么办法绕过这个吗?
作者: shangdawei    时间: 2014-9-11 11:27
li.wen 发表于 2014-9-11 11:25
升级成功了,但是被认为是Clone的;有什么办法绕过这个吗?

修改一下序列号看看
作者: honami520    时间: 2014-9-11 11:33
动作却是块,支持一下
作者: gwnpeter    时间: 2014-9-11 11:40
huangqi412 发表于 2014-9-11 11:22
还有序列号修改成什么样合适

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

12楼正解
作者: sokou    时间: 2014-9-11 11:47
IAR的有没有这个功能?
作者: shangdawei    时间: 2014-9-11 11: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进行了强制校验,修改为其他
值才可以完美地达到我们的目的。


作者: mypear    时间: 2014-9-11 11:52
ysu533 发表于 2014-9-11 11:17
可用, 我的就是自己做的3根线的那种, 如图

我也是自己弄的SWD
作者: myxiaonia    时间: 2014-9-11 11:54
huangqi412 发表于 2014-9-11 11:17
需要升级SEGGE版本啊,会提示升级固件,JLINK8貌似升级变砖,只能刷回。

重新刷下固件后一般都能成功升级了
作者: myxiaonia    时间: 2014-9-11 11:59
shangdawei 发表于 2014-9-11 11:25
在SRAM调试解决方法

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

nice   建议将此楼设置为置顶
作者: niklasmen    时间: 2014-9-11 12:00
慢慢看看。
作者: li.wen    时间: 2014-9-11 12:03
shangdawei 发表于 2014-9-11 11:47
打开J-LINK   COMMANDER中输入 : exec setsn=xxxxxxxx 即可

谢谢,亲测成功!
总结下来简单的几步:
1. 装4.90e的驱动
2. 识别为Clone;所以刷老固件
3. 设SN;我设置的是和楼主一样的87878787
4. 由Keil自动升级最新固件
5. OK

作者: abutter    时间: 2014-9-11 12:24
原来改序列号即可,呵呵。

没有看代码,不知道会不会缓冲区不够的时候替换老的。
作者: 卡斯发动机    时间: 2014-9-11 12:35
调试好帮手啊,晚点再试试
作者: leijiayou    时间: 2014-9-11 12:35
gwnpeter 发表于 2014-9-11 00:56
直接运行rttclient还真的不行。不过搞定了JLinkRTTLogger,需要修改官方源代码

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

调试模式下可以打印了       非调试模式下,这样修改后,还是不能打印      Log貌似没识别成功
作者: gwnpeter    时间: 2014-9-11 12:56
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)

三种模式可以设置
作者: gwnpeter    时间: 2014-9-11 13:01
leijiayou 发表于 2014-9-11 12:35
调试模式下可以打印了       非调试模式下,这样修改后,还是不能打印      Log貌似没识别成功 ...

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

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

[attach]219721[/attach]
SEGGER_RTT_printf(1, ... )

[attach]219722[/attach]

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.






作者: xl1736    时间: 2014-9-11 13:35
在segger RTT里边打印出来的东西可以复制到记事本里面不???
作者: dgtg    时间: 2014-9-11 13:36
mark!!!谢谢!
作者: leijiayou    时间: 2014-9-11 13:46
gwnpeter 发表于 2014-9-11 13:01
确认你的程序是好的,下载程序之后,要退出keil的调试模式,否则keil会和JLinkRTTLogger冲突
你打开JLink ...

[attach]219726[/attach]
代码改成这样         然后用jlink下载程序      再打开JLinkRTTLogger[attach]219730[/attach]

就变成这样了      
作者: leijiayou    时间: 2014-9-11 13:48
shangdawei 发表于 2014-9-11 13:32
Log 模式需要使用 Channel 1 : 添加另外一组缓冲区

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

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

打开 c:\log.txt 文件查看
作者: gwnpeter    时间: 2014-9-11 13:49
leijiayou 发表于 2014-9-11 13:46
代码改成这样         然后用jlink下载程序      再打开JLinkRTTLogger

就变成这样了       ...

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

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

我测试了文件名输入 c:\log.txt 可以的
作者: qq910130528    时间: 2014-9-11 13:54
MARK不错,学习了...
作者: shangdawei    时间: 2014-9-11 13:54
sokou 发表于 2014-9-11 11:47
IAR的有没有这个功能?

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

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

[attach]219740[/attach]出现这界面,然后马上闪退
作者: gwnpeter    时间: 2014-9-11 14:09
本帖最后由 gwnpeter 于 2014-9-11 14:17 编辑
leijiayou 发表于 2014-9-11 13:55
谢谢          是的     输入后,一直按回车       但是到最后就闪退。。。。


按键太快,你会看不到黄色这行字的
[attach]219738[/attach]

如果不是这个原因,
打开client看看,是不是这样的
[attach]219741[/attach]

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

还有一个,你的cpu下载之后程序有没有运行了,试试复位看看
作者: 紫胤真人    时间: 2014-9-11 14:17
\033 不能用...
作者: canger    时间: 2014-9-11 14:25
myxiaonia 发表于 2014-9-11 07:53
JLinkRTTLogger  这样的话就不能实时看到日志内容了,有点小遗憾啊

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

RTT Client可以一直开在那儿,不影响调试。
作者: leijiayou    时间: 2014-9-11 14:40
gwnpeter 发表于 2014-9-11 14:09
按键太快,你会看不到黄色这行字的

[attach]219763[/attach]
安装你说的试了    还是之前那个样         按的很慢也是一样      程序是在运行          情况如图
作者: caixiuwen    时间: 2014-9-11 14:51
连续printf,速度29KB/s。
[attach]219765[/attach]

[attach]219766[/attach]
SWO的有500多KB/s
作者: 湛无双    时间: 2014-9-11 14:53
leijiayou 发表于 2014-9-11 14:09
出现这界面,然后马上闪退

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

非常感谢。。。。    就是这个原因导致的,我重新建一个文件就OK 了          但是现在又出现问题了       [attach]219771[/attach]
即 log这边数据量有更新,打算client那边不能打印出来。。。。。
作者: 湛无双    时间: 2014-9-11 15:17
leijiayou 发表于 2014-9-11 15:04
非常感谢。。。。    就是这个原因导致的,我重新建一个文件就OK 了          但是现在又出 ...

确实打印不出来 但是你可以打开那个RTT.Log这个文件 输出的都到了这个文件里面 并且是实时保存的。 我觉得这也算是离线调试的一个不足之处吧,就是只能输出到电脑 并不能输入控制 应该是这样的了




欢迎光临 amobbs.com 阿莫电子技术论坛 (https://www.amobbs.com/) Powered by Discuz! X3.4