1. 从安装目录下找到RTT源代码

C:\Program Files\SEGGER\JLink\Samples\RTT

将压缩包解压,解压后目录如下

将RTT中源代码拷贝至项目工程中

2. 修改配置和源代码

  1. SEGGER_RTT_Config.h 中可根据需要裁剪内存占用大小,和是否启动LOCK和UNLOCK, 并添加浮点数支持的宏定义

    //! 浮点数的支持(需要420 BYTE的flash空间)
    #ifndef SEGGER_RTT_PRINT_FLOAT_ENABLE#define SEGGER_RTT_PRINT_FLOAT_ENABLE                 (1)
    #endif
    
  2. 如何支持浮点数打印,修改SEGGER_RTT_printf.c

  3. 调用关系SEGGER_RTT_printf–>SEGGER_RTT_vprintf, 固在SEGGER_RTT_vprintf中添加如下代码

    int SEGGER_RTT_vprintf(unsigned BufferIndex, const char * sFormat, va_list * pParamList) {char c;SEGGER_RTT_PRINTF_DESC BufferDesc;int v;unsigned NumDigits;unsigned FormatFlags;unsigned FieldWidth;char acBuffer[SEGGER_RTT_PRINTF_BUFFER_SIZE];BufferDesc.pBuffer        = acBuffer;BufferDesc.BufferSize     = SEGGER_RTT_PRINTF_BUFFER_SIZE;BufferDesc.Cnt            = 0u;BufferDesc.RTTBufferIndex = BufferIndex;BufferDesc.ReturnValue    = 0;do {c = *sFormat;sFormat++;if (c == 0u) {break;}if (c == '%') {//// Filter out flags//FormatFlags = 0u;v = 1;do {c = *sFormat;switch (c) {case '-': FormatFlags |= FORMAT_FLAG_LEFT_JUSTIFY; sFormat++; break;case '0': FormatFlags |= FORMAT_FLAG_PAD_ZERO;     sFormat++; break;case '+': FormatFlags |= FORMAT_FLAG_PRINT_SIGN;   sFormat++; break;case '#': FormatFlags |= FORMAT_FLAG_ALTERNATE;    sFormat++; break;default:  v = 0; break;}} while (v);//// filter out field with//FieldWidth = 0u;do {c = *sFormat;if ((c < '0') || (c > '9')) {break;}sFormat++;FieldWidth = (FieldWidth * 10u) + ((unsigned)c - '0');} while (1);//// Filter out precision (number of digits to display)//NumDigits = 0u;c = *sFormat;if (c == '.') {sFormat++;do {c = *sFormat;if ((c < '0') || (c > '9')) {break;}sFormat++;NumDigits = NumDigits * 10u + ((unsigned)c - '0');} while (1);}//// Filter out length modifier//c = *sFormat;do {if ((c == 'l') || (c == 'h')) {sFormat++;c = *sFormat;} else {break;}} while (1);//// Handle specifiers//switch (c) {...//! ============================================================//! 支持浮点数
    #if (SEGGER_RTT_PRINT_FLOAT_ENABLE != 0)   case 'f':case 'F':{float fv;fv = (float)va_arg(*pParamList, double);    //取出输入的浮点数值if(fv < 0) _StoreChar(&BufferDesc, '-');          // 判断正负,用来显示负号v = abs((int)fv);                                //取整数部分_PrintInt(&BufferDesc, v, 10u, NumDigits, FieldWidth, FormatFlags); //显示整数_StoreChar(&BufferDesc, '.');                                        //显示小数点v = abs((int)(fv * 1000));               v = v % 1000;_PrintInt(&BufferDesc, v, 10u, 3, FieldWidth, FormatFlags);          //显示小数点后三位}break;
    #endif
    //! ============================================================default:break;}sFormat++;} else {_StoreChar(&BufferDesc, c);}} while (BufferDesc.ReturnValue >= 0);...
    }
    

3. 用户层封装, 在头文件中实现如下代码

//! 调试输出配置
#define RTT_DBG_ENABLE          (1)#if RTT_DBG_ENABLE#include "SEGGER_RTT.h"/* 初始化调试模块 */#define DEBUG_INIT()    SEGGER_RTT_Init()/* RTT 终端号 */#define RTT_DBG_PORT        0#define LOG_PROTO(type,color,format,...)                        \SEGGER_RTT_printf(RTT_DBG_PORT,"%s%s"format"\r\n%s",    \color,                                  \type,                                   \##__VA_ARGS__,                          \RTT_CTRL_RESET)/* 清屏*/#define log_clear()     SEGGER_RTT_WriteString(RTT_DBG_PORT, "  "RTT_CTRL_CLEAR)/* 无颜色日志输出 */#define log_debug(format,...)   LOG_PROTO("D:","",format,##__VA_ARGS__)/* 有颜色格式日志输出 */#define log_info(format,...)    LOG_PROTO("I:", RTT_CTRL_TEXT_BRIGHT_GREEN , format, ##__VA_ARGS__)#define log_warn(format,...)    LOG_PROTO("W:", RTT_CTRL_TEXT_BRIGHT_YELLOW, format, ##__VA_ARGS__)#define log_error(format,...)   LOG_PROTO("E:", RTT_CTRL_TEXT_BRIGHT_RED   , format, ##__VA_ARGS__)#else#define DEBUG_INIT()#define log_clear()#define log_debug#define log_info#define log_warn#define log_error
#endif

4. 测试

这样浮点数打印以及日志颜色都能使用了,注意:浮点数只能打印两位,如需要更多则修改源码即可

20221114修改:之前打印-0.03之类小于0的小数,负号会丢失,固重新修改了下打印浮点机制,现已正常

参考链接1:用VS Code开发STM32(四)——增加SEGGER RTT日志输出支持
参考链接2:给SEGGER RTT的 SEGGER_RTT_printf() 函数添加浮点显示功能

SEGGER RTT printf 的移植和浮点数处理相关推荐

  1. Segger RTT深度使用说明-移植-Jlink rtt viewer显示-输出到Secure CRT

    简介 RTT( Real Time Terminal)是SEGGER公司新出的可以在嵌入式应用中与用户进行交互的实时终端.J-Link驱动4.90之后的版本都支持RTT.RTT既可以从MCU上输出信息 ...

  2. c语言printf源码浮点数,printf以%d输出浮点数

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 曾看到printf的一道题,挺有意思,记录一下. float value = 1.0; printf('value_int = %dn', value); ...

  3. 【嵌入式小技巧】STM32 实现 SEGGER RTT 打印(超详细)

    文章目录 原创声明 前言 一.RTT 是什么? 二.使用步骤 1.引入驱动库 2.实现 log 打印输出 2.0 编译选项注意 2.1 直接使用 2.2 封装使用(推荐) 2.3 效果演示 总结 授权 ...

  4. c语言printf打印浮点型,printf以%d输出浮点数

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 曾看到printf的一道题,挺有意思,记录一下. float value = 1.0; printf('value_int = %dn', value); ...

  5. c语言小数加整数输出%d,printf以%d输出浮点数

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 曾看到printf的一道题,挺有意思,记录一下. float value = 1.0; printf('value_int = %dn', value); ...

  6. SEGGER RTT STOP/SLEEP 模式下使用

    1.问题详述, M3/M4内核在sleep 或者 STOP模式 下,内核是不工作的,因此需要 以下 几步操作 第一步: 开启 低功耗模式下,debug 的连接 DBGMCU_Config(DBGMCU ...

  7. 《嵌入式 - 嵌入式大杂烩》详解J-Link RTT打印

    开发环境: J-Link版本:V9.4 J-Link驱动版本:V760h_x86_64 Keil:V5.30 在嵌入式开发过程中,经常需要进行打印调试,通常使用串口进行打印输出,但通常串口资源有限,这 ...

  8. 使用RTT代替UART,把你的JLink变成串口调试助手~

    摘要:不知道大家在单片机开发中是如何打印调试信息的,大多数应该是用串口调试打印吧,在大多数的情况下,一般在制板和写代码时都会预留串口1做为调试打印用. 但是在实际开发如果没有预留串口怎么办?其实我们的 ...

  9. JLink的RTT使用

    前言:什么是RTT? RTT( Real Time Terminal)是SEGGER公司新出的可以在嵌入式应用中与用户进行交互的实时终端.J-Link驱动4.90之后的版本都支持RTT.RTT既可以从 ...

  10. 使用Jlink RTT工具打印日志

    使用Jlink RTT工具打印日志 背景 平常调试代码中使用串口打印log,往往需要接出串口引脚,比较麻烦,并且串口打印速度较慢,串口的中断可能会影响代码的执行效率. SEGGER RTT支持使用J- ...

最新文章

  1. 硬盘突然变慢的原因,系统突然变慢的原因
  2. 在线作图|如何绘制一个好看的堆叠柱状图
  3. 【多标签文本分类】Semantic-Unit-Based Dilated Convolution for Multi-Label Text Classification
  4. 搭建基于域名虚拟主机
  5. Python(Windows)下安装各种库的多种方法总结--灵活使用pip
  6. jsencrypt加密
  7. iOS开发网络篇—网络请求(HTTP协议)小结(转)
  8. 小爱音响调用php接口_PHP调用语音合成接口
  9. C#LeetCode刷题-二分查找​​​​​​​
  10. [Ogre][地形]OgreTerrain的实现原理分析
  11. ceq c matlab,求一个函数MATLAB的编程,求大神指教。
  12. HTML行内元素 块级元素及语义化
  13. 【FZU 2277】Change
  14. 网站快速收录-网站快速收录工具下载免费
  15. 《麦肯锡方法》读书笔记21
  16. Linux系统如何安装oki打印机,涨知识!OKI针式打印机的驱动安装方法
  17. html中列表怎么平移,css如何设置图片平移
  18. 0089-【生物软件】-ANNOVAR基因变异注释
  19. Linux界面美化---Zsh终端
  20. 【金猿技术展】视频矫正技术——基于参数估计的自由几何变换算法

热门文章

  1. 我的Verilog HDL学习历程(二) 组合逻辑电路的一个实例:基于EGO1板子
  2. subprocess解决僵尸进程
  3. 联想启动Kind City项目:交互式全球合作鼓励同理心,共创建立于善意之上的未来
  4. Unihan(统汉字)常用字段介绍
  5. matlab解常微分方程——符号解法
  6. 公司装了cofax传真服务器真的解决了收发传真时存在的诸多不便
  7. 东芝2303am维护清零_东芝打印机2303A怎样清零
  8. 强化学习(十一) Prioritized Replay DQN
  9. android adb 命令启动,如何从adb shell启动和停止android服务?
  10. chromeos java安装_试用额外硬件驱动和完整JAVA支持的ChromeOS