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 + -
显示快捷键?