📄 templatetimer.c
字号:
/* templateTimer.c - template timer library *//* Copyright 1984-2001 Wind River Systems, Inc. *//*TODO - Remove the template modification history and begin a new history starting with version 01a and growing the history upward with each revision.modification history--------------------01e,16oct01,dat fixing warnings01d,29oct97,dat added protection for calling sysHwInit2 more than once.01c,23sep97,dat changed arg to TEMPLATE_REG_READ01b,12mar97,dat added basic timestamp support, some doc cleanup01a,23dec96,ms written by gutting i8253Timer.c.*//*TODO - This is an example timer. It must be replaced with specificinformation and code for the actual device used as the timer.DESCRIPTIONDescribe the chip being used completely, even if it provides more featuresthan just timers.Describe the device's capabilities as a timer, even if this driver doesn'tor can't utilize all of them. Describe the timer features that the driverdoes implement and any restrictions on their use.Describe all macros that can be used to customize this driver. Allaccesses to chip registers should be done through a redefineable macro.In this example driver the macros TEMPLATE_READ and TEMPLATE_WRITEare sample macros to read/write data to a mock device. If a devicecommunicates through formatted control blocks in shared memory, theaccesses to those control blocks should also be through a redefinablemacro.This driver provides 3 main functions, system clock support, auxilliaryclock support, and timestamp timer support. If necessary, each functionmay be conditioned by a separate INCLUDE_ macro. The timestamp functionis always conditional upon the INCLUDE_TIMESTAMP macro.The macros SYS_CLK_RATE_MIN, SYS_CLK_RATE_MAX, AUX_CLK_RATE_MIN, andAUX_CLK_RATE_MAX must be defined to provide parameter checking for thesys[Aux]ClkRateSet() routines.INCLUDES:timestampDev.h*//* includes */#include "vxWorks.h"#include "config.h"#include "drv/timer/timerDev.h"#include "drv/timer/timestampDev.h"/* defines */#define TIMESTAMP_HZ 1000000 /* timestamp counter freq *//* The default is to assume memory mapped I/O */#ifndef TEMPLATE_READ#define TEMPLATE_READ(reg, result) \ (result = *reg)#endif /*TEMPLATE_READ*/#ifndef TEMPLATE_WRITE#define TEMPLATE_WRITE(reg, data) \ (*reg = data)#endif /*TEMPLATE_WRITE*//* locals */LOCAL FUNCPTR sysClkRoutine = NULL; /* routine to call on clock tick */LOCAL int sysClkArg = 0; /* its argument */LOCAL BOOL sysClkRunning = FALSE;LOCAL int sysClkTicksPerSecond = 60;LOCAL FUNCPTR sysAuxClkRoutine = NULL;LOCAL int sysAuxClkArg = 0;LOCAL BOOL sysAuxClkRunning = FALSE;LOCAL int sysAuxClkTicksPerSecond = 100;#ifdef INCLUDE_TIMESTAMPLOCAL BOOL sysTimestampRunning = FALSE; /* running flag */LOCAL int sysTimestampPeriodValue = 0; /* Max counter value */LOCAL FUNCPTR sysTimestampRoutine = NULL; /* routine to call on intr */LOCAL int sysTimestampArg = 0; /* arg for routine */ void sysTimestampInt (void); /* forward declaration */#endif /* INCLUDE_TIMESTAMP *//********************************************************************************* sysClkInt - interrupt level processing for system clock** This routine handles an auxiliary clock interrupt. It acknowledges the* interrupt and calls the routine installed by sysClkConnect().*/void sysClkInt (void) { /* TODO - acknowledge the interrupt if needed */ /* call system clock service routine */ if (sysClkRoutine != NULL) (* sysClkRoutine) (sysClkArg); }/********************************************************************************* sysClkConnect - connect a routine to the system clock interrupt** This routine specifies the interrupt service routine to be called at each* clock interrupt. Normally, it is called from usrRoot() in usrConfig.c to * connect usrClock() to the system clock interrupt.** RETURN: OK, or ERROR if the routine cannot be connected to the interrupt.** SEE ALSO: intConnect(), usrClock(), sysClkEnable()*/STATUS sysClkConnect ( FUNCPTR routine, /* routine to be called at each clock interrupt */ int arg /* argument with which to call routine */ ) { static BOOL beenHere = FALSE; if (!beenHere) { beenHere = TRUE; sysHwInit2 (); /* XXX for now -- needs to be in usrConfig.c */ } sysClkRoutine = NULL; sysClkArg = arg; sysClkRoutine = routine; return (OK); }/********************************************************************************* sysClkDisable - turn off system clock interrupts** This routine disables system clock interrupts.** RETURNS: N/A** SEE ALSO: sysClkEnable()*/void sysClkDisable (void) { if (sysClkRunning) { /* TODO - disable system timer interrupts */ sysClkRunning = FALSE; } }/********************************************************************************* sysClkEnable - turn on system clock interrupts** This routine enables system clock interrupts.** RETURNS: N/A** SEE ALSO: sysClkConnect(), sysClkDisable(), sysClkRateSet()*/void sysClkEnable (void) { static BOOL connected = FALSE; if (!connected) { /* TODO - connect sysClkInt to appropriate interrupt */ connected = TRUE; } if (!sysClkRunning) { /* * TODO - start system timer interrupts at a * at a frequency of sysClkTicksPerSecond */ sysClkRunning = TRUE; } }/********************************************************************************* sysClkRateGet - get the system clock rate** This routine returns the system clock rate.** RETURNS: The number of ticks per second of the system clock.** SEE ALSO: sysClkEnable(), sysClkRateSet()*/int sysClkRateGet (void) { return (sysClkTicksPerSecond); }/********************************************************************************* sysClkRateSet - set the system clock rate** This routine sets the interrupt rate of the system clock.* It is called by usrRoot() in usrConfig.c.** RETURNS: OK, or ERROR if the tick rate is invalid or the timer cannot be set.** SEE ALSO: sysClkEnable(), sysClkRateGet()*/STATUS sysClkRateSet ( int ticksPerSecond /* number of clock interrupts per second */ ) { if (ticksPerSecond < SYS_CLK_RATE_MIN || ticksPerSecond > SYS_CLK_RATE_MAX) return (ERROR); /* TODO - return ERROR if rate is not supported */ sysClkTicksPerSecond = ticksPerSecond; if (sysClkRunning) { sysClkDisable (); sysClkEnable (); } return (OK); }/********************************************************************************* sysAuxClkInt - handle an auxiliary clock interrupt** This routine handles an auxiliary clock interrupt. It acknowledges the* interrupt and calls the routine installed by sysAuxClkConnect().** RETURNS: N/A*/void sysAuxClkInt (void) { /* TODO - acknowledge the interrupt if needed */ /* call auxiliary clock service routine */ if (sysAuxClkRoutine != NULL) (*sysAuxClkRoutine) (sysAuxClkArg); }/********************************************************************************* sysAuxClkConnect - connect a routine to the auxiliary clock interrupt** This routine specifies the interrupt service routine to be called at each* auxiliary clock interrupt. It does not enable auxiliary clock interrupts.** RETURNS: OK, or ERROR if the routine cannot be connected to the interrupt.** SEE ALSO: intConnect(), sysAuxClkEnable()*/STATUS sysAuxClkConnect ( FUNCPTR routine, /* routine called at each aux clock interrupt */ int arg /* argument to auxiliary clock interrupt routine */ ) { sysAuxClkRoutine = NULL; sysAuxClkArg = arg; sysAuxClkRoutine = routine; return (OK); }/*******************************************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -