日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2025/4/16 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 调试笔记--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模式,其他操作均和方法一一樣

總結

以上是生活随笔為你收集整理的调试笔记--jlink 变量转实时波形小技巧的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。