在嵌入式中,咱們常常須要測量某段代碼的執行時間或測量事件觸發的時間,常規的思路是:git
1:在測量起始點,反轉電平
2:在測量結束點,再次反轉電平github
而後經過示波器或者邏輯分析儀來測量反轉間隔,也就是代碼時間性能
這種方法,在測量兩個或多個時間信號同步的時候,很是有用,實際上,這也是惟一的方法。測試
可是若是在測量中,其它代碼也會控制這個管腳電平或者週期性動做,這時便須要在<動做1>以前
增長前導碼,從而便於在繁雜的波形中,一眼識別出須要特定的波形大數據
同時,若是測量的時間值很是小,那麼用示波器即使能夠識別,但不容易捕獲優化
在ARM Cortex-M 芯片中,用SWD調試接口取代了傳統的JTAG調試接口,從而佔用MCU更少的管腳,同時提升了調試性能。ui
SWD由四根線組成,SWO,SWDIO,SWCLK,GND;SWDIO和SWCLK組成了基本的串行調試接口,SWO則提供一個信息輸出通道,
能夠輸出不少信息,好比指令的執行時間或者ISR觸發事件,因此咱們能夠經過SWD接口配合IDE來獲取代碼執行時間,從而在某種程度上取代示波器spa
注:下文假設讀者已經熟悉IAR的使用方法,若是您不熟悉,請參考網上對應的入門教程debug
這裏,咱們須要在調試器選項中調試
1:選擇SWD調試接口
2:將時鐘頻率設置成MCU的時鐘頻率,同時將SWO時鐘選擇成自動識別模式
配置完成後,進入debug模式,選擇J-Link—>SWD Configuration配置頁,重點關注SWO時鐘的實際值,以下所示
若是顯示不對,則說明SWO配置不對
在示波器方案中,咱們須要用某個管腳來測量實際,SWD也相似,只不過將物理管腳替換成某個變量而已。
這裏,咱們設置TimeLine變量做爲時標變量
volatile uint32_t TimeLine = 0;
volatile
是爲了防止TimeLine
被編譯器優化,從而形成測量值不許確。
Data Log是IAR的一種調試斷點,相似數據斷點,IAR會實時記錄對應的變化,所以被稱爲Log。
在調試模式下,在TimeLine變量上右擊,選擇」Set Data Log Breakpoint for ‘TimeLine’」選項
設置後,不會像常規的斷點那樣用紅色來標註,在IAR底下,咱們須要進入Jlink的BreakPoint Usage來查看,以下圖所示
這裏,咱們能夠清楚的看到TimeLine
已經被設置成讀寫斷點
在Jlink菜單下,進入Data Log
和Data Log Summary
窗口,而後右鍵選擇Enable
至此,咱們設置完畢,能夠將TimeLine放置在測量的起始,結束位置
咱們的測試代碼以下
while(1) { TimeLine = 0; index++; TimeLine = 1; index++; }
按上述完成配置後,點擊Run
全速運行幾秒鐘,而後暫停,能夠在Data Log
和Data Log Summary
窗口看到對應的信息
咦,爲何全是Overflow???哪裏錯了
還記得咱們剛開始設置SWO的時鐘速度嗎?當時間測量點的間隔太小,且發送速率過快時,會超出SWO的傳輸能力,從而形成overflow問題
爲了驗證確實是這個緣由,咱們將在代碼中插入一些軟件延時,以下所示
void delay(volatile uint32_t tick) { while(tick--); } .... while(1) { TimeLine = 0; index++; delay(0xFFFF); TimeLine = 1; index++; delay(0xFFFF); }
重編譯,進入調試模式,全是運行,暫停,ok,此次能夠看到一切正常了
/******************** Data log 窗口 ************************/ Time Approx PC Description Type Value Address 17040.43 us X 0x8000a6c TimeLine W 0 @ 0x20000390+? 25232.68 us X 0x8000a7c TimeLine W 1 @ 0x20000390+? 33424.99 us X 0x8000a6c TimeLine W 0 @ 0x20000390+? 41617.24 us X 0x8000a7c TimeLine W 1 @ 0x20000390+? 49809.54 us X 0x8000a6c TimeLine W 0 @ 0x20000390+? 58001.79 us X 0x8000a7c TimeLine W 1 @ 0x20000390+? 66194.10 us X 0x8000a6c TimeLine W 0 @ 0x20000390+? 74386.35 us X 0x8000a7c TimeLine W 1 @ 0x20000390+? 82578.65 us X 0x8000a6c TimeLine W 0 @ 0x20000390+? 90770.90 us X 0x8000a7c TimeLine W 1 @ 0x20000390+? 98963.21 us X 0x8000a6c TimeLine W 0 @ 0x20000390+? /********************* Data Log Summary 窗口 *****************/ TimeLine Total Accesses: 335 Read Accesses: 0 Write Accesses: 335 Approximative time count: 335 Overflow count: 0
另外,咱們也能夠打開J-link菜單下的TimeLine選項(不要和咱們的TimeLine變量搞混了)
效果圖以下所示
當SWO數據量過大的時候,容易出現過沖的狀況,解決方案是在調試模式下,單步進行,從而避免發送大數據
全文完,但願本文對您有幫助^_^