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,再重啟連線即可)先用著吧,
總結: 很多工具我們可能是想用用就算了,不想深入研究其中東西,但是有時候還是事宜願為,凡事需要弄懂其中道理才會真正的使用自如。。。。