一、前言

在嵌入式开发过程中,经常会通过打印输出一些调试信息来调试参数、查找问题等,通常我的做法都是使用芯片的串口硬件设备配合串口助手软件来进行调试。但是这次项目的PCB硬件设计并未预留串口调试接口,所以想使用串口调试就不方便了。经过查找资料发现Segger 提供了一种非常方便的调试方式——自家的J-Link硬件配合J-Link RTT Viewer软件进行信息输入输出调试。

二、组件添加

要使用该调试组件,需要添加Segger提供的SEGGER_RTT组件代码,该代码位于J-Link软件安装目录下,而且在用户手册中提供了详细的说明。

组件源码位置:

用户手册位置:

在手册的16章节对RTT组件进行了说明:

将组件源码复制到工程目录下,工程中添加相关文件及包含路径:

最后在需要使用打印调试信息的文件中包含#include "SEGGER_RTT.h"头文件就可以使用该组件了。

三、组件应用

关于组件提供的各API函数在手册中都有相应的说明。举例应用如下:

输出测试:

int a = 3;
SEGGER_RTT_TerminalOut(0,RTT_CTRL_BG_BLACK""RTT_CTRL_TEXT_BRIGHT_GREEN"SEGGER_RTT_TerminalOut 0\r\n");
SEGGER_RTT_TerminalOut(1,RTT_CTRL_BG_BLUE""RTT_CTRL_TEXT_BRIGHT_YELLOW"SEGGER_RTT_TerminalOut 1\r\n");
SEGGER_RTT_SetTerminal(2);
SEGGER_RTT_printf(0,RTT_CTRL_BG_WHITE""RTT_CTRL_TEXT_BRIGHT_BLACK"SEGGER_RTT_printf 2\r\n");
SEGGER_RTT_SetTerminal(3);
SEGGER_RTT_printf(0,"SEGGER_RTT_printf %d\r\n", a);

打开J-Link RTT Viewer软件

RTT Viewer打印结果如下:

输入测试:

int a;

while(1)
{
if ((a = SEGGER_RTT_WaitKey()) > 0)
{
SEGGER_RTT_SetTerminal(0);
SEGGER_RTT_printf(0, "SEGGER_RTT_GetKey = %c\r\n", a);
}
}

RTT Viewer打印结果如下:

四、扩展应用

经过上面对SEGGER_RTT的使用,发现其确实非常的方便,大多数调试都能够替代串口调试实现了,但是SEGGER_RTT_printf()函数无法打印浮点数。手册中对该函数列出了支持的转换说明符如下:

Conversion specifier Meaning
c Print the argument as one char
d Print the argument as a signed integer
u Print the argument as an unsigned integer
x Print the argument as an hexadecimal integer
s Print the string pointed to by the argument
p Print the argument as an 8-digit hexadecimal integer. (Argument shall be a pointer to void.)

其中并没有浮点数f选项。但是可以使用SEGGER_RTT输出函数自己修改一个printf函数,这样就可以使用完整的printf函数了。

添加自己修改的printf函数如下:

/*********************************************************************
*
* rtt_printf()
*
* Function description
* print a formatted string using RTT and standard library formatting.
**********************************************************************/
int rtt_printf(const char *fmt,...)
{
int n;
char aBuffer[256]; //根据应用需求调整大小
va_list args; va_start (args, fmt);
n = vsnprintf(aBuffer, sizeof(aBuffer), fmt, args);
if (n > (int)sizeof(aBuffer)) {
SEGGER_RTT_Write(0, aBuffer, sizeof(aBuffer));
} else if (n > 0) {
SEGGER_RTT_Write(0, aBuffer, n);
}
va_end(args);
return n;
}

接下来测试浮点数打印:

double fa = 0.1f;
double fb = 2.0f; while(1)
{
fa += 0.0001f;
fb -= 0.0002f;
rtt_printf("floating test:\tfa = %f, fb = %f\r\n", fa, fb);
delay(0x0fffffff);
}

嵌入式开发笔记——调试组件SEGGER_RTT的更多相关文章

  1. 嵌入式开发笔记——调试组件SEGGER_HardFaultHandle

    一.前言 在使用Cortex-M内核的MCU进行开发时,有时候会因为对内存错误访问等原因造成程序产生异常从而进入HardFaultHandler错误中断.如果程序结构比较复杂,尤其是运行了RTOS时可 ...

  2. 安卓开发笔记——TabHost组件(二)(实现底部菜单导航)

    上面文章<安卓开发复习笔记——TabHost组件(一)(实现底部菜单导航)>中提到了利用自定义View(ImageView+TextView)来设置一个底部菜单的样式 这边再补充一种更为灵 ...

  3. 安卓开发笔记——TabHost组件(一)(实现底部菜单导航)

    什么是TabHost? TabHost组件的主要功能是可以进行应用程序分类管理,例如:在用户使用windows操作系统的时候,经常见到如图所示的图形界面.     TabHost选项卡,说到这个组件, ...

  4. 安卓开发笔记——WebView组件

    我们专业方向本是JAVA Web,这学期突然来了个手机App开发的课设,对于安卓这块,之前自学过一段时间,有些东西太久没用已经淡忘了 准备随笔记录些复习笔记,也当做温故知新吧~ 1.什么是WebVie ...

  5. 安卓开发笔记——ViewPager组件(仿微信引导界面)

    这2天事情比较多,都没时间更新博客,趁周末,继续继续~ 今天来讲个比较新潮的组件——ViewPager 什么是ViewPager? ViewPager是安卓3.0之后提供的新特性,继承自ViewGro ...

  6. 安卓开发笔记——Gallery组件+ImageSwitcher组件

    什么是Gallery? Gallery是一个水平的列表选择框,它允许用户通过拖动来查看上一个.下一个列表选项. 下图是今天要实现的最终效果: 利用Gallery组件实现的一个横向显示图像列表,可以通过 ...

  7. 安卓开发笔记——GridView组件

    1.什么是GridView? GridView(网格视图)是按照行列的方式来显示内容的,一般用于显示图片,图片等内容,比如实现九宫格图,用GridView是首选,也是最简单的. 2.正文 GridVi ...

  8. 嵌入式开发笔记 - U-Boot相关

    1.U-boot使用准备 1.1 U-boot下载 通过德国的denx软件中心提供的FTP下载合集,下载网址: ftp://ftp.denx.de/pub/u-boot/

  9. Android 开发笔记 “广播组件使用”

    在Activity中,注册广播的一个Demo. 总共分3步 第一步:定义一个BroadcastReceiver广播接收类: private BroadcastReceiver mBroadcastRe ...

随机推荐

  1. 「LOJ 541」「LibreOJ NOIP Round #1」七曜圣贤

    description 题面很长,这里给出题目链接 solution 用队列维护扔掉的红茶,同时若后扔出的红茶比先扔出的红茶编号更小,那么先扔出的红茶不可能成为答案,所以可以用单调队列维护 故每次询问 ...

  2. 关于CopyOnWriterArrayList的一些理解

    学了cowarraylist之后,有些不明白的地方, 1.我们为什么要用写时复制的策略呢?,这样每次不是都要复制吗,性能不是很低吗?直接在元素组上扩容不好吗?而且读的时候数据一致性也保证不了,如果只是 ...

  3. jquery动态生成的select下拉框,怎么设置默认的选中项?

    这两天都被这问题困扰,可能是我不太懂前端.我做layui表格行编辑,点击编辑按钮弹出layer,里边有一个民族的下拉框不能直接显示后台传过来的值.我把民族数组用jquery添加到了select里边,可 ...

  4. C和指针课后练习题3

    1.在你的机器上,字符的范围有多大?有那些不同的整数类型以及他们的范围? C语言中数据输入输出格式: %d 有符号10进制整数%i 有符号10进制整数%o 无符号8进制整数%u 无符号10进制整数%x ...

  5. 网络拓扑实例09:VRRP组网下同网段内配置基于全局地址池的DHCP服务器

    组网图形 DHCP服务器简介 见前面DHCP服务器文章,不再赘述. 组网需求 如图1所示,某企业内的一台主机通过Switch双归属到SwitchA和SwitchB,SwitchA为主设备,作为DHCP ...

  6. Spring Boot 2.4.0 发布,配置文件重大调整,不要乱升级!!

    前段时间 Spring Boot 2.4.0 发布了,栈长作了一个新特性全盘解读,其中介绍了一个很重要的变革,那就是配置文件. 配置文件可是每个框架的核心,不得不搞清楚,所以,这篇栈长就带大家深入实战 ...

  7. 4.深入Istio源码:Pilot的Discovery Server如何执行xDS异步分发

    转载请声明出处哦~,本篇文章发布于luozhiyun的博客:https://www.luozhiyun.com 本文使用的Istio源码是 release 1.5. 介绍 Discovery Serv ...

  8. 整理一下《java并发编程实战》中的知识点

    分工.同步.互斥的历史由来 分工:单道.多道.分时 同步:线程通信(组织编排任务) 互斥:因(多线程访问共享资源)果(串行化共享资源的访问) 1切都是为了提高性能 2.可见性.原子性.有序性 可见性: ...

  9. moviepy音视频剪辑:视频基类VideoClip子类VideoFileClip、CompositeVideoClip、ImageSequenceClip介绍

    ☞ ░ 前往老猿Python博文目录 ░ 一.引言 在<moviepy音视频剪辑:moviepy中的剪辑相关类及关系>介绍了VideoClip主要有六个直接子类(VideoFileClip ...

  10. Python正则运算符优先级re.findall('(.)*',"abc")、re.findall('(.*)',"abc")、re.findall('(.?)*',"abc")的执行结果的影响分析

    我们分别执行三个语句: >>> re.findall('(.)*',"abc") ['c', ''] >>> re.findall('(.*)' ...