mdprof.c
来自「WinCE 3.0 BSP, 包含Inter SA1110, Intel_815」· C语言 代码 · 共 120 行
C
120 行
/*
Copyright(c) 1998,1999 SIC/Hitachi,Ltd.
Module Name:
mdprof.c
Revision History:
26th April 1999 Released
24th May 1999 Modified (Profile buffer address)
*/
#include <windows.h>
#include <nkintr.h>
#include "platform.h"
#include "shx.h"
#define PROFILER_RAM_START 0xae000000 // start of profile to RAM buffer
#define PROFILER_RAM_END 0xaf000000 // end of profile to RAM buffer
BOOL bProfileEnabled=FALSE; // platform profiler enabled flag
LPDWORD lpdwProfileBufStart=NULL; // platform profile buffer start
LPDWORD lpdwProfileBufNext=NULL; // platform profile buffer next
PDWORD lpdwProfileBufEnd=NULL; // platform profile buffer end
extern BOOL bProfileObjCall; // profile object calls flag
extern BOOL bProfileKCall; // profile KCalls flag
extern BOOL bProfileBuffer; // profile to buffer flag
extern DWORD dwProfileCount;
void OEMProfilerISR(void);
void OEMProfilerBufferISR(void);
/*
@func void | OEMProfileTimerInit | Initialize profiler timer
@rdesc none
@comm OEMProfilerTimerInit is called to initialize the profiler timer.
*/
void OEMProfileTimerInit(void)
{
// nothing to initialize
}
/*
@func void | OEMProfileTimerDisable | Disable profiler timer
@rdesc none
@comm OEMProfilerTimerDisable is called to stop the profiler timer.
*/
void OEMProfileTimerDisable(void)
{
bProfileEnabled=FALSE;
if (bProfileObjCall || bProfileKCall)
return;
WRITE_REGISTER_UCHAR(TMU_TSTR, READ_REGISTER_UCHAR(TMU_TSTR)&(~TMU_TSTR_STR2)); // make sure timer2 is stopped
if (bProfileBuffer)
{
lpdwProfileBufNext= (LPDWORD)(*(LPDWORD)PROFILER_RAM_START);
dwProfileCount= ((DWORD)lpdwProfileBufNext-(DWORD)lpdwProfileBufStart)>>3;
UnhookInterrupt((0x440-0x200)/0x20, (FARPROC)OEMProfilerBufferISR);
}
else
UnhookInterrupt((0x440-0x200)/0x20, (FARPROC)OEMProfilerISR);
}
/*
@func void | OEMProfileTimerEnable | Enable profiler timer
@rdesc none
@comm OEMProfilerTimerEnable
*/
void OEMProfileTimerEnable(DWORD dwUSec)
{
bProfileEnabled=TRUE;
if (bProfileObjCall || bProfileKCall)
return;
bProfileBuffer=TRUE;
if (dwUSec < 500)
dwUSec= 500;
if (bProfileBuffer)
{
lpdwProfileBufStart= (LPDWORD)PROFILER_RAM_START;
*lpdwProfileBufStart++= PROFILER_RAM_START+8;
*lpdwProfileBufStart++= PROFILER_RAM_END;
lpdwProfileBufNext= lpdwProfileBufStart;
lpdwProfileBufEnd= (LPDWORD)PROFILER_RAM_END;
//dwUSec=1;
}
WRITE_REGISTER_UCHAR(TMU_TSTR, READ_REGISTER_UCHAR(TMU_TSTR)&(~TMU_TSTR_STR2)); // make sure timer2 is stopped
WRITE_REGISTER_USHORT(TMU_TCR2, TMU_TCR_UNIE|TMU_TCR_D16);
WRITE_REGISTER_ULONG(TMU_TCOR2, dwUSec);
WRITE_REGISTER_ULONG(TMU_TCNT2, dwUSec);
WRITE_REGISTER_USHORT(INTC_IPRA,
(READ_REGISTER_USHORT(INTC_IPRA)&(INTC_IPRA_TMU2_MASK)) | INTC_IPRA_TMU2_INT); // priority 15 interrupt
if (bProfileBuffer)
HookInterrupt((0x440-0x200)/0x20, (FARPROC)OEMProfilerBufferISR); // hook the interrupt
else
HookInterrupt((0x440-0x200)/0x20, (FARPROC)OEMProfilerISR); // hook the interrupt
WRITE_REGISTER_UCHAR(TMU_TSTR, READ_REGISTER_UCHAR(TMU_TSTR)|(TMU_TSTR_STR2)); // make sure timer2 is stopped
}
DWORD KCP_ScaleDown(DWORD N)
{
extern DWORD OEMClockFreq;
return (N*4 + (OEMClockFreq/2000000))/(OEMClockFreq/1000000);
}
DWORD KCP_GetStartTime()
{
return READ_REGISTER_ULONG(TMU_TCNT1);
}
DWORD KCP_GetElapsedTime(DWORD dwPrev)
{
return dwPrev - READ_REGISTER_ULONG(TMU_TCNT1);
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?