J-Scope是Segger推出的一款免費(fèi)軟件,用于MCU運(yùn)行時(shí),實(shí)時(shí)顯示數(shù)據(jù)波形,可以以類似示波器的方式顯示多個(gè)變量的值。本文提供簡單的例子演示如何基于先楫半導(dǎo)體的芯片新建 J-scope工程并顯示運(yùn)行數(shù)據(jù)。
以下內(nèi)容介紹分為四個(gè)模塊:工作模式、軟硬件版本、HSS模式工程創(chuàng)建和RTT模式工程創(chuàng)建。
一、工作模式
J-Scope分為HSS和RTT兩種模式:
1. HSS(High-Speed-Sampling)模式:jlink周期性的讀取數(shù)據(jù),將數(shù)據(jù)上傳至j-scope顯示。
優(yōu)點(diǎn):
1)簡單,代碼無需做任何更改
2)通過elf文件確定變量地址
缺點(diǎn):
1)相比RTT模式數(shù)據(jù)傳輸速度更慢
2)異步采樣,具有相當(dāng)?shù)姆菍?shí)時(shí)性
2. RTT(Real-Time-Transfer)模式:實(shí)時(shí)傳輸模式,代碼主動(dòng)上報(bào)變量數(shù)值至j-scope顯示。
優(yōu)點(diǎn):
1)比HSS模式速度更高,最大上傳速度可達(dá)2MB/s
2)數(shù)據(jù)上傳與MCU內(nèi)程序運(yùn)行是同步的,具有實(shí)時(shí)性
3)要監(jiān)控的變量可自動(dòng)檢索,無需指定地址或提供elf文件
4)數(shù)據(jù)可加時(shí)間戳
缺點(diǎn):
1)需要寫代碼,具體的,需要加載RTT組件,并在代碼中手動(dòng)上傳要顯示的數(shù)據(jù)
2)占用一定的內(nèi)存(RTT Buffer)
二、軟硬件版本
硬件J-Link:V10版本及以上(支持risc-v內(nèi)核),推薦使用J-Link V11。
軟件J-Scope:J-Link Software and Documentation pack V7.88f及以上,一般使用最新版本J-Link驅(qū)動(dòng)即可。安裝完成后在windows內(nèi)搜索即可找到J-Scope GUI工具。
三、HSS模式工程創(chuàng)建
1.代碼添加
打開SDK1.1.0內(nèi)hello_world工程,添加如下代碼:
float my_pi = 3.141592654f;
float my_two_pi = 6.283185307f;
typedef struct{
float ts;
float omega;
float theta;
float sinval;
float cosval;
}jscope_debug_t;
jscope_debug_t jscope_debug = {
.ts = 0.001f,
.omega = 2.0f * 3.141592654f * 10.0f,
.theta = 0.0f,
.sinval = 0.0f,
.cosval = 0.0f,
};
void jscope_debug_run(jscope_debug_t *p)
{
p->theta += p->omega * 0.001f;
if(p->theta > my_pi)
p->theta = p->theta - my_two_pi;
p->sinval = sinf(p->theta);
p->cosval = cosf(p->theta);
return;
}
以上代碼定義了jscope_debug_t結(jié)構(gòu)體,添加了一個(gè)jscope_debug_t型變量,并在jscope_debug_run函數(shù)內(nèi)對變量值做修改。
添加如下代碼,設(shè)計(jì)一個(gè)1ms定時(shí)器中斷,在中斷函數(shù)內(nèi)執(zhí)行jscope_debug_run:
void gptmr_init(void)
{
gptmr_channel_config_t config;
gptmr_channel_get_default_config(GPTMR, &config);
config.reload = 100*1000;
gptmr_enable_irq(GPTMR, GPTMR_CH_RLD_IRQ_MASK(GPTMR_CH));
gptmr_channel_config(GPTMR, GPTMR_CH, &config, false);
gptmr_channel_reset_count(GPTMR, GPTMR_CH);
gptmr_start_counter(GPTMR, GPTMR_CH);
intc_m_enable_irq_with_priority(GPTMR_IRQ, 1);
}
void isr_gptmr(void)
{
volatile uint32_t s = GPTMR->SR;
GPTMR->SR = s;
if (s & GPTMR_CH_RLD_STAT_MASK(GPTMR_CH)) {
//this is a 1ms isr_handler
jscope_debug_run(&jscope_debug);
}
}
SDK_DECLARE_EXT_ISR_M(GPTMR_IRQ, isr_gptmr)
注意:需要將監(jiān)控的變量放在noncachable內(nèi)存區(qū),或者直接關(guān)閉L1緩存(l1c_dc_disable()),否則數(shù)據(jù)一直在l1緩存內(nèi),J-Link讀不到數(shù)據(jù)。
2.GUI操作
打開J-Scope,新建工程,如下所示:
在彈出的界面配置如下:
1、本文作者使用HPM6200evk,因此設(shè)備選擇HPM6280xPAx。注意,如果找不到對應(yīng)的芯片型號,考慮升級J-Link驅(qū)動(dòng)包。
2、Sampling Source選擇HSS模式。
3、Sampling Rate選擇1Khz,即每1000us采集一次數(shù)據(jù)。
4、指定elf文件。HSS模式會(huì)解析elf文件確定變量地址。
選擇要監(jiān)控的數(shù)據(jù),在變量后面的方框內(nèi)打勾即可。
保證芯片內(nèi)程序正在運(yùn)行,點(diǎn)擊圖中開始采樣按鈕,即可開始采集波形并顯示。移動(dòng)光標(biāo)可以查看某一時(shí)刻采集的3個(gè)數(shù)據(jù)的值。
Sampling后有兩個(gè)功能按鈕,前一個(gè)開始/暫停采樣,后一個(gè)停止采樣。Target后有兩個(gè)功能按鈕,前一個(gè)開始/暫停芯片執(zhí)行,后一個(gè)復(fù)位芯片。
界面右上角放大縮小符號以及其后的下拉框,可控制時(shí)間軸縮放。
界面下方watch window內(nèi),可顯示變量名、變量地址、變量數(shù)值(光標(biāo)處),最大值、最小值、滑動(dòng)平均值。修改 Y Resolution 與 Y Offset,可以對每一根曲線的Y軸縮放與偏移進(jìn)行設(shè)置。
四、RTT模式工程創(chuàng)建
1. 代碼添加
打開SDK1.1.0內(nèi)hello_world工程的cmakelists,做如下修改:
添加如下代碼:
float my_pi = 3.141592654f;
float my_two_pi = 6.283185307f;
typedef struct{
float ts;
float omega;
float theta;
float sinval;
float cosval;
}jscope_debug_t;
jscope_debug_t jscope_debug ={
.ts = 0.001f,
.omega = 2.0f * 3.141592654f * 10.0f,
.theta = 0.0f,
.sinval = 0.0f,
.cosval = 0.0f,
};
void jscope_debug_run(jscope_debug_t *p)
{
p->theta += p->omega * 0.001f;
if(p->theta > my_pi)
p->theta = p->theta - my_two_pi;
p->sinval = sinf(p->theta);
p->cosval = cosf(p->theta);
return;
}
void isr_gptmr(void)
{
volatile uint32_t s = GPTMR->SR;
GPTMR->SR = s;
if (s & GPTMR_CH_RLD_STAT_MASK(GPTMR_CH)) {
//this is a 10ms isr_handler,add your code here
jscope_debug_run(&jscope_debug);
}
}
SDK_DECLARE_EXT_ISR_M(GPTMR_IRQ, isr_gptmr)
void gptmr_init(void)
{
gptmr_channel_config_t config;
gptmr_channel_get_default_config(GPTMR, &config);
config.reload = 100*100;
gptmr_enable_irq(GPTMR, GPTMR_CH_RLD_IRQ_MASK(GPTMR_CH));
gptmr_channel_config(GPTMR, GPTMR_CH, &config, false);
gptmr_channel_reset_count(GPTMR, GPTMR_CH);
gptmr_start_counter(GPTMR, GPTMR_CH);
intc_m_enable_irq_with_priority(GPTMR_IRQ, 1);
}
main函數(shù)如下:
int main(void)
{
int u;
char JS_RTT_UpBuffer[4096]; // J-Scope RTT Buffer
int JS_RTT_Channel = 1; // J-Scope RTT Channel
int i;
board_init();
board_init_led_pins();
gptmr_init();
l1c_dc_disable();
board_timer_create(LED_FLASH_PERIOD_IN_MS, board_led_toggle);
printf("helloworld\n");
SEGGER_RTT_ConfigUpBuffer(JS_RTT_Channel, "JScope_f4f4f4f4f4", &JS_RTT_UpBuffer[0], sizeof(JS_RTT_UpBuffer),SEGGER_RTT_MODE_BLOCK_IF_FIFO_FULL);
while(1)
{
SEGGER_RTT_Write(JS_RTT_Channel,&jscope_debug, sizeof(jscope_debug));
}
return 0;
}
上述代碼首先配置了RTT組件的upbuffer1,將其命名為"JScope_f4f4f4f4f4"(命名規(guī)則下文描述),配置其占用的內(nèi)存區(qū)為JS_RTT_UpBuffer,數(shù)組大小為4096個(gè)字節(jié),以及寫函數(shù)的調(diào)用策略為當(dāng)內(nèi)存區(qū)滿時(shí)以阻塞模式寫入(請參考RTT wiki百科)。然后在while循環(huán)內(nèi),不停的調(diào)用SEGGER_RTT_Write函數(shù)上傳數(shù)據(jù)到J-Scope進(jìn)行顯示。
RTT模式uploadbuffer命名規(guī)則:
通道名稱以“JScope_”開頭,后面跟解析RTT內(nèi)存數(shù)據(jù)需要的數(shù)據(jù)個(gè)數(shù)、數(shù)據(jù)類型與每個(gè)數(shù)據(jù)占用的字節(jié)數(shù)。例如浮點(diǎn)數(shù)一定占用4個(gè)字節(jié),而整形可以占用1、2、4個(gè)字節(jié)。
2.GUI操作
打開J-Scope,新建工程,如下所示:
在彈出的界面配置如下:
- 選擇設(shè)備,芯片型號。
- 選擇RTT模式。
- 如果需要更高的傳輸速率,可以增加JTAG速度,比如12000khz或20000khz。
進(jìn)入GUI界面,可以看到我們沒有提供任何的elf文件,J-Scope自動(dòng)識(shí)別出上報(bào)的結(jié)構(gòu)體有5個(gè)float型數(shù)據(jù)。這是RTT組件自動(dòng)在內(nèi)存中搜索,找到了我們定義的RTT buffer的結(jié)果。由于沒有提供elf,所以watch window內(nèi)無變量名信息,也無地址信息。
采樣可以觀察到,波形明顯有鋸齒了,說明RTT上傳的速度高,同一個(gè)數(shù)據(jù)上傳了多次。
trigger功能可以用來達(dá)成條件觸發(fā)采樣,如圖所示,設(shè)置sin的值大于0.5時(shí)觸發(fā)采樣,則波形從sin=0.5358時(shí)開始采樣。
小 結(jié)
本文首先介紹了基于HPM6000系列芯片如何使用J-Scope調(diào)試??傮w而言J-Scope是一款相當(dāng)易用的工具,使用時(shí)只需注意變量放在非l1緩存區(qū)即可。讀者可自行嘗試,提高調(diào)試效率。
-
芯片
+關(guān)注
關(guān)注
456文章
51161瀏覽量
427199 -
mcu
+關(guān)注
關(guān)注
146文章
17317瀏覽量
352618 -
先楫半導(dǎo)體
+關(guān)注
關(guān)注
10文章
217瀏覽量
2182
發(fā)布評論請先 登錄
相關(guān)推薦
評論