数码之家

 找回密码
 立即注册

QQ登录

只需一步,快速开始

微信登录

微信扫一扫,快速登录

搜索
查看: 3639|回复: 11

[ARM] 推荐jlink rtt 打印调试信息

[复制链接]
发表于 2020-4-9 11:14:41 | 显示全部楼层 |阅读模式
玩单片机的应该都用过串口printf打印调试信息,哪怕用了jlink可以在线调试,有时候还是想打印一些信息,这样就需要多用一条tx线,同时还会占用一个IO,如果jlink不支持虚拟串口还得再用个ttl,比较费劲,某日灵光一闪,jlink能不能直接输出调试信息,度娘了一下还真有,在这分享下吧,没太多测试,不知道有什么bug,热衷串口的也不要喷,没说谁好谁坏,想用哪个用哪个。

注:主要针对jlink,stlink不知道有没有类似的,没研究,jlink驱动升级到4.9以上

库下载
http://download.segger.com/J-Link/RTT/RTT_Implementation_140925.zip

SEGGER_RTT.c
SEGGER_RTT.h
SEGGER_RTT_Conf.h
SEGGER_RTT_printf.c
把这四个文件引入项目,需要打印信息的地方引用SEGGER_RTT.h,然后用SEGGER_RTT_printf打印。
代码下载后连接好jlink,板子上电,找到jlink安装目录,打开J-Link RTT Viewer(没有的升级jlink),Specify Target Device选择自己的单片机,然后OK,信息打印



如果无效可以尝试SEGGER_RTT_Init();初始化一下,同时按照开发环境引入RTT_Syscalls_KEIL.c或者RTT_Syscalls_IAR.c

如果习惯用printf打印的,可以修改下SEGGER_RTT.c 文件,加入#include "stdio.h"引用
最下方加入
  1. int fputc(int ch, FILE *f)       
  2. {       
  3.   const char c=(char) ch;
  4.   SEGGER_RTT_Write(0,&c,1);
  5.   return ch;       
  6. }
复制代码
然后就可以使用printf正常打印了。

PS:测试了下SEGGER_RTT_printf和printf重映射,SEGGER_RTT_printf对于%i,%e,%f,%o都是不支持的
  1. SEGGER_RTT_printf(0,"SEGGER_RTT_printf c %c,d %d,i %i,e %e,f %f,o %o,x %x\r\n",'A',10,10,10,10.1,10,10);
  2. printf("printf c %c,d %d,i %i,e %e,f %f,o %o,x %x\r\n",'A',10,10,10.1,10.1,10,10);
复制代码
大概看了下源码,应该是支持 %c %d %u %x %s %p,也够用了
  1. switch (c) {
  2.       case 'c': {
  3.         char c0;
  4.         v = va_arg(*pParamList, int);
  5.         c0 = (char)v;
  6.         _StoreChar(&BufferDesc, c0);
  7.         break;
  8.       }
  9.       case 'd':
  10.         v = va_arg(*pParamList, int);
  11.         _PrintInt(&BufferDesc, v, 10, NumDigits, FieldWidth, FormatFlags);
  12.         break;
  13.       case 'u':
  14.         v = va_arg(*pParamList, int);
  15.         _PrintUnsigned(&BufferDesc, v, 10, NumDigits, FieldWidth, FormatFlags);
  16.         break;
  17.       case 'x':
  18.       case 'X':
  19.         v = va_arg(*pParamList, int);
  20.         _PrintUnsigned(&BufferDesc, v, 16, NumDigits, FieldWidth, FormatFlags);
  21.         break;
  22.       case 's':
  23.         {
  24.           const char * s = va_arg(*pParamList, const char *);
  25.           do {
  26.             c = *s++;
  27.             if (c == 0) {
  28.               break;
  29.             }
  30.            _StoreChar(&BufferDesc, c);
  31.           } while (BufferDesc.ReturnValue >= 0);
  32.         }
  33.         break;
  34.       case 'p':
  35.         v = va_arg(*pParamList, int);
  36.         _PrintUnsigned(&BufferDesc, v, 16, 8, 8, 0);
  37.         break;
  38.       case '%':
  39.         _StoreChar(&BufferDesc, '%');
  40.         break;
  41.       }
  42.       sFormat++;
  43.     } else {
  44.       _StoreChar(&BufferDesc, c);
  45.     }
复制代码


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册 微信登录

x

打赏

参与人数 1家元 +20 收起 理由
hfsp + 20 謝謝分享

查看全部打赏

发表于 2020-4-17 19:32:24 | 显示全部楼层
zhangxy5277 发表于 2020-4-16 08:55
对盗版jlink 支持的不好,,串口打印也可以异步打印到ram呀,就是消耗资源,奶奶的 ...

RTT流弊在,可以多通道打印,多颜色打印
回复 支持 反对

使用道具 举报

发表于 2020-4-16 08:55:53 | 显示全部楼层
对盗版jlink 支持的不好,,串口打印也可以异步打印到ram呀,就是消耗资源,奶奶的
回复 支持 反对

使用道具 举报

发表于 2020-4-9 21:24:56 | 显示全部楼层
各有利弊,尤其是只有一个串口的单片机,不过我还是喜欢串口,今天才用完双串口调试,一个TTL专门调试输入输出信息,另一个转485和外部设备通信,同时在电脑上监测485上的数据,窗口切来切去的挺麻烦的,准备用显示器支架左右或者上下两个屏幕显示,这样就不用切换提高效率。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-9 11:57:20 | 显示全部楼层
2545889167 发表于 2020-4-9 11:53
这个printf比串口打印的好处在于 不用演示等串口响应,相当于内容直接提交到缓存 慢慢读取走 ...

是的,不过对于我来说最大的好处就是少了一条线,不用再费事了:lol:
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-9 11:54:06 | 显示全部楼层
sz1988 发表于 2020-4-9 11:44
我编程序一般用烧写器烧录程序,串口输出调试信息。比起仿真器,有好处也有不足 ...

我之前也是这样,正好这次在搞键盘,串口没搞出来,没得用了,懒得再引出来了,就找了下代替方案
回复 支持 反对

使用道具 举报

发表于 2020-4-9 11:53:36 | 显示全部楼层
这个printf比串口打印的好处在于 不用演示等串口响应,相当于内容直接提交到缓存 慢慢读取走
回复 支持 反对

使用道具 举报

发表于 2020-4-9 11:44:46 | 显示全部楼层
我编程序一般用烧写器烧录程序,串口输出调试信息。比起仿真器,有好处也有不足:lol:
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-9 11:42:15 | 显示全部楼层
orsonzou 发表于 2020-4-9 11:29
请问一下,盗版的jlink,能用官方的升级固件吗?怕砖掉。。。

这个不清楚,没用过淘宝盗版jlink,自己打板的jlink-ob,用的@2545889167 提供的固件,可以问下店铺客服
回复 支持 反对

使用道具 举报

发表于 2020-4-9 11:29:46 | 显示全部楼层
请问一下,盗版的jlink,能用官方的升级固件吗?怕砖掉。。。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-9 11:21:28 | 显示全部楼层
本帖最后由 飞向狙沙 于 2020-4-9 11:59 编辑

参考资料:https://www.segger.com/products/ ... k/tools/rtt-viewer/
stt同样支持外部输入,没有测试,有需要的可以研究下
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-9 11:20:12 | 显示全部楼层
测试了下J-Link RTT Client和J-Link RTT Logger,J-Link RTT Client不知道为什么经常连接不上,Logger需要手动指定终端,然后日志可以直接打印到log文件


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册 微信登录

x
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册 微信登录

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-7-19 07:10 , Processed in 0.296401 second(s), 15 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

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