作者:ARM-WinCE
OAL中的Profiler的實現是指Monte Carlo Profiler,作爲WinCE Kernel profiler的一種,它主要是通過高精度Timer的中斷來進行週期性的計數,從而統計各函數的sample數,達到評測某一個模塊或者函數的性能的目的。
關於OAL中Monte Carlo Profiler的實現,有一篇不錯的文章如下:
http://blogs.msdn.com/ce_base/archive/2006/01/23/516637.aspx
我想我在這裏要說的大概也是這個意思,可能會解釋的稍微詳細一點。下面介紹一下如何實現:
1. 實現OEMProfileTimerEnable和OEMProfileTimerDisable
當profiler啓動的時候會調用OEMProfileTimerEnable函數來啓動一個高精度的Timer,該函數還會註冊並使能Timer中斷。當profiler停止的時候會調用OEMProfileTimerDisable函數來停止Timer的運行,同時也會屏蔽Timer的中斷。舉例說明一下:
VOID OEMProfileTimerEnable(DWORD interval)
{
BOOL enabled;
UINT32 Irq;
// Profiler已經啓動,直接返回
if (g_profiler.enabled) return;
// 計算高精度Timer的count數
g_profiler.countsPerHit = (g_oalTimer.countsPerMSec*interval)/1000;
// 關閉中斷
enabled = INTERRUPTS_ENABLE(FALSE);
// 賦值Profiler的中斷處理函數
g_pProfilerISR = OALProfileIntrHandler;
// 配置高精度Timer的count值
ConfigureNextProfilerCount(g_profiler.countsPerHit);
// 打開中斷
INTERRUPTS_ENABLE(enabled);
Irq = IRQ_TIMER2;
OALIntrDoneIrqs(1, &Irq);
// 設置Profiler使能標記位
g_profiler.enabled = TRUE;
}
VOID OEMProfileTimerDisable()
{
BOOL enabled;
UINT32 irq;
// Profiler已經屏蔽,直接返回
if (!g_profiler.enabled) return;
// 關閉中斷
enabled = INTERRUPTS_ENABLE(FALSE);
// 清楚高精度Timer的中斷標記位
g_pPWMReg->TINT_CSTAT = TINT_CSTAT_INTMASK(g_pPWMReg->TINT_CSTAT) | TIMER2_PENDING_CLEAR;
// 禁用高精度Timer
g_pPWMReg->TINT_CSTAT = TINT_CSTAT_INTMASK(g_pPWMReg->TINT_CSTAT) & ~TIMER2_INTERRUPT_ENABLE;
// 屏蔽高精度Timer中斷
irq = IRQ_TIMER2;
OALIntrDisableIrqs(1, &irq);
// 設置Profiler的中斷處理函數爲NULL
g_pProfilerISR = NULL;
// 設置Profiler標記位
g_profiler.enabled = FALSE;
// 打開中斷
INTERRUPTS_ENABLE(enabled);
}
2. 實現OALProfileIntrHandler來處理Profiler的中斷
函數OALProfileIntrHandler用於處理高精度Timer的中斷,該函數會在OEMInterruptHandler中被調用,並返回SYSINTR_NOP。在該函數中需要調用ProfileHit函數,這裏傳入ProfileHit函數的參數要和OEMInterruptHandler的參數一致。舉例如下:
UINT32 OALProfileIntrHandler(UINT32 ra)
{
UINT32 Irq;
// 更新高精度Timer的計數
ConfigureNextProfilerCount(g_profiler.countsPerHit);
// 調用ProfilerHit採樣
ProfilerHit(ra);
// 使能Timer
Irq = IRQ_TIMER2;
OALIntrDoneIrqs(1, &Irq);
return(SYSINTR_NOP);
}
在OAL中實現上面的3個函數就可以了,要支持Monte Carlo Profiler還需要對你的WinCE工程做其它的設置。在WinCE的編譯選項中選擇”Enable profiling (IMGPROFILER=1)”並確認config.bib文件有如下代碼:
IF IMGPROFILER
PROFILE=ON
ELSE
PROFILE=OFF
ENDIF
最後要做的就是Makeimg了。在WinCE運行以後,可以通過以下幾種方法控制Monte Carlo Profiler,如下:
1. 通過Target Control命令來控制
prof on -m :啓動Monte Carlo Profiler
prof off :停止Profiler
2. 通過鍵盤來控制
如果系統支持鍵盤,那麼默認情況下,鍵盤是支持Profiler的控制的。按F9啓動Monte Carlo Profiler,按F12停止Profiler功能。實際上,在按下這些按鍵的時候系統調用了API函數來啓動和停止Profiler,分別是ProfileStart和ProfileStop函數。
3. 通過Profiler的API函數來到控制
通過ProfileStart和ProfileStop函數來控制。
VOID ProfileStart(DWORD dwUSecInterval, DWORD dwOptions)
dwUSecInterval:採樣精度,微秒級。
dwOptions:Profiler的標記位
PROFILE_BUFFER:使用Buffer模式
PROFILE_CONTINUE:恢復Profiler採樣
PROFILE_KCALL:記錄內核調用
PROFILE_OBJCALL:記錄目標調用
PROFILE_PAUSE:停止Profiler採樣
PROFILE_STARTPAUSED:啓動Profiler但處在暫停狀態
該函數用於啓動Profiler,一般在Buffer模式下,推薦將dwUSecInterval設置爲200微秒。
VOID ProfileStop (void);
該函數用於停止Profiler功能。