⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 timer0.c

📁 Wince4.2 BSP for SH4 engineering development board
💻 C
字号:

//
//      Copyright (c) Renesas Technology Corp. 2002-2003  All Rights Reserved.
//
//      OEM Adaptation Layer
//
//----------------------------------------------------------------------------
//	
//	File		:	TIMER0.c
//	Created		:	2002.01.31
//  Modified    :   2003.08.06
//  Author      :   Renesas Technology Corp.
//  Hardware    :   RENESAS HS7751RSTC01H (S1-E, ITS-DS5)
//  Target OS   :   Microsoft(R) Windows(R) CE .NET 4.2
//	Notes   	:	
//	History		:
//					2002.09.26
//					- Released HS7751RSTC01H (S1-E, ITS-DS5)


#include <windows.h>
#include <nkintr.h>
#include "s1e.h"
#include "oalintr.h"
#include "shx.h"
#include <oemwake.h>

extern BOOL fIntrTime;
extern DWORD dwIsrTime1;
extern DWORD dwIsrTime2;
extern DWORD dwSPC;                                                            
extern WORD  wNumInterrupts;
extern volatile DWORD CurMSec;
extern volatile ULARGE_INTEGER CurTicks;
extern DWORD dwReschedIncrement;
extern DWORD dwIntrTimeCountdown;
extern DWORD dwIntrTimeCountdownRef;
extern DWORD dwPerfCountHigh;

#define CE_MAJOR_VER    4

#define PERFCOUNT_MACRO() ( READ_REGISTER_ULONG(TMU_TCOR0) - READ_REGISTER_ULONG(TMU_TCNT0) )

#if (CE_MAJOR_VER == 0x0003)
extern volatile DWORD DiffMSec;
extern DWORD ticksleft;
extern DWORD dwSleepMin;
extern DWORD dwPreempt;
#else
extern DWORD dwReschedTime;
#endif

DWORD C_Timer0ISR(void)
{
WORD	wTCR0;


	// Check for IntrTime measurements (COMMON)
	if(!fIntrTime) goto skip_isrtime1;

	// Get ISR latency and saved program counter (INTRTIME)
	dwIsrTime1 = PERFCOUNT_MACRO();
	__asm(	"stc  spc, r0   \n"
			"mov.l  r0, @r4   \n"
		, &dwSPC);	// Save Program Counter
	wNumInterrupts++;

skip_isrtime1:                      

	// Clear the timer interrupt (COMMON)
	wTCR0 = READ_REGISTER_USHORT(TMU_TCR0);

tisr10:	
	// clear timer underflowed flag  and set new tcr0 value
	WRITE_REGISTER_USHORT(TMU_TCR0, wTCR0 & 0x00ff);
	wTCR0 = READ_REGISTER_USHORT(TMU_TCR0);
	if(wTCR0 & 0x0100) goto tisr10;	// bit not clear, go clear it again!

#if (CE_MAJOR_VER == 0x0003)
	// Update CurMSec and DiffMSec (COMMON)
	CurMSec += RESCHED_PERIOD;	// update current millisecond counter
	DiffMSec += RESCHED_PERIOD;	// update millisecond delta
#else
	// Update CurMSec(COMMON)
	CurMSec += RESCHED_PERIOD;	// update current millisecond counter
#endif

	// Update CurTicks (COMMON)
	if(CurTicks.LowPart > CurTicks.LowPart + dwReschedIncrement){
		CurTicks.HighPart ++;
	}
	CurTicks.LowPart += dwReschedIncrement;


	if(!fIntrTime) goto normal;

	// Check the countdown (INTRTIME)
	dwIntrTimeCountdown--;
	if(dwIntrTimeCountdown > 0) goto normal;
	dwIntrTimeCountdown = dwIntrTimeCountdownRef;
	// Zero wNumInterrupts, which counts interrupts since SYSINTR_TIMING
	wNumInterrupts = 0;

	// Get end-of-ISR time. (INTRTIME)
	dwIsrTime2 = PERFCOUNT_MACRO();
	OEMIndicateIntSource(SYSINTR_TIMING);
	return SYSINTR_TIMING;

	// Normal processing (NORMAL)

#if (CE_MAJOR_VER == 0x0003)

normal:
	if(ticksleft > 0) goto doresched;

	if(dwSleepMin == 0) goto part2;
	
	if(dwSleepMin <= DiffMSec) goto doresched;

part2:
	if(dwPreempt == 0) goto noresched;

	if(dwPreempt <= DiffMSec) goto doresched;

noresched:

#else
normal:
    // (dougfir or later)
	if(dwReschedTime <= CurMSec) goto doresched;

#endif

	return SYSINTR_NOP;

doresched:
	OEMIndicateIntSource(SYSINTR_RESCHED);
	return SYSINTR_RESCHED;// must set reschedule flag
}



DWORD C_Timer2ISR(void)
{

tisr1:
	// clear timer underflowed flag & and set new tcr2 value
	WRITE_REGISTER_USHORT(TMU_TCR2, READ_REGISTER_USHORT(TMU_TCR2) & 0x00ff);
	if(READ_REGISTER_USHORT(TMU_TCR2) & 0x0100){ // bit not clear, go clear it again!
		goto tisr1;
	}

	dwPerfCountHigh++;	// Update dwPerfCountHigh

	return SYSINTR_NOP;
}



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -