WinCE OAL中的Profiler的實現

作者:ARM-WinCE

 

OAL中的Profiler的實現是指Monte Carlo Profiler,作爲WinCE Kernel profiler的一種,它主要是通過高精度Timer的中斷來進行週期性的計數,從而統計各函數的sample數,達到評測某一個模塊或者函數的性能的目的。

 關於OALMonte Carlo Profiler的實現,有一篇不錯的文章如下:

http://blogs.msdn.com/ce_base/archive/2006/01/23/516637.aspx

 我想我在這裏要說的大概也是這個意思,可能會解釋的稍微詳細一點。下面介紹一下如何實現:

 

1. 實現OEMProfileTimerEnableOEMProfileTimerDisable

profiler啓動的時候會調用OEMProfileTimerEnable函數來啓動一個高精度的Timer,該函數還會註冊並使能Timer中斷。當profiler停止的時候會調用OEMProfileTimerDisable函數來停止Timer的運行,同時也會屏蔽Timer的中斷。舉例說明一下:

VOID OEMProfileTimerEnable(DWORD interval)

{

    BOOL enabled;

    UINT32 Irq;

 

    // Profiler已經啓動,直接返回

    if (g_profiler.enabled) return;

 

    // 計算高精度Timercount

    g_profiler.countsPerHit = (g_oalTimer.countsPerMSec*interval)/1000;

 

    // 關閉中斷

    enabled = INTERRUPTS_ENABLE(FALSE);

    // 賦值Profiler的中斷處理函數

    g_pProfilerISR = OALProfileIntrHandler;

    // 配置高精度Timercount

    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,分別是ProfileStartProfileStop函數。

 

3. 通過ProfilerAPI函數來到控制

通過ProfileStartProfileStop函數來控制。

 

VOID ProfileStart(DWORD dwUSecInterval, DWORD dwOptions)

dwUSecInterval:採樣精度,微秒級。

dwOptionsProfiler的標記位

    PROFILE_BUFFER:使用Buffer模式

    PROFILE_CONTINUE:恢復Profiler採樣

    PROFILE_KCALL:記錄內核調用

    PROFILE_OBJCALL:記錄目標調用

    PROFILE_PAUSE:停止Profiler採樣

    PROFILE_STARTPAUSED:啓動Profiler但處在暫停狀態

該函數用於啓動Profiler,一般在Buffer模式下,推薦將dwUSecInterval設置爲200微秒。

 

VOID ProfileStop (void);

該函數用於停止Profiler功能。

 

發佈了90 篇原創文章 · 獲贊 4 · 訪問量 65萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章