This repository has been archived on 2023-11-05. You can view files and clone it, but cannot push or open issues or pull requests.
FreeRTOS-Kernel/Demo/CORTEX_LM3Sxxxx_IAR_Keil/timertest.c

159 lines
6.2 KiB
C
Raw Normal View History

/*
2010-05-18 02:12:16 +08:00
FreeRTOS V6.0.5 - Copyright (C) 2010 Real Time Engineers Ltd.
2009-10-13 19:05:41 +08:00
***************************************************************************
* *
* If you are: *
* *
* + New to FreeRTOS, *
* + Wanting to learn FreeRTOS or multitasking in general quickly *
* + Looking for basic training, *
* + Wanting to improve your FreeRTOS skills and productivity *
* *
* then take a look at the FreeRTOS eBook *
* *
* "Using the FreeRTOS Real Time Kernel - a Practical Guide" *
* http://www.FreeRTOS.org/Documentation *
* *
* A pdf reference manual is also available. Both are usually delivered *
* to your inbox within 20 minutes to two hours when purchased between 8am *
* and 8pm GMT (although please allow up to 24 hours in case of *
* exceptional circumstances). Thank you for your support! *
* *
***************************************************************************
This file is part of the FreeRTOS distribution.
2009-10-13 19:05:41 +08:00
FreeRTOS is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License (version 2) as published by the
2009-10-13 19:05:41 +08:00
Free Software Foundation AND MODIFIED BY the FreeRTOS exception.
***NOTE*** The exception to the GPL is included to allow you to distribute
a combined work that includes FreeRTOS without being obliged to provide the
source code for proprietary components outside of the FreeRTOS kernel.
2009-10-13 19:05:41 +08:00
FreeRTOS is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
2009-10-13 19:05:41 +08:00
more details. You should have received a copy of the GNU General Public
License and the FreeRTOS license exception along with FreeRTOS; if not it
can be viewed here: http://www.freertos.org/a00114.html and also obtained
by writing to Richard Barry, contact details for whom are available on the
FreeRTOS WEB site.
2009-03-15 03:20:12 +08:00
1 tab == 4 spaces!
http://www.FreeRTOS.org - Documentation, latest information, license and
contact details.
2008-02-04 03:45:58 +08:00
http://www.SafeRTOS.com - A version that is certified for use in safety
critical systems.
2008-02-04 03:45:58 +08:00
http://www.OpenRTOS.com - Commercial support, development, porting,
licensing and training services.
*/
/* High speed timer test as described in main.c. */
/* Scheduler includes. */
#include "FreeRTOS.h"
/* Library includes. */
#include "hw_ints.h"
#include "hw_memmap.h"
#include "hw_types.h"
#include "interrupt.h"
#include "sysctl.h"
#include "lmi_timer.h"
2008-04-16 16:00:30 +08:00
#include "hw_timer.h"
/* The set frequency of the interrupt. Deviations from this are measured as
the jitter. */
#define timerINTERRUPT_FREQUENCY ( 20000UL )
/* The expected time between each of the timer interrupts - if the jitter was
zero. */
#define timerEXPECTED_DIFFERENCE_VALUE ( configCPU_CLOCK_HZ / timerINTERRUPT_FREQUENCY )
/* The highest available interrupt priority. */
#define timerHIGHEST_PRIORITY ( 0 )
/* Misc defines. */
#define timerMAX_32BIT_VALUE ( 0xffffffffUL )
2008-04-16 16:00:30 +08:00
#define timerTIMER_1_COUNT_VALUE ( * ( ( volatile unsigned long * ) ( ( unsigned portLONG ) TIMER1_BASE + 0x48UL ) ) )
/*-----------------------------------------------------------*/
/* Interrupt handler in which the jitter is measured. */
void Timer0IntHandler( void );
/* Stores the value of the maximum recorded jitter between interrupts. */
volatile unsigned portLONG ulMaxJitter = 0;
/*-----------------------------------------------------------*/
void vSetupHighFrequencyTimer( void )
{
unsigned long ulFrequency;
/* Timer zero is used to generate the interrupts, and timer 1 is used
to measure the jitter. */
SysCtlPeripheralEnable( SYSCTL_PERIPH_TIMER0 );
SysCtlPeripheralEnable( SYSCTL_PERIPH_TIMER1 );
TimerConfigure( TIMER0_BASE, TIMER_CFG_32_BIT_PER );
TimerConfigure( TIMER1_BASE, TIMER_CFG_32_BIT_PER );
/* Set the timer interrupt to be above the kernel - highest. */
IntPrioritySet( INT_TIMER0A, timerHIGHEST_PRIORITY );
/* Just used to measure time. */
TimerLoadSet(TIMER1_BASE, TIMER_A, timerMAX_32BIT_VALUE );
/* Ensure interrupts do not start until the scheduler is running. */
portDISABLE_INTERRUPTS();
/* The rate at which the timer will interrupt. */
ulFrequency = configCPU_CLOCK_HZ / timerINTERRUPT_FREQUENCY;
TimerLoadSet( TIMER0_BASE, TIMER_A, ulFrequency );
IntEnable( INT_TIMER0A );
TimerIntEnable( TIMER0_BASE, TIMER_TIMA_TIMEOUT );
/* Enable both timers. */
TimerEnable( TIMER0_BASE, TIMER_A );
TimerEnable( TIMER1_BASE, TIMER_A );
}
/*-----------------------------------------------------------*/
void Timer0IntHandler( void )
{
unsigned portLONG ulDifference;
volatile unsigned portLONG ulCurrentCount;
2008-04-16 16:00:30 +08:00
static unsigned portLONG ulMaxDifference = 0, ulLastCount = 0;
/* We use the timer 1 counter value to measure the clock cycles between
the timer 0 interrupts. */
ulCurrentCount = timerTIMER_1_COUNT_VALUE;
2008-04-16 16:00:30 +08:00
TimerIntClear( TIMER0_BASE, TIMER_TIMA_TIMEOUT );
if( ulCurrentCount < ulLastCount )
{
/* How many times has timer 1 counted since the last interrupt? */
ulDifference = ulLastCount - ulCurrentCount;
/* Is this the largest difference we have measured yet? */
if( ulDifference > ulMaxDifference )
{
ulMaxDifference = ulDifference;
ulMaxJitter = ulMaxDifference - timerEXPECTED_DIFFERENCE_VALUE;
}
}
ulLastCount = ulCurrentCount;
}
2008-04-16 16:00:30 +08:00