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

调试笔记–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模式,其他操作均和方法一一样

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值