📄 timer0.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 + -