1. 程式人生 > >Jlink 使用 RTT 輸出除錯資訊總結

Jlink 使用 RTT 輸出除錯資訊總結

一天的突然訊息,聽說Jlink 可以僅僅使用自身就可以輸出除錯資訊,不在使用多餘的其他UART 外界介面,所以就花了3天時間折騰了下(網上搜索,使用很簡單,但是自己去使用三天才正常輸出,踩了不少坑,所以現在記錄一下),

 

Jlink 輸出除錯資訊可以通過兩種方法

一,Jlink的 Target功能,該方法需要用到Jlink 的SWO引腳,如果外設晶片沒有這個腳的話,說明這個方式是行不通的  ,

其實配置很簡單

1.1如下配置Jlink的配置

 1.2,新增printf的重定向,到SWO

#define ITM_Port8(n)    (*((volatile unsigned char *)(0xE0000000+4*n)))
#define ITM_Port16(n)   (*((volatile unsigned short*)(0xE0000000+4*n)))
#define ITM_Port32(n)   (*((volatile unsigned long *)(0xE0000000+4*n)))

#define DEMCR           (*((volatile unsigned long *)(0xE000EDFC)))
#define TRCENA          0x01000000

int fputc(int ch, FILE *f) 
{
  if (DEMCR & TRCENA) {
    while (ITM_Port32(0) == 0);
    ITM_Port8(0) = ch;
  }
  return(ch);
}

1.3,在如MDK IDE的Debug printf 視窗就可以看到你的除錯資訊

 

二,使用Jlink的 RTT功能 ,

其實我主要是使用這個功能,這個功能是不需要另外接其他引腳的,如果使用SW連線方式,僅僅兩根線就可以,

 

RTT 是Jlink的一種實時終端的方式連線輸出除錯資訊,網上有很多說明之間按照做就可以,我僅僅是記錄一下自己的步驟,和自己遇到的坑,記錄一下自己的解決方案,

1,就是下載RTT軟體包,

下載RTT檔案: http://download.segger.com/J-Link/RTT/RTT_Implementation_140925.zip  

2,按照V4.9e上的Jlink驅動,因為版本是不支援Jlink RTT的傳輸,

3,新增RTT檔案到自己的工程

4,新增必要的標頭檔案,

5,輸出函式列印

 

這個時候RTT在程式中就新增成功了,,我們可以使用使用Jlink帶的3各工具進行檢視資料

如開啟RTT Viewer 提升連線,點選OK  不出意外的化,你就可以看到除錯資訊了,

 

 

其實到這裡  ,一般就完事了,但是  我的之前就是出意外了,最後一步就是不能輸出資訊,,網上搜索了很多放到就是不行,

 

我的現象是:

1,新增RTT檔案這些感覺一切正常,

2,我是用RTT Client 連線,能連線上,但是不會輸出除錯資訊

3, RTT Viewer  RTT Logger 等也是都可以連線

4,Jlink的連線視窗一直在提示是在讀取

可是就是一直沒有資料輸出,可憐我的心了 ,,,

 

解決:

一開始以為是Jlink驅動不對,因為是我的電腦上安裝了多個版本的Jlink版本,在MDK的 Jlink資料夾內還是會給你拷貝一份驅動在那儲存,每次啟動會直接用那份驅動,具體那份驅動是哪個版本,直接點選Jlink.exe或者從Keil的這個視窗可以看出

我再使用單獨安裝的Jlink 驅,可能會和這個版本不一樣,每次點選RTT 的那三個創,一意孤行的認為不對,可能就是驅動的問題,結果,  換了最新,又後退版本的折騰好久,結果,很確定的說,,,,和這個沒有關係,,

 

2,網上看到可能是需要修改RTT的原始碼,什麼識別的字元不對,等等,研究了半天,感覺他們的修改就是非必要的, 在SEGGER_RTT_Conf,h就已經有一個巨集是區分程式在RAM中的情況, 

#define SEGGER_RTT_IN_RAM,   把他定義為1,即就是他們修改的方式了,

但是在我的工程中也是未能成功輸出,

 

 

氣的不行,為毛我的還不出來,網上真沒有其他說法了,

 

狠下心去看看 這個RTT是個什麼鬼,,

終極解決方案:RTT是什麼鬼, 不用說我們都可以知道Jlink是做什麼的, 就是下載程式,除錯程式,也就是說Jlink可以任意讀寫片上的記憶體,,RTT是怎麼出來了,其中的具體實現是不清楚的,這是封閉的,但是我們可以看出

1,在RTT開啟後從Jlink的Control Panel可以看出,RTT是一直在讀取資料的過程,

2,我們在程式碼中去看SEGGER_RTT.c  其實就是一個在往一個buffer中寫資料就是   

 

這下明白了,,RTT其實就是一個Jlink讀片子上的一個記憶體buffer中的讀寫,即,_SEGGER_RTT 中定義;這個buffer中的第一項是acID[16],它是做什麼的,就是Jlink去讀記憶體時,回去中這部分字串,如果匹配上了,就是找到了這個buffer,就在這部分記憶體中讀取資料,,會根據規定的資料機構就解析記憶體上的資料, 來實現RTT是讀寫,如果找不到那讀寫資料就辦不到了,

而我的RTT連線正常,但是沒有資料也就是找不到這片記憶體,

為什麼找不到:我使用的片子不是市面上常用的  XXX片子,  這是一個私有定製的片子,記憶體偏移的這些存在很多不同的地方,

具體Jlnk 是怎樣的搜尋這片記憶體就沒再去深究了,我們先來測試一下我們的研究成果過吧,

1,啟動程式,

2,開啟RTT Viewer,提示配置,  居然它找不到我就直接給它吧,不要讓它再去找了,累壞它咋辦,

點選OK,我去,終於出來了,3天時間,====不夠聰明啊。。。。

有點小糾結: RTT Viewer 在每次除錯啟動後需要重啟點選,不知道這有為毛,(直接快捷鍵F2,再重啟連線即可)先用著吧,

 

總結: 很多工具我們可能是想用用就算了,不想深入研究其中東西,但是有時候還是事宜願為,凡事需要弄懂其中道理才會真正的使用自如。。。。