Keil MDK Trace功能的配置
一、硬件、軟件環(huán)境
1、硬件環(huán)境:
(1)開(kāi)發(fā)板:ATSAMV71Q21開(kāi)發(fā)板(注:開(kāi)發(fā)板需帶ETM模塊接口)

(2)仿真器:ULINK pro仿真器(注:仿真器支持ETM功能即可)

2、軟件環(huán)境:
(1)系統(tǒng):window11?專(zhuān)業(yè)版
(2)軟件:Keil MDK pro版
二、ETM功能配置流程
1、新建初始化文件”SAMx7_TP.ini”

初始化文件的內(nèi)容如圖所示:(注:不同型號(hào)的芯片的對(duì)應(yīng)trace功能的初始化文件可能不一致,不同芯片的trace功能的初始化文件可以參考幫助文檔Configure Cortex-M Devices for Tracing部分)

初始化文件主要內(nèi)容是將ETM功能使能和對(duì)應(yīng)的GPIO口進(jìn)行對(duì)應(yīng)的使能。
首先是對(duì)于電源管理控制器(PMC)進(jìn)行寫(xiě)保護(hù)失能,使得可以對(duì)PMC對(duì)應(yīng)的寄存器進(jìn)行操作。據(jù)數(shù)據(jù)手冊(cè)查詢(xún),PCK3時(shí)鐘對(duì)應(yīng)的是ETM外部設(shè)備,所以要設(shè)置ETM的主時(shí)鐘,使能PCK3時(shí)鐘。

然后是使能PIOD的時(shí)鐘,要對(duì)于PIOD組進(jìn)行設(shè)置也需要對(duì)于PIOD的寫(xiě)保護(hù)進(jìn)行失能并禁止PIO控制相對(duì)應(yīng)的引腳,啟用對(duì)于對(duì)應(yīng)引腳的外圍控制,讓仿真器可以對(duì)于對(duì)應(yīng)IO口進(jìn)行控制。
然后是對(duì)于IO口的復(fù)用,需要對(duì)于寄存器0和寄存器1進(jìn)行設(shè)置。讓PD8設(shè)置成無(wú)上拉下拉,PD7~4設(shè)置成輸入改變中斷模式,無(wú)上拉下拉。
最后設(shè)置一個(gè)重啟執(zhí)行函數(shù)OnResetExec,讓該函數(shù)可以通過(guò)uVision的“重置”按鈕重置后執(zhí)行。
2、添加初始化文件:將初始化文件添加到Keil->option for target->Debug->Initialization File中,



3、選擇仿真器
仿真器需要選擇支持ETM功能的,而ULINK pro仿真器支持ETM功能,所以仿真器選項(xiàng)可以選擇”ULINK Pro Cortex Debugger”。

4、配置Keil的debug和trace選項(xiàng)
(1)點(diǎn)擊settings進(jìn)入設(shè)備設(shè)置界面

(2)在Debug選項(xiàng)中,需要將port選擇SW接口

(3)然后在trace配置上,需要設(shè)置core clock,核心時(shí)鐘必須與設(shè)備配置相對(duì)應(yīng)。并且勾選”Use Core Clock”,讓trace clock和core clock保持一致。

(4)然后,勾選”Trace Enable”和”ETM Trace Enable”,讓Trace和ETM功能使能。

(5)Trace Port的設(shè)置必須始終與”xxxx.ini”文件中的設(shè)置相對(duì)應(yīng)。在配置文件中,配置了PD4-PD8五個(gè)IO口,其中TRACED[0..3]在引腳PD4到PD7上輸出,跟蹤時(shí)鐘TRACECK在引腳PD8上配置。所以,Trace Port選擇”Sync Trace Port with 4-bit Data”。
CLK為引腳TRACECLK設(shè)置以ns為單位的信號(hào)延遲。通常,無(wú)需更改,0.0 ns的值就足夠了。
D0..D3為引腳TRACEDATA[0]..TRACEDATA[3]設(shè)置以ns為單位的信號(hào)延遲。通常,無(wú)需更改,0.0 ns的值就足夠了。

(6)這里的PC Sampling部分定義了生成儀器跟蹤數(shù)據(jù)的間隔。除了周期性生成外,還可以為每個(gè)存儲(chǔ)器讀/寫(xiě)操作生成PC采樣。設(shè)置PC的采樣間隔為1024*16.(周期性PC值的頻率?= 核心時(shí)鐘/預(yù)分頻器)

?(7)Trace Event設(shè)置這里可以根據(jù)需求自行進(jìn)行勾選,勾選項(xiàng)會(huì)在Event Counters窗口出展示。


CPI(每條指令的周期):用于指令周期計(jì)數(shù)估計(jì)的通用計(jì)數(shù)器。此計(jì)數(shù)器在執(zhí)行多周期指令所需的每個(gè)額外周期上遞增。在任何指令獲取暫停的每個(gè)周期,計(jì)數(shù)器也會(huì)遞增。指令的第一個(gè)周期和LSU記錄的周期不計(jì)數(shù)。
EXC(異常開(kāi)銷(xiāo)):計(jì)數(shù)器在與異常條目或返回相關(guān)聯(lián)的每個(gè)周期上遞增。也就是說(shuō),它統(tǒng)計(jì)與入口堆疊、返回取消堆疊、搶占和其他異常相關(guān)進(jìn)程相關(guān)的周期。
SLEEP(睡眠周期):無(wú)論是由WFI或WFE指令啟動(dòng),還是由退出時(shí)休眠功能啟動(dòng),計(jì)數(shù)器在與省電相關(guān)的每個(gè)周期上遞增。
LSU(加載存儲(chǔ)單元周期):此計(jì)數(shù)器在執(zhí)行多周期加載存儲(chǔ)指令所需的每個(gè)額外周期上遞增。它不計(jì)算執(zhí)行任何指令所需的第一個(gè)周期。
FOLD(折疊指令):計(jì)數(shù)器對(duì)以零周期執(zhí)行的任何指令遞增(例如,IT指令被折疊且不使用任何周期)。
EXCTRC(異常跟蹤):計(jì)數(shù)器在異常、中斷條目和中斷退出時(shí)遞增?!案櫘惓!贝翱陲@示統(tǒng)計(jì)信息和事件查看器隨時(shí)間的執(zhí)行情況。
5、完成上述步驟,Trace功能和ETM功能就配置完成,進(jìn)入調(diào)試界面后,界面下方出現(xiàn)”Trace: Running”則表示配置成功,可以使用Trace、ETM功能。

若出現(xiàn)的不是”Trace:Running”,需要根據(jù)對(duì)應(yīng)的提示信息對(duì)于配置流程進(jìn)行篩查。
例如:
“Trace:Communication Error”:表示檢測(cè)到無(wú)效通信。不正確的時(shí)鐘設(shè)置或硬件問(wèn)題導(dǎo)致此消息。在main()程序中更改核心時(shí)鐘的應(yīng)用程序可能會(huì)在數(shù)據(jù)捕獲錯(cuò)誤時(shí)拋出此消息。一旦核心時(shí)鐘調(diào)整到系統(tǒng)設(shè)置,此錯(cuò)誤消息將消失。
“Trace:HW Buffer”:表示檢測(cè)到溢出USB端口無(wú)法以適配器發(fā)送數(shù)據(jù)的速度接收數(shù)據(jù)。關(guān)閉不需要的跟蹤事件,或跳過(guò)“PC采樣”。
“Trace:SW Buffer”:表示PC上的內(nèi)部SW緩沖區(qū)溢出。調(diào)整跟蹤端口的SWO時(shí)鐘預(yù)分頻器或調(diào)試端口的最大時(shí)鐘。
“Trace:No Synchronization”:表示未從目標(biāo)接收到同步數(shù)據(jù)包。跟蹤硬件未連接或配置不正確。
“Trace:Data Stream Error”:表示跟蹤端口太忙,無(wú)法傳輸所有跟蹤數(shù)據(jù)包。捕獲太多跟蹤數(shù)據(jù)時(shí)會(huì)發(fā)生這種情況。減少跟蹤事件的數(shù)量。“指令跟蹤窗口”顯示溢出發(fā)生的位置。
三、功能展示
1、代碼覆蓋率功能:可以顯示函數(shù)的執(zhí)行百分比了。

2、性能分析功能:可以查看工程中每一個(gè)文件、函數(shù)、語(yǔ)句的執(zhí)行時(shí)間和占用總時(shí)間的比例。

完
