用SWD調試接口測量代碼運行時間 ( SWO )

用SWD調試接口測量代碼運行時間

關於時間測量的種種問題

在嵌入式中,咱們常常須要測量某段代碼的執行時間或測量事件觸發的時間,常規的思路是:git

1:在測量起始點,反轉電平
2:在測量結束點,再次反轉電平github

而後經過示波器或者邏輯分析儀來測量反轉間隔,也就是代碼時間性能

這種方法,在測量兩個或多個時間信號同步的時候,很是有用,實際上,這也是惟一的方法。測試

可是若是在測量中,其它代碼也會控制這個管腳電平或者週期性動做,這時便須要在<動做1>以前
增長前導碼,從而便於在繁雜的波形中,一眼識別出須要特定的波形大數據

同時,若是測量的時間值很是小,那麼用示波器即使能夠識別,但不容易捕獲優化

SWD解決方案

在ARM Cortex-M 芯片中,用SWD調試接口取代了傳統的JTAG調試接口,從而佔用MCU更少的管腳,同時提升了調試性能。ui

SWD由四根線組成,SWO,SWDIO,SWCLK,GND;SWDIO和SWCLK組成了基本的串行調試接口,SWO則提供一個信息輸出通道,
能夠輸出不少信息,好比指令的執行時間或者ISR觸發事件,因此咱們能夠經過SWD接口配合IDE來獲取代碼執行時間,從而在某種程度上取代示波器spa

IAR中使用SWD測量時間

注:下文假設讀者已經熟悉IAR的使用方法,若是您不熟悉,請參考網上對應的入門教程debug

1:配置SWD時鐘

這裏,咱們須要在調試器選項中調試

1:選擇SWD調試接口

2:將時鐘頻率設置成MCU的時鐘頻率,同時將SWO時鐘選擇成自動識別模式

配置完成後,進入debug模式,選擇J-Link—>SWD Configuration配置頁,重點關注SWO時鐘的實際值,以下所示

若是顯示不對,則說明SWO配置不對

2:設置時標變量

在示波器方案中,咱們須要用某個管腳來測量實際,SWD也相似,只不過將物理管腳替換成某個變量而已。

這裏,咱們設置TimeLine變量做爲時標變量

volatile uint32_t TimeLine = 0;

 

volatile是爲了防止TimeLine被編譯器優化,從而形成測量值不許確。

3:設置Data Log

Data Log是IAR的一種調試斷點,相似數據斷點,IAR會實時記錄對應的變化,所以被稱爲Log。

在調試模式下,在TimeLine變量上右擊,選擇」Set Data Log Breakpoint for ‘TimeLine’」選項

 

設置後,不會像常規的斷點那樣用紅色來標註,在IAR底下,咱們須要進入Jlink的BreakPoint Usage來查看,以下圖所示

這裏,咱們能夠清楚的看到TimeLine已經被設置成讀寫斷點

4:使能Data Log和Data Log Summary

在Jlink菜單下,進入Data LogData Log Summary窗口,而後右鍵選擇Enable

至此,咱們設置完畢,能夠將TimeLine放置在測量的起始,結束位置

5:開始時間測量

咱們的測試代碼以下

while(1)
{
    TimeLine = 0;
    index++;
    TimeLine = 1;
    index++;
}

按上述完成配置後,點擊Run全速運行幾秒鐘,而後暫停,能夠在Data LogData 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變量搞混了)

效果圖以下所示

6:注意事項

當SWO數據量過大的時候,容易出現過沖的狀況,解決方案是在調試模式下,單步進行,從而避免發送大數據

全文完,但願本文對您有幫助^_^

相關文章
相關標籤/搜索