在大多數(shù)固件開發(fā)過程中,需要有某種形式的診斷日志/跟蹤。如果在傳統(tǒng)串口上使用簡單的“printf”調(diào)用實(shí)現(xiàn)日志,每次日志調(diào)用的開銷通常是多個(gè)毫秒,這種時(shí)間消耗將干擾應(yīng)用程序的行為,在異常處理程序或快速控制循環(huán)等時(shí)間關(guān)鍵代碼中是不可接受的。
為了解決這個(gè)問題,很多MCU,如ARM Cortex-M3, M4或M7內(nèi)核的MCU,已經(jīng)在處理器中內(nèi)置了解決方案,即ITM - Instrumentation Trace Macrocell。
ITM是一個(gè)硬件單元,可以傳輸兩種類型的診斷數(shù)據(jù):
1、由DWT單元生成的調(diào)試事件,例如異常事件和數(shù)據(jù)觀察點(diǎn)事件。
2、軟件插裝(SWIT)事件,即代碼記錄的自定義數(shù)據(jù)。
使用ITM,只需將數(shù)據(jù)寫入相應(yīng)的內(nèi)存映射寄存器,用戶即可將任何類型的數(shù)據(jù)作為SWIT事件傳輸?shù)街鳈C(jī)PC。通過相應(yīng)的調(diào)試器,傳輸只需幾個(gè)時(shí)鐘周期,ITM還支持硬件完成的時(shí)間戳。許多IDE允許用戶在調(diào)試窗口中查看這些數(shù)據(jù),或者將數(shù)據(jù)寫入文件供以后分析。數(shù)據(jù)可以是字符形式的文本數(shù)據(jù)(來自printf輸出),但也可以發(fā)送二進(jìn)制數(shù)據(jù),ITM每次寫入最多支持32位數(shù)據(jù)。
ITM單元為SWIT事件提供了32個(gè)邏輯通道,每個(gè)通道都有一個(gè)相應(yīng)的stimulus寄存器,用于接受輸入。這些通道將診斷數(shù)據(jù)分成不同的類別。例如,ARM推薦通道0用于文本數(shù)據(jù),通道31用于RTOS事件,而其他通道可以用于任何目的。所有ITM通道共享一個(gè)公共FIFO緩沖區(qū),該緩沖區(qū)依次連接到一個(gè)或兩個(gè)輸出端口。如果使用完整跟蹤端口和跟蹤調(diào)試器,則ITM數(shù)據(jù)包含在指令跟蹤(ETM)結(jié)果中,但也可以通過調(diào)試端口中常用的串行線輸出(SWO)接口獲得。大多數(shù)針對(duì)ARM MCU的調(diào)試器都支持SWO接口。
ITM FIFO緩沖區(qū)非常小,只有10個(gè)字節(jié),因此如果使用低速的調(diào)試器,如果過于頻繁地向ITM端口寫入數(shù)據(jù),可能會(huì)造成數(shù)據(jù)丟失。這可以在寫入之前通過檢查ITM FIFO是否有空閑空間來防止,在沒有空間的情況下延遲寫入(參見下面的“fputc”代碼示例)。但是,如果調(diào)試器接收數(shù)據(jù)太慢,這種方式可能會(huì)對(duì)系統(tǒng)的時(shí)間產(chǎn)生重大影響。
避免數(shù)據(jù)丟失和阻塞的更好方法是使用快速調(diào)試器,如SEGGER J-Link,Keil ULINK等允許60-100 MHz的SWO采樣率。
在代碼中使用ITM
ITM stimulus寄存器位于地址0xE0000000(端口0)到0xE000007C(端口31)。要寫入數(shù)據(jù),需要做的就是在IDE中啟用ITM跟蹤,并將數(shù)據(jù)寫入相應(yīng)的寄存器。
如果使用的板級(jí)支持包包含ARM的CMSIS API,那么寫入數(shù)據(jù)很簡單:
#include"myMCU.h" // Includes CMSIS
…
ITM->PORT[0].u32 = mydata;
如果系統(tǒng)中沒有使用CMSIS API,可以直接為ITM stimulus寄存器定義宏,如下所示:
#defineITM_PORT(n) (*((volatile unsigned long *)(0xE0000000+4*n)))
…
ITM_PORT(0) = mydata;
在使用ITM跟蹤之前,需要使能ITM跟蹤?;贙eil μVision的示例如下,該系統(tǒng)已配置為在所有32個(gè)ITM stimulus端口啟用ITM跟蹤。如果可能的話,在“Trace port”中選擇Manchester模式,它允許比UART/NRZ模式更高的SWO時(shí)鐘頻率。
為了讓你的“printf”調(diào)用寫入ITM端口0,需要像這樣定義“fputc”函數(shù):
struct __FILE { int handle; /* Add whatever needed */ };
FILE __stdout;
FILE __stdin;
int fputc(int ch, FILE *f)
{
if(DEMCR & TRCENA) // Only ifITM isavailable
{
while(ITM_PORT(0) == 0); // Blockuntil room inITM FIFO
ITM_PORT(0) = ch; // Writethe data
}
return(ch);
}
ITM是大多數(shù)ARM開發(fā)工具支持的重要調(diào)試技術(shù),它在調(diào)試中有許多應(yīng)用,并且易于入門!
Percepio Tracealyzer利用ITM的性能,實(shí)現(xiàn)RTOS實(shí)時(shí)數(shù)據(jù)跟蹤。Tracealyzer允許用戶跟蹤和可視化RTOS任務(wù),異常(ISR)和其他軟件事件的執(zhí)行,提供超過30個(gè)相互關(guān)聯(lián)的視圖,為基于RTOS的固件的運(yùn)行時(shí)世界提供驚人的視覺洞察,加速開發(fā),驗(yàn)證和調(diào)試。
Tracealyzer支持ARM Cortex-M3, M4和M7 MCU的ITM跟蹤,實(shí)現(xiàn)FreeRTOS,μC/OS-III和SafeRTOS等RTOS的可視化分析。
審核編輯:劉清
-
處理器
+關(guān)注
關(guān)注
68文章
19440瀏覽量
231326 -
ITM
+關(guān)注
關(guān)注
0文章
6瀏覽量
8951 -
RTOS
+關(guān)注
關(guān)注
22文章
820瀏覽量
119920 -
Cortex-M3
+關(guān)注
關(guān)注
9文章
270瀏覽量
59610 -
調(diào)試器
+關(guān)注
關(guān)注
1文章
306瀏覽量
23847
原文標(biāo)題:如何利用ITM實(shí)現(xiàn)更快的跟蹤?
文章出處:【微信號(hào):麥克泰技術(shù),微信公眾號(hào):麥克泰技術(shù)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
M487JIDAE如何使用ITM功能實(shí)現(xiàn)printf打印?
ITM-AP02/ITM-AP03/ITM-AP04三款經(jīng)典AR9331無線AP模塊
【NUCLEO-F412ZG試用體驗(yàn)】ITM機(jī)制輸出調(diào)試信息
Tracealyzer利用CortexM的ITM實(shí)現(xiàn)流跟蹤
ITM調(diào)試
如何使用ITM機(jī)制實(shí)現(xiàn)調(diào)試stm32單片機(jī)實(shí)現(xiàn)printf與scanf?
如何在SWV ITM data console窗口看到printf打印的內(nèi)容?
如何使用ITM調(diào)試不適用于STM32CubeIDE中的SWV?
M487JIDAE如何使用ITM功能實(shí)現(xiàn)printf打印?
M487JIDAE如何使用ITM功能實(shí)現(xiàn)printf打印?
ITM公司采用Broadcom藍(lán)牙技術(shù)
基于ITM-DOPA-B-01無線連結(jié)的參考設(shè)計(jì)
![基于<b class='flag-5'>ITM</b>-DOPA-B-01無線連結(jié)的參考設(shè)計(jì)](https://file.elecfans.com/web1/M00/D9/9F/pIYBAF_3lhGAMrWYAABumED29uA302.jpg)
基于ITM-DYPA-B-01無線連結(jié)的參考設(shè)計(jì)
![基于<b class='flag-5'>ITM</b>-DYPA-B-01無線連結(jié)的參考設(shè)計(jì)](https://file.elecfans.com/web1/M00/D9/2A/o4YBAF_3lj-AUU9qAAA0i0T-JFA051.jpg)
基于ITM-MKR680Temperature Sensing的參考設(shè)計(jì)1
![基于<b class='flag-5'>ITM</b>-MKR680Temperature Sensing的參考設(shè)計(jì)1](https://file.elecfans.com/web2/M00/05/AC/pYYBAGDijGaAUL7tAAC8d2_eLPo336.jpg)
評(píng)論