调试笔记–jlink 变量转实时波形小技巧

上篇讲了jlink RTT组件在RAM中开辟一段内存,将printf字符串存入然后通过jlink调试接口读取RAM,将printf字符串在jlink-RTT Viewer组件上显示出来。printf的字符串可以通过jlink的调试接口从RAM读出,举一反三,那么变量呢?变量也是可以。
本文参考:
安富莱嵌入式专题教程第6期
安富莱嵌入式专题教程第4期

安装J-Scope软件

安装SEGGER软件时,最好都不要有中文路径,SEGGER的中文支持很差
软件下载连接 https://www.segger.com/downloads/jlink/#JScope

方法一 通过Debug文件信息显示变量波形

优点:不用修改代码可以直接监视全局变量的实时波形
缺点:最多监视10个全局变量,每个变量采集频率固定最高为1kHz(普通jlink)
本质上就是通过Debug文件信息获取全局变量地址信息,然后jlink以固定频率采集固定地址RAM内的数据绘制波形



这里没有直接选择芯片类型(Specify Target Device),可能因为驱动版本问题,选择会闪退,后面再选


选择芯片型号

常用操作

  • 第三个组件框内为开始、停止和暂停,第六个组件框内为单片机程序运行、暂停、复位
  • 键盘上的左右箭头 为 x轴缩放快捷键
  • 键盘上的加减符号 为 y轴缩放快捷键(使用之前需先选择要缩放的变量)

其他操作可自行查阅手册

方法二 通过RTT组件显示波形

优点:速度比方法一快很多,而且采样更加灵活
缺点:需要修改代码,添加RTT组件
本质上就是程序中通过向RTT组件缓冲区写入数据,然后jlink通过读取RTT组件缓冲区内数据绘制波形

添加SEGGER - RTT中间件

参考博客向工程中添加jlink-RTT Viewer组件

初始化组件

和RTT打印功能不一样(RTT通道0的缓冲区RTT组件已经自行创建了)

使用RTT组件上报波形需要用户自行申请缓冲区,并对RTT通道进行初始化

/*!* @brief    初始化RTT 上行通道,将缓冲区和对应通道连接起来** @param    BufferIndex : 通道号 范围 0-SEGGER_RTT_MAX_NUM_UP_BUFFERS* @param    sName       : 通道名 * @param    pBuffer     : 通道缓冲区* @param    BufferSize  : 通道缓冲区大小* @param    Flags       : 缓冲区满的情况下怎么处理新数据** @return   ** @note     注意事项** @see      */
int SEGGER_RTT_ConfigUpBuffer(unsigned BufferIndex, const char* sName, void* pBuffer, unsigned BufferSize, unsigned Flags);
  • 通道号0已经被RTT printf默认占用了,可以用1-SEGGER_RTT_MAX_NUM_UP_BUFFERS(默认可用1-2)
  • 通道名

通道名字不可以随便起,J-Scope软件会根据通道名格式提取RAM数据

例如: JScope_u2 : 表示数据包仅包含 16 位无符号数。
JScope_u4i4:表示数据包含两个变量,一个无符号32位 一个有符号32位

  • 缓冲区大小

默认用1KB即可,如果RAM紧凑,可以根据jlink速度和数据上报频率自行计算合适的RAM大小

  • 缓冲区满怎么处理数据
#define SEGGER_RTT_MODE_NO_BLOCK_SKIP         (0)     // 如果缓冲区放不下当前帧数据,则舍弃当前帧
#define SEGGER_RTT_MODE_NO_BLOCK_TRIM         (1)     // 如果缓冲区放不下当前帧数据,则缓冲区能放几个当前帧byte就放几个
#define SEGGER_RTT_MODE_BLOCK_IF_FIFO_FULL    (2)     // 如果缓冲区放不下当前帧数据,则堵塞直到缓冲区能放下当前帧所有数据

初始化并上报数据

注意,上报数据的时候要按照缓冲区名字的顺序上报,顺序错乱会导致波形错乱

#include "SEGGER_RTT.h"
uint32_t g_ulData;
int32_t g_lData;
void vTaskLED(void * pvParameters)
{while(1){vTaskDelay(100);HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);g_ulData ++;g_lData --;//上报数据SEGGER_RTT_Write(1, &g_ulData, 4);SEGGER_RTT_Write(1, &g_lData, 4);}
}/** jscop缓冲区大小 */
#define JSCOP_BUFF_SIZE  1024/** JSCOP 缓冲区 */
uint8_t g_ucJscopBuff[JSCOP_BUFF_SIZE];void SeggerRTTInit(void)
{/* 配置上行通道 1,缓冲区g_ucJscopBuff *///#define SEGGER_RTT_MODE_NO_BLOCK_SKIP         (0)     // 如果缓冲区放不下当前帧数据,则舍弃当前帧//#define SEGGER_RTT_MODE_NO_BLOCK_TRIM         (1)     // 如果缓冲区放不下当前帧数据,则缓冲区能放几个当前帧byte就放几个//#define SEGGER_RTT_MODE_BLOCK_IF_FIFO_FULL    (2)     // 如果缓冲区放不下当前帧数据,则堵塞直到缓冲区能放下当前帧所有数据SEGGER_RTT_ConfigUpBuffer(1, "JScope_u4i4", g_ucJscopBuff, JSCOP_BUFF_SIZE, SEGGER_RTT_MODE_NO_BLOCK_SKIP);
}

J-Scope软件配置

J-Scope软件配置为RTT模式,其他操作均和方法一一样

调试笔记--jlink 变量转实时波形小技巧相关推荐

  1. 如何优化小红书笔记?教你三个小技巧,让你快速提高笔记排名

    小红书推广的第一步就是发布笔记,笔记排名越靠前,流量就越大,所以做好笔记很重要,下面教你三个小技巧,让你快速提高笔记排名 1.内容优化 笔记内容撰写首先要符合小红书平台规则,原创度高,建议企业从产品卖 ...

  2. python保存变量到本地_python小技巧——将变量保存在本地及读取

    在用jupyter notebook写python代码的过程中会产生很多变量,而关闭后或者restart jupyter kernel后所有变量均会消失,想要查看变量就必须将代码重新再运行一遍,而想在 ...

  3. [2dPIC调试笔记]初始化变量1014(2)

    %**********初始化变量*********% xlen = nx; %XÍø¸ñÊý ylen = ny; %YÍø¸ñÊý nxny = nx*ny; %×ÜÍø¸ñÊý g = 1.0; ...

  4. win配置环境变量以及一些变量换行类的小技巧

    win10左下角直接搜 高级系统设置 即可找到: 或者打开cmd,输入变量名即可快速查看对应变量配置信息 右键我的电脑打开最下面的属性 打开高级系统设置 打开环境变量 然后配置想要改变的配置就行了 就 ...

  5. python中template是什么意思啊_Python中Template使用的一个小技巧

    Python中Template是string中的一个类,可以将字符串的格式固定下来,重复利用. from string import Template s = Template("there ...

  6. 调试笔记--keil 断点调试小技巧

    调试笔记–keil 断点调试小技巧 给变量打断点 调试不熟悉的项目时,卧槽!怎么这么多全局变量?这玩意又在那修改了??这个时候会给变量打断点就能省好多事. 将要监视的全局变量添加到watch窗口 选中 ...

  7. 调试笔记--keil 测量周期小技巧

    调试笔记–keil 测量周期小技巧 本文参考安富莱专题教程第7期 http://www.armbbs.cn/forum.php?mod=viewthread&tid=87176&ext ...

  8. ADF4350调试笔记

    纸上得来终觉浅,绝知此事要躬行. 分享一个ADF4350设计笔记,可输出0dB本振信号.网上有很多成功的设计案例,但是调试的时候会遇到很多其他问题,所以只能在设计的时候考虑全面. 官方介绍:ADF43 ...

  9. OMAPL138调试笔记

    title: Linux 嵌入式使用 tags: 新建,模板,小书匠 grammar_cjkRuby: true Copyright (C) @2018 Widic Filename:File-fun ...

最新文章

  1. uvalive 3218 Find the Border
  2. TIP/IP 端口号大全
  3. html 链接 pdf,简单的HTML DOM只解析名称和含有PDF链接链接
  4. jsp mysql utf8_jsp操作mysql存取中文乱码
  5. C语言结构体指针的使用方法
  6. 【Java NIO】一文了解NIO
  7. stream 提取某字段_java8从list集合中取出某一属性的值的集合案例
  8. dom4j和jaxb_JAXB,SAX,DOM性能
  9. python的仿真效果好吗_Python SimPy 仿真系列 (1)
  10. “精耕细作”桌面云市场的锐捷,重磅发布三擎云桌面
  11. ELK学习总结(2-2)单模式CRUD操作
  12. CECC2018赛季收官站我国×××手夺得年度总冠军
  13. 在线溶氧仪 连接计算机,在线溶氧仪集成设计与数据处理算法分析.pdf
  14. maven 如何引入不同版本_React中不同webpack版本如何配置less
  15. php parse_url,pathinfo,basename函数
  16. VS2013下载及安装
  17. 为什么要分库分表?用过哪些分库分表中间件?不同的分库分表中间件都有什么优点和缺点?...
  18. java知识点ppt背景图片_Java 给 PowerPoint 文档添加背景颜色和背景图片
  19. Win10下AutoCAD2014 +VS2010 + Object2014 安装与配置环境
  20. mac 解压rar文件

热门文章

  1. DBCC CHECKIDENT
  2. [导入]使用tomcat5.0自带的连接池
  3. MT6575 3G切换2G
  4. JNDI学习总结(1)——JNDI入门简介
  5. 分布式调用技术 RPC VS REST
  6. 开源使得所有的软件卖成白菜价,但终将普惠世界!
  7. Windows Mysql添加用户
  8. 如何让你的 Linux 系统干净整洁
  9. paramiko-exec.py——利用paramiko远程执行命令
  10. BZOJ 1049 数字序列(LIS)