forked from Imagelibrary/rtems
2003-09-26 Joel Sherrill <joel@OARcorp.com>
* hppa1.1/.cvsignore, hppa1.1/ChangeLog, hppa1.1/Makefile.am, hppa1.1/configure.ac, hppa1.1/clock/.cvsignore, hppa1.1/clock/Makefile.am, hppa1.1/clock/clock.c, hppa1.1/include/.cvsignore, hppa1.1/include/Makefile.am, hppa1.1/include/runway.h, hppa1.1/include/semaphore.h, hppa1.1/milli/.cvsignore, hppa1.1/milli/Makefile.am, hppa1.1/milli/milli.S, hppa1.1/semaphore/.cvsignore, hppa1.1/semaphore/Makefile.am, hppa1.1/semaphore/semaphore.c, hppa1.1/timer/.cvsignore, hppa1.1/timer/Makefile.am, hppa1.1/timer/timer.c: Removed.
This commit is contained in:
@@ -1,3 +1,16 @@
|
|||||||
|
2003-09-26 Joel Sherrill <joel@OARcorp.com>
|
||||||
|
|
||||||
|
* hppa1.1/.cvsignore, hppa1.1/ChangeLog, hppa1.1/Makefile.am,
|
||||||
|
hppa1.1/configure.ac, hppa1.1/clock/.cvsignore,
|
||||||
|
hppa1.1/clock/Makefile.am, hppa1.1/clock/clock.c,
|
||||||
|
hppa1.1/include/.cvsignore, hppa1.1/include/Makefile.am,
|
||||||
|
hppa1.1/include/runway.h, hppa1.1/include/semaphore.h,
|
||||||
|
hppa1.1/milli/.cvsignore, hppa1.1/milli/Makefile.am,
|
||||||
|
hppa1.1/milli/milli.S, hppa1.1/semaphore/.cvsignore,
|
||||||
|
hppa1.1/semaphore/Makefile.am, hppa1.1/semaphore/semaphore.c,
|
||||||
|
hppa1.1/timer/.cvsignore, hppa1.1/timer/Makefile.am,
|
||||||
|
hppa1.1/timer/timer.c: Removed.
|
||||||
|
|
||||||
2003-09-04 Joel Sherrill <joel@OARcorp.com>
|
2003-09-04 Joel Sherrill <joel@OARcorp.com>
|
||||||
|
|
||||||
* shared/include/cache.h, shared/src/cache_aligned_malloc.c,
|
* shared/include/cache.h, shared/src/cache_aligned_malloc.c,
|
||||||
|
|||||||
@@ -1,14 +0,0 @@
|
|||||||
aclocal.m4
|
|
||||||
autom4te*.cache
|
|
||||||
config.cache
|
|
||||||
config.guess
|
|
||||||
config.log
|
|
||||||
config.status
|
|
||||||
config.sub
|
|
||||||
configure
|
|
||||||
depcomp
|
|
||||||
install-sh
|
|
||||||
Makefile
|
|
||||||
Makefile.in
|
|
||||||
missing
|
|
||||||
mkinstalldirs
|
|
||||||
@@ -1,114 +0,0 @@
|
|||||||
2003-09-04 Joel Sherrill <joel@OARcorp.com>
|
|
||||||
|
|
||||||
* clock/clock.c, include/semaphore.h, semaphore/semaphore.c,
|
|
||||||
timer/timer.c: URL for license changed.
|
|
||||||
|
|
||||||
2003-08-18 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
|
|
||||||
|
|
||||||
* Makefile.am: Reflect having moved aclocal/.
|
|
||||||
|
|
||||||
2003-08-16 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
|
|
||||||
|
|
||||||
* Makefile.am: Reflect having moved automake/.
|
|
||||||
* clock/Makefile.am: Reflect having moved automake/.
|
|
||||||
* include/Makefile.am: Reflect having moved automake/.
|
|
||||||
* milli/Makefile.am: Reflect having moved automake/.
|
|
||||||
* semaphore/Makefile.am: Reflect having moved automake/.
|
|
||||||
* timer/Makefile.am: Reflect having moved automake/.
|
|
||||||
|
|
||||||
2003-08-11 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
|
|
||||||
|
|
||||||
* configure.ac: Use rtems-bugs@rtems.com as bug report email address.
|
|
||||||
|
|
||||||
2003-03-06 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
|
|
||||||
|
|
||||||
* configure.ac: Remove AC_CONFIG_AUX_DIR.
|
|
||||||
|
|
||||||
2003-02-11 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
|
|
||||||
|
|
||||||
* configure.ac: AM_INIT_AUTOMAKE([1.7.2]).
|
|
||||||
|
|
||||||
2003-02-11 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
|
|
||||||
|
|
||||||
* configure.ac: AC_PREREQ(2.57).
|
|
||||||
|
|
||||||
2002-12-16 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
|
|
||||||
|
|
||||||
* configure.ac: RTEMS_CHECK_CUSTOM_BSP.
|
|
||||||
* clock/Makefile.am: Don't include @RTEMS_BSP@.cfg.
|
|
||||||
* milli/Makefile.am: Ditto.
|
|
||||||
* semaphore/Makefile.am: Ditto.
|
|
||||||
* timer/Makefile.am: Ditto.
|
|
||||||
|
|
||||||
2002-12-16 Joel Sherrill <joel@OARcorp.com>
|
|
||||||
|
|
||||||
* milli/milli.S: Per PR329, use GNU binutils assembler directives.
|
|
||||||
|
|
||||||
2002-12-06 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
|
|
||||||
|
|
||||||
* configure.ac: Remove RTEMS_CHECK_BSP_CACHE.
|
|
||||||
|
|
||||||
2002-12-01 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
|
|
||||||
|
|
||||||
* configure.ac: Add RTEMS_PROG_CCAS.
|
|
||||||
|
|
||||||
2002-10-21 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
|
|
||||||
|
|
||||||
* .cvsignore: Reformat.
|
|
||||||
Add autom4te*cache.
|
|
||||||
Remove autom4te.cache.
|
|
||||||
|
|
||||||
2002-08-11 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
|
|
||||||
|
|
||||||
* clock/Makefile.am: Use .$(OBJEXT) instead of .o.
|
|
||||||
* milli/Makefile.am: Use .$(OBJEXT) instead of .o.
|
|
||||||
* semaphore/Makefile.am: Use .$(OBJEXT) instead of .o.
|
|
||||||
* timer/Makefile.am: Use .$(OBJEXT) instead of .o.
|
|
||||||
|
|
||||||
2002-03-27 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
|
|
||||||
|
|
||||||
* configure.ac:
|
|
||||||
AC_INIT(package,_RTEMS_VERSION,_RTEMS_BUGS).
|
|
||||||
AM_INIT_AUTOMAKE([no-define foreign 1.6]).
|
|
||||||
* clock/Makefile.am: Remove AUTOMAKE_OPTIONS.
|
|
||||||
* Makefile.am: Remove AUTOMAKE_OPTIONS.
|
|
||||||
* include/Makefile.am: Remove AUTOMAKE_OPTIONS.
|
|
||||||
* milli/Makefile.am: Remove AUTOMAKE_OPTIONS.
|
|
||||||
* semaphore/Makefile.am: Remove AUTOMAKE_OPTIONS.
|
|
||||||
* timer/Makefile.am: Remove AUTOMAKE_OPTIONS.
|
|
||||||
|
|
||||||
2001-10-11 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
|
|
||||||
|
|
||||||
* .cvsignore: Add autom4te.cache for autoconf > 2.52.
|
|
||||||
* configure.in: Remove.
|
|
||||||
* configure.ac: New file, generated from configure.in by autoupdate.
|
|
||||||
|
|
||||||
2001-09-27 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
|
|
||||||
|
|
||||||
* include/Makefile.am: Use 'PREINSTALL_FILES ='.
|
|
||||||
|
|
||||||
2001-02-18 Ralf Corsepius <corsepiu@faw.uni-ulm.de:
|
|
||||||
|
|
||||||
* include/Makefile.am: Apply include_*HEADERS instead of H_FILES.
|
|
||||||
|
|
||||||
2000-11-09 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
|
|
||||||
|
|
||||||
* Makefile.am: Use ... instead of RTEMS_TOPdir in ACLOCAL_AMFLAGS.
|
|
||||||
|
|
||||||
2000-11-02 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
|
|
||||||
|
|
||||||
* Makefile.am: Switch to ACLOCAL_AMFLAGS = -I $(RTEMS_TOPdir)/aclocal.
|
|
||||||
|
|
||||||
2000-10-26 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
|
|
||||||
|
|
||||||
* Makefile.am: ACLOCAL_AMFLAGS= -I $(RTEMS_TOPdir)/macros.
|
|
||||||
Switch to GNU canonicalization.
|
|
||||||
|
|
||||||
2000-09-04 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
|
|
||||||
|
|
||||||
* clock/Makefile.am, milli/Makefile.am, semaphore/Makefile.am,
|
|
||||||
timer/Makefile.am: Include compile.am
|
|
||||||
|
|
||||||
2000-08-10 Joel Sherrill <joel@OARcorp.com>
|
|
||||||
|
|
||||||
* ChangeLog: New file.
|
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
##
|
|
||||||
## $Id$
|
|
||||||
##
|
|
||||||
|
|
||||||
ACLOCAL_AMFLAGS = -I ../../../aclocal
|
|
||||||
|
|
||||||
SUBDIRS = include milli clock timer semaphore
|
|
||||||
|
|
||||||
include $(top_srcdir)/../../../automake/subdirs.am
|
|
||||||
include $(top_srcdir)/../../../automake/local.am
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
Makefile
|
|
||||||
Makefile.in
|
|
||||||
@@ -1,28 +0,0 @@
|
|||||||
##
|
|
||||||
## $Id$
|
|
||||||
##
|
|
||||||
|
|
||||||
|
|
||||||
PGM = $(ARCH)/clock.rel
|
|
||||||
|
|
||||||
C_FILES = clock.c
|
|
||||||
|
|
||||||
clock_rel_OBJECTS = $(C_FILES:%.c=$(ARCH)/%.$(OBJEXT))
|
|
||||||
|
|
||||||
include $(top_srcdir)/../../../automake/compile.am
|
|
||||||
include $(top_srcdir)/../../../automake/lib.am
|
|
||||||
|
|
||||||
#
|
|
||||||
# (OPTIONAL) Add local stuff here using +=
|
|
||||||
#
|
|
||||||
|
|
||||||
$(PGM): $(clock_rel_OBJECTS)
|
|
||||||
$(make-rel)
|
|
||||||
|
|
||||||
all-local: $(ARCH) $(clock_rel_OBJECTS) $(PGM)
|
|
||||||
|
|
||||||
.PRECIOUS: $(PGM)
|
|
||||||
|
|
||||||
EXTRA_DIST = clock.c
|
|
||||||
|
|
||||||
include $(top_srcdir)/../../../automake/local.am
|
|
||||||
@@ -1,257 +0,0 @@
|
|||||||
/* Clock
|
|
||||||
*
|
|
||||||
* This routine initializes the interval timer on the
|
|
||||||
* PA-RISC CPU. The tick frequency is specified by the bsp.
|
|
||||||
*
|
|
||||||
* COPYRIGHT (c) 1989-1999.
|
|
||||||
* On-Line Applications Research Corporation (OAR).
|
|
||||||
*
|
|
||||||
* The license and distribution terms for this file may be
|
|
||||||
* found in the file LICENSE in this distribution or at
|
|
||||||
* http://www.rtems.com/license/LICENSE.
|
|
||||||
*
|
|
||||||
* $Id$
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <rtems.h>
|
|
||||||
#include <rtems/libio.h>
|
|
||||||
|
|
||||||
/* should get this from bsp.h, but it is not installed yet */
|
|
||||||
rtems_isr_entry set_vector(rtems_isr_entry, rtems_vector_number, int);
|
|
||||||
|
|
||||||
#include <stdlib.h> /* for atexit() */
|
|
||||||
|
|
||||||
typedef unsigned long long hppa_click_count_t;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* These are set by clock driver during its init
|
|
||||||
*/
|
|
||||||
|
|
||||||
rtems_device_major_number rtems_clock_major = ~0;
|
|
||||||
rtems_device_minor_number rtems_clock_minor;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* CPU_HPPA_CLICKS_PER_TICK is either a #define or an rtems_unsigned32
|
|
||||||
* allocated and set by bsp_start()
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef CPU_HPPA_CLICKS_PER_TICK
|
|
||||||
extern rtems_unsigned32 CPU_HPPA_CLICKS_PER_TICK;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
volatile rtems_unsigned32 Clock_driver_ticks;
|
|
||||||
rtems_unsigned32 Clock_isrs; /* ISRs until next tick */
|
|
||||||
|
|
||||||
rtems_unsigned32 most_recent_itimer_value;
|
|
||||||
|
|
||||||
rtems_unsigned64 Clock_clicks; /* running total of cycles */
|
|
||||||
|
|
||||||
rtems_unsigned32 Clock_clicks_interrupt;
|
|
||||||
|
|
||||||
void Clock_exit(void);
|
|
||||||
|
|
||||||
void
|
|
||||||
ReInstall_clock(rtems_isr_entry new_clock_isr)
|
|
||||||
{
|
|
||||||
rtems_unsigned32 isrlevel = 0;
|
|
||||||
|
|
||||||
rtems_interrupt_disable(isrlevel);
|
|
||||||
(void) set_vector(
|
|
||||||
new_clock_isr,
|
|
||||||
HPPA_INTERRUPT_EXTERNAL_INTERVAL_TIMER,
|
|
||||||
1
|
|
||||||
);
|
|
||||||
rtems_interrupt_enable(isrlevel);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* read itimer and update Clock_clicks as appropriate
|
|
||||||
*/
|
|
||||||
|
|
||||||
rtems_unsigned32
|
|
||||||
Clock_read_itimer()
|
|
||||||
{
|
|
||||||
rtems_unsigned32 isrlevel;
|
|
||||||
rtems_unsigned32 itimer_value;
|
|
||||||
rtems_unsigned32 wrap_count;
|
|
||||||
rtems_unsigned32 recent_count;
|
|
||||||
|
|
||||||
rtems_interrupt_disable(isrlevel);
|
|
||||||
|
|
||||||
wrap_count = (Clock_clicks & 0xFFFFFFFF00000000ULL) >> 32;
|
|
||||||
recent_count = (rtems_unsigned32) Clock_clicks;
|
|
||||||
|
|
||||||
itimer_value = get_itimer();
|
|
||||||
|
|
||||||
if (itimer_value < recent_count)
|
|
||||||
wrap_count++;
|
|
||||||
Clock_clicks = (((rtems_unsigned64) wrap_count) << 32) + itimer_value;
|
|
||||||
|
|
||||||
rtems_interrupt_enable(isrlevel);
|
|
||||||
|
|
||||||
return itimer_value;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void Install_clock(rtems_isr_entry clock_isr)
|
|
||||||
{
|
|
||||||
Clock_driver_ticks = 0;
|
|
||||||
Clock_clicks_interrupt = 0;
|
|
||||||
Clock_clicks = 0;
|
|
||||||
|
|
||||||
Clock_isrs = rtems_configuration_get_milliseconds_per_tick();
|
|
||||||
|
|
||||||
/*
|
|
||||||
* initialize the interval here
|
|
||||||
* First tick is set to right amount of time in the future
|
|
||||||
* Future ticks will be incremented over last value set
|
|
||||||
* in order to provide consistent clicks in the face of
|
|
||||||
* interrupt overhead
|
|
||||||
*/
|
|
||||||
|
|
||||||
Clock_clicks_interrupt = Clock_read_itimer() + CPU_HPPA_CLICKS_PER_TICK;
|
|
||||||
set_itimer((rtems_unsigned32) Clock_clicks_interrupt);
|
|
||||||
|
|
||||||
(void) set_vector(clock_isr, HPPA_INTERRUPT_EXTERNAL_INTERVAL_TIMER, 1);
|
|
||||||
atexit(Clock_exit);
|
|
||||||
}
|
|
||||||
|
|
||||||
rtems_isr
|
|
||||||
Clock_isr(rtems_vector_number vector)
|
|
||||||
{
|
|
||||||
rtems_unsigned32 clicks_til_next_interrupt;
|
|
||||||
rtems_unsigned32 itimer_value;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* setup for next interrupt; making sure the new value is reasonably
|
|
||||||
* in the future.... in case we lost out on an interrupt somehow
|
|
||||||
*/
|
|
||||||
|
|
||||||
itimer_value = Clock_read_itimer();
|
|
||||||
Clock_clicks_interrupt += CPU_HPPA_CLICKS_PER_TICK;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* how far away is next interrupt *really*
|
|
||||||
* It may be a long time; this subtraction works even if
|
|
||||||
* Clock_clicks_interrupt < Clock_clicks_low_order via
|
|
||||||
* the miracle of unsigned math.
|
|
||||||
*/
|
|
||||||
clicks_til_next_interrupt = Clock_clicks_interrupt - itimer_value;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* If it is too soon then bump it up.
|
|
||||||
* This should only happen if CPU_HPPA_CLICKS_PER_TICK is too small.
|
|
||||||
* But setting it low is useful for debug, so...
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (clicks_til_next_interrupt < 400)
|
|
||||||
{
|
|
||||||
Clock_clicks_interrupt = itimer_value + 1000;
|
|
||||||
/* XXX: count these! this should be rare */
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* If it is too late, that means we missed the interrupt somehow.
|
|
||||||
* Rather than wait 35-50s for a wrap, we just fudge it here.
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (clicks_til_next_interrupt > CPU_HPPA_CLICKS_PER_TICK)
|
|
||||||
{
|
|
||||||
Clock_clicks_interrupt = itimer_value + 1000;
|
|
||||||
/* XXX: count these! this should never happen :-) */
|
|
||||||
}
|
|
||||||
|
|
||||||
set_itimer((rtems_unsigned32) Clock_clicks_interrupt);
|
|
||||||
|
|
||||||
Clock_driver_ticks++;
|
|
||||||
|
|
||||||
if (Clock_isrs == 1)
|
|
||||||
{
|
|
||||||
rtems_clock_tick();
|
|
||||||
Clock_isrs = rtems_configuration_get_milliseconds_per_tick();
|
|
||||||
if (Clock_isrs == 0)
|
|
||||||
Clock_isrs = 1;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
Clock_isrs--;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Called via atexit()
|
|
||||||
* Remove the clock interrupt handler by setting handler to NULL
|
|
||||||
*/
|
|
||||||
|
|
||||||
void
|
|
||||||
Clock_exit(void)
|
|
||||||
{
|
|
||||||
(void) set_vector(0, HPPA_INTERRUPT_EXTERNAL_INTERVAL_TIMER, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* spin delay for specified number of microseconds
|
|
||||||
* used by RTEMS delay macro
|
|
||||||
*/
|
|
||||||
|
|
||||||
void
|
|
||||||
Clock_delay(rtems_unsigned32 microseconds)
|
|
||||||
{
|
|
||||||
rtems_unsigned64 future_time;
|
|
||||||
|
|
||||||
(void) Clock_read_itimer();
|
|
||||||
future_time = Clock_clicks +
|
|
||||||
((rtems_unsigned64) microseconds) *
|
|
||||||
rtems_cpu_configuration_get_itimer_clicks_per_microsecond();
|
|
||||||
|
|
||||||
for (;;)
|
|
||||||
{
|
|
||||||
(void) Clock_read_itimer();
|
|
||||||
if (future_time <= Clock_clicks)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
rtems_device_driver Clock_initialize(
|
|
||||||
rtems_device_major_number major,
|
|
||||||
rtems_device_minor_number minor,
|
|
||||||
void *pargp
|
|
||||||
)
|
|
||||||
{
|
|
||||||
Install_clock(Clock_isr);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* make major/minor avail to others such as shared memory driver
|
|
||||||
*/
|
|
||||||
rtems_clock_major = major;
|
|
||||||
rtems_clock_minor = minor;
|
|
||||||
|
|
||||||
return RTEMS_SUCCESSFUL;
|
|
||||||
}
|
|
||||||
|
|
||||||
rtems_device_driver Clock_control(
|
|
||||||
rtems_device_major_number major,
|
|
||||||
rtems_device_minor_number minor,
|
|
||||||
void *pargp
|
|
||||||
)
|
|
||||||
{
|
|
||||||
rtems_libio_ioctl_args_t *args = pargp;
|
|
||||||
|
|
||||||
if (args == 0)
|
|
||||||
goto done;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This is hokey, but until we get a defined interface
|
|
||||||
* to do this, it will just be this simple...
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (args->command == rtems_build_name('I', 'S', 'R', ' '))
|
|
||||||
{
|
|
||||||
Clock_isr(HPPA_INTERRUPT_EXTERNAL_INTERVAL_TIMER);
|
|
||||||
}
|
|
||||||
else if (args->command == rtems_build_name('N', 'E', 'W', ' '))
|
|
||||||
{
|
|
||||||
ReInstall_clock(args->buffer);
|
|
||||||
}
|
|
||||||
|
|
||||||
done:
|
|
||||||
return RTEMS_SUCCESSFUL;
|
|
||||||
}
|
|
||||||
@@ -1,34 +0,0 @@
|
|||||||
## Process this file with autoconf to produce a configure script.
|
|
||||||
##
|
|
||||||
## $Id$
|
|
||||||
|
|
||||||
AC_PREREQ(2.57)
|
|
||||||
AC_INIT([rtems-c-src-lib-libcpu-hppa1.1],[_RTEMS_VERSION],[rtems-bugs@rtems.com])
|
|
||||||
AC_CONFIG_SRCDIR([clock])
|
|
||||||
RTEMS_TOP(../../../../..)
|
|
||||||
|
|
||||||
RTEMS_CANONICAL_TARGET_CPU
|
|
||||||
|
|
||||||
AM_INIT_AUTOMAKE([no-define foreign 1.7.2])
|
|
||||||
AM_MAINTAINER_MODE
|
|
||||||
|
|
||||||
RTEMS_ENABLE_BARE
|
|
||||||
RTEMS_ENV_RTEMSBSP
|
|
||||||
|
|
||||||
RTEMS_CHECK_CPU
|
|
||||||
RTEMS_CANONICAL_HOST
|
|
||||||
|
|
||||||
RTEMS_PROJECT_ROOT
|
|
||||||
|
|
||||||
RTEMS_PROG_CC_FOR_TARGET
|
|
||||||
RTEMS_CANONICALIZE_TOOLS
|
|
||||||
RTEMS_PROG_CCAS
|
|
||||||
|
|
||||||
# Explicitly list all Makefiles here
|
|
||||||
AC_CONFIG_FILES([Makefile
|
|
||||||
clock/Makefile
|
|
||||||
include/Makefile
|
|
||||||
milli/Makefile
|
|
||||||
semaphore/Makefile
|
|
||||||
timer/Makefile])
|
|
||||||
AC_OUTPUT
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
Makefile
|
|
||||||
Makefile.in
|
|
||||||
@@ -1,26 +0,0 @@
|
|||||||
##
|
|
||||||
## $Id$
|
|
||||||
##
|
|
||||||
|
|
||||||
|
|
||||||
include_hppa1_1dir = $(includedir)/hppa1.1
|
|
||||||
|
|
||||||
include_hppa1_1_HEADERS = runway.h semaphore.h
|
|
||||||
|
|
||||||
# NOTE: Unlike other CPUS, we install into a subdirectory to avoid
|
|
||||||
# file name conflicts
|
|
||||||
|
|
||||||
$(PROJECT_INCLUDE)/hppa1.1:
|
|
||||||
$(mkinstalldirs) $@
|
|
||||||
|
|
||||||
$(PROJECT_INCLUDE)/hppa1.1/%.h: %.h
|
|
||||||
$(INSTALL_DATA) $< $@
|
|
||||||
|
|
||||||
PREINSTALL_FILES = $(PROJECT_INCLUDE)/hppa1.1 \
|
|
||||||
$(include_hppa1_1_HEADERS:%=$(PROJECT_INCLUDE)/hppa1.1/%)
|
|
||||||
|
|
||||||
all-local: $(TMPINSTALL_FILES)
|
|
||||||
|
|
||||||
EXTRA_DIST = runway.h semaphore.h
|
|
||||||
|
|
||||||
include $(top_srcdir)/../../../automake/local.am
|
|
||||||
@@ -1,37 +0,0 @@
|
|||||||
/*
|
|
||||||
* File: $RCSfile$
|
|
||||||
* Project: PixelFlow
|
|
||||||
* Created: 94/11/29
|
|
||||||
* RespEngr: tony bennett
|
|
||||||
* Revision: $Revision$
|
|
||||||
* Last Mod: $Date$
|
|
||||||
*
|
|
||||||
* Description:
|
|
||||||
* definitions specific to the runway bus
|
|
||||||
*
|
|
||||||
* TODO:
|
|
||||||
* Add lots more.
|
|
||||||
*
|
|
||||||
* $Id$
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _INCLUDE_RUNWAY_H
|
|
||||||
#define _INCLUDE_RUNWAY_H
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define HPPA_RUNWAY_PROC_HPA_BASE ((void *) 0xFFFA0000)
|
|
||||||
|
|
||||||
/* given a processor number, where is its HPA? */
|
|
||||||
#define HPPA_RUNWAY_HPA(cpu) \
|
|
||||||
((rtems_unsigned32) (HPPA_RUNWAY_PROC_HPA_BASE + ((cpu) * 0x2000)))
|
|
||||||
|
|
||||||
#define HPPA_RUNWAY_REG_IO_EIR_OFFSET 0x000
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* ! _INCLUDE_RUNWAY_H */
|
|
||||||
@@ -1,70 +0,0 @@
|
|||||||
/*
|
|
||||||
* Description:
|
|
||||||
* HPPA fast spinlock semaphores based on LDCWX instruction.
|
|
||||||
* These semaphores are not known to RTEMS.
|
|
||||||
*
|
|
||||||
* TODO:
|
|
||||||
*
|
|
||||||
* COPYRIGHT (c) 1994,95 by Division Incorporated
|
|
||||||
*
|
|
||||||
* The license and distribution terms for this file may be
|
|
||||||
* found in the file LICENSE in this distribution or at
|
|
||||||
* http://www.rtems.com/license/LICENSE.
|
|
||||||
*
|
|
||||||
* $Id$
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _INCLUDE_HPPA1_1_SEMAPHORE_H
|
|
||||||
#define _INCLUDE_HPPA1_1_SEMAPHORE_H
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This structure has hardware requirements.
|
|
||||||
* LDCWX opcode requires 16byte alignment for the lock
|
|
||||||
* 'lock' must be first member of structure.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define SEM_ALIGN 16
|
|
||||||
|
|
||||||
typedef volatile struct {
|
|
||||||
|
|
||||||
rtems_unsigned32 lock __attribute__ ((aligned (SEM_ALIGN)));
|
|
||||||
|
|
||||||
rtems_unsigned32 flags;
|
|
||||||
|
|
||||||
void *owner_tcb; /* for debug/commentary only */
|
|
||||||
|
|
||||||
rtems_unsigned32 user; /* for use by user */
|
|
||||||
|
|
||||||
} hppa_semaphore_t;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Values for flags
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define HPPA_SEM_IN_USE 0x0001 /* semaphore owned by somebody */
|
|
||||||
#define HPPA_SEM_NO_SPIN 0x0002 /* don't spin if unavailable */
|
|
||||||
#define HPPA_SEM_INITIALLY_FREE 0x0004 /* init it to be free */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Caller specifiable flags
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define HPPA_SEM_CALLER_FLAGS (HPPA_SEM_NO_SPIN | HPPA_SEM_INITIALLY_FREE)
|
|
||||||
|
|
||||||
void hppa_semaphore_pool_initialize(void *pool_base, int pool_size);
|
|
||||||
|
|
||||||
rtems_unsigned32 hppa_semaphore_acquire(hppa_semaphore_t *sp, int flag);
|
|
||||||
|
|
||||||
void hppa_semaphore_release(hppa_semaphore_t *sp);
|
|
||||||
|
|
||||||
hppa_semaphore_t *hppa_semaphore_allocate(rtems_unsigned32 which, int flag);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* ! _INCLUDE_SEMAPHORE_H */
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
Makefile
|
|
||||||
Makefile.in
|
|
||||||
@@ -1,28 +0,0 @@
|
|||||||
##
|
|
||||||
## $Id$
|
|
||||||
##
|
|
||||||
|
|
||||||
|
|
||||||
PGM = $(ARCH)/milli.rel
|
|
||||||
|
|
||||||
S_FILES = milli.S
|
|
||||||
|
|
||||||
milli_rel_OBJECTS = $(S_FILES:%.S=$(ARCH)/%.$(OBJEXT))
|
|
||||||
|
|
||||||
include $(top_srcdir)/../../../automake/compile.am
|
|
||||||
include $(top_srcdir)/../../../automake/lib.am
|
|
||||||
|
|
||||||
#
|
|
||||||
# (OPTIONAL) Add local stuff here using +=
|
|
||||||
#
|
|
||||||
|
|
||||||
$(PGM): $(milli_rel_OBJECTS)
|
|
||||||
$(make-rel)
|
|
||||||
|
|
||||||
all-local: $(ARCH) $(milli_rel_OBJECTS) $(PGM)
|
|
||||||
|
|
||||||
.PRECIOUS: $(PGM)
|
|
||||||
|
|
||||||
EXTRA_DIST = milli.S
|
|
||||||
|
|
||||||
include $(top_srcdir)/../../../automake/local.am
|
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -1,2 +0,0 @@
|
|||||||
Makefile
|
|
||||||
Makefile.in
|
|
||||||
@@ -1,28 +0,0 @@
|
|||||||
##
|
|
||||||
## $Id$
|
|
||||||
##
|
|
||||||
|
|
||||||
|
|
||||||
PGM = $(ARCH)/semaphore.rel
|
|
||||||
|
|
||||||
C_FILES = semaphore.c
|
|
||||||
|
|
||||||
semaphore_rel_OBJECTS = $(C_FILES:%.c=$(ARCH)/%.$(OBJEXT))
|
|
||||||
|
|
||||||
include $(top_srcdir)/../../../automake/compile.am
|
|
||||||
include $(top_srcdir)/../../../automake/lib.am
|
|
||||||
|
|
||||||
#
|
|
||||||
# (OPTIONAL) Add local stuff here using +=
|
|
||||||
#
|
|
||||||
|
|
||||||
$(PGM): $(semaphore_rel_OBJECTS)
|
|
||||||
$(make-rel)
|
|
||||||
|
|
||||||
all-local: $(ARCH) $(semaphore_rel_OBJECTS) $(PGM)
|
|
||||||
|
|
||||||
.PRECIOUS: $(PGM)
|
|
||||||
|
|
||||||
EXTRA_DIST = semaphore.c
|
|
||||||
|
|
||||||
include $(top_srcdir)/../../../automake/local.am
|
|
||||||
@@ -1,302 +0,0 @@
|
|||||||
/*
|
|
||||||
* Description:
|
|
||||||
* HPPA fast spinlock semaphores based on LDCWX instruction.
|
|
||||||
* These semaphores are not known to RTEMS.
|
|
||||||
*
|
|
||||||
* TODO:
|
|
||||||
* Put node number in high 16 bits of flag??
|
|
||||||
* XXX: Need h_s_deallocate
|
|
||||||
*
|
|
||||||
* COPYRIGHT (c) 1994 by Division Incorporated
|
|
||||||
*
|
|
||||||
* The license and distribution terms for this file may be
|
|
||||||
* found in the file LICENSE in this distribution or at
|
|
||||||
* http://www.rtems.com/license/LICENSE.
|
|
||||||
*
|
|
||||||
* $Id$
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <rtems.h>
|
|
||||||
|
|
||||||
#include <hppa1.1/semaphore.h>
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Report fatal semaphore error
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define SEM_FATAL_ERROR(sp) rtems_fatal_error_occurred((rtems_unsigned32) sp)
|
|
||||||
|
|
||||||
#define SEM_CHECK(sp) do { \
|
|
||||||
if (((sp) == 0) || (int) (sp) & 0xf) \
|
|
||||||
{ \
|
|
||||||
SEM_FATAL_ERROR(sp); \
|
|
||||||
} \
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Init a semaphore to be free
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define SEM_FREE_INIT(sp) \
|
|
||||||
do { \
|
|
||||||
(sp)->lock = 1; \
|
|
||||||
(sp)->flags = 0; \
|
|
||||||
(sp)->owner_tcb = 0; \
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Grab a semaphore recording its owner.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define SEM_MARK_GRABBED(sp) \
|
|
||||||
do { \
|
|
||||||
(sp)->owner_tcb = _Thread_Executing; \
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Mark the semaphore busy
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define SEM_MARK_BUSY(sp) ((sp)->flags |= HPPA_SEM_IN_USE)
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Is a semaphore available?
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define SEM_IS_AVAILABLE(sp) ((sp)->owner_tcb == 0)
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The pool control semaphore is the first in the pool
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define SEM_CONTROL (&hppa_semaphore_pool[0])
|
|
||||||
#define SEM_FIRST (&hppa_semaphore_pool[1])
|
|
||||||
|
|
||||||
#define SEM_PRIVATE(cookie) rtems_interrupt_disable(cookie)
|
|
||||||
|
|
||||||
#define SEM_PUBLIC(cookie) rtems_interrupt_enable(cookie)
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Control variables for the pool
|
|
||||||
*/
|
|
||||||
|
|
||||||
hppa_semaphore_t *hppa_semaphore_pool; /* ptr to first */
|
|
||||||
int hppa_semaphores;
|
|
||||||
int hppa_semaphores_available;
|
|
||||||
|
|
||||||
void
|
|
||||||
hppa_semaphore_pool_initialize(void *pool_base,
|
|
||||||
int pool_size)
|
|
||||||
{
|
|
||||||
hppa_semaphore_t *sp;
|
|
||||||
int align_factor;
|
|
||||||
rtems_unsigned32 isr_level;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* round pool_base up to be a multiple of SEM_ALIGN
|
|
||||||
*/
|
|
||||||
|
|
||||||
align_factor = SEM_ALIGN - (((int) pool_base) & (SEM_ALIGN-1));
|
|
||||||
if (align_factor != SEM_ALIGN)
|
|
||||||
{
|
|
||||||
pool_base += align_factor;
|
|
||||||
pool_size -= align_factor;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* How many can the pool hold?
|
|
||||||
* Assumes the semaphores are SEM_ALIGN bytes each
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (sizeof(hppa_semaphore_t) != SEM_ALIGN)
|
|
||||||
rtems_fatal_error_occurred(RTEMS_INVALID_SIZE);
|
|
||||||
|
|
||||||
pool_size &= ~(SEM_ALIGN - 1);
|
|
||||||
|
|
||||||
SEM_PRIVATE(isr_level);
|
|
||||||
|
|
||||||
hppa_semaphore_pool = pool_base;
|
|
||||||
hppa_semaphores = pool_size / SEM_ALIGN;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* If we are node0, then init all in the pool
|
|
||||||
*/
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
if (cpu_number == 0)
|
|
||||||
#else
|
|
||||||
if (_Configuration_Table->User_multiprocessing_table->node == 1)
|
|
||||||
#endif
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
* Tell other cpus we are not done, jic
|
|
||||||
*/
|
|
||||||
SEM_CONTROL->user = rtems_build_name('!', 'D', 'N', 'E');
|
|
||||||
|
|
||||||
for (sp=SEM_FIRST; sp < &hppa_semaphore_pool[hppa_semaphores]; sp++)
|
|
||||||
SEM_FREE_INIT(sp);
|
|
||||||
SEM_FREE_INIT(SEM_CONTROL);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Tell other cpus we are done, or wait for it to be done if on another cpu
|
|
||||||
*/
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
if (cpu_number == 0)
|
|
||||||
#else
|
|
||||||
if (_Configuration_Table->User_multiprocessing_table->node == 1)
|
|
||||||
#endif
|
|
||||||
SEM_CONTROL->user = rtems_build_name('D', 'O', 'N', 'E');
|
|
||||||
else
|
|
||||||
while (SEM_CONTROL->user != rtems_build_name('D', 'O', 'N', 'E'))
|
|
||||||
;
|
|
||||||
|
|
||||||
hppa_semaphores_available = hppa_semaphores;
|
|
||||||
|
|
||||||
SEM_PUBLIC(isr_level);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Function: hppa_semaphore_acquire
|
|
||||||
* Created: 94/11/29
|
|
||||||
* RespEngr: tony bennett
|
|
||||||
*
|
|
||||||
* Description:
|
|
||||||
* Acquire a semaphore. Will spin on the semaphore unless
|
|
||||||
* 'flag' says not to.
|
|
||||||
*
|
|
||||||
* Parameters:
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* Returns:
|
|
||||||
* 0 -- if did not acquire
|
|
||||||
* non-zero -- if acquired semaphore
|
|
||||||
* (actually this is the spin count)
|
|
||||||
*
|
|
||||||
* Notes:
|
|
||||||
* There is no requirement that the semaphore be within the pool
|
|
||||||
*
|
|
||||||
* Deficiencies/ToDo:
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
rtems_unsigned32
|
|
||||||
hppa_semaphore_acquire(hppa_semaphore_t *sp,
|
|
||||||
int flag)
|
|
||||||
{
|
|
||||||
rtems_unsigned32 lock_value;
|
|
||||||
rtems_unsigned32 spin_count = 1;
|
|
||||||
|
|
||||||
SEM_CHECK(sp);
|
|
||||||
|
|
||||||
for (;;)
|
|
||||||
{
|
|
||||||
HPPA_ASM_LDCWS(0, 0, sp, lock_value);
|
|
||||||
|
|
||||||
if (lock_value) /* we now own the lock */
|
|
||||||
{
|
|
||||||
SEM_MARK_GRABBED(sp);
|
|
||||||
return spin_count ? spin_count : ~0; /* jic */
|
|
||||||
}
|
|
||||||
|
|
||||||
if (flag & HPPA_SEM_NO_SPIN)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
spin_count++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
hppa_semaphore_release(hppa_semaphore_t *sp)
|
|
||||||
{
|
|
||||||
SEM_CHECK(sp);
|
|
||||||
|
|
||||||
if (sp->owner_tcb != _Thread_Executing)
|
|
||||||
SEM_FATAL_ERROR("owner mismatch");
|
|
||||||
|
|
||||||
sp->lock = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Function: hppa_semaphore_allocate
|
|
||||||
* Created: 94/11/29
|
|
||||||
* RespEngr: tony bennett
|
|
||||||
*
|
|
||||||
* Description:
|
|
||||||
* Get a pointer to a semaphore.
|
|
||||||
*
|
|
||||||
* Parameters:
|
|
||||||
* which -- if 0, then allocate a free semaphore from the pool
|
|
||||||
* if non-zero, then return pointer to that one, even
|
|
||||||
* if it is already busy.
|
|
||||||
*
|
|
||||||
* Returns:
|
|
||||||
* successful -- pointer to semaphore
|
|
||||||
* NULL otherwise
|
|
||||||
*
|
|
||||||
* Notes:
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* Deficiencies/ToDo:
|
|
||||||
*
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
hppa_semaphore_t *
|
|
||||||
hppa_semaphore_allocate(rtems_unsigned32 which,
|
|
||||||
int flag)
|
|
||||||
{
|
|
||||||
hppa_semaphore_t *sp = 0;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* grab the control semaphore
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (hppa_semaphore_acquire(SEM_CONTROL, 0) == 0)
|
|
||||||
SEM_FATAL_ERROR("could not grab control semaphore");
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Find a free one and init it
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (which)
|
|
||||||
{
|
|
||||||
if (which >= hppa_semaphores)
|
|
||||||
SEM_FATAL_ERROR("requested non-existent semaphore");
|
|
||||||
sp = &hppa_semaphore_pool[which];
|
|
||||||
|
|
||||||
/*
|
|
||||||
* if it is "free", then mark it claimed now.
|
|
||||||
* If it is not free then we are done.
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (SEM_IS_AVAILABLE(sp))
|
|
||||||
goto allmine;
|
|
||||||
}
|
|
||||||
else for (sp = SEM_FIRST;
|
|
||||||
sp < &hppa_semaphore_pool[hppa_semaphores];
|
|
||||||
sp++)
|
|
||||||
{
|
|
||||||
if (SEM_IS_AVAILABLE(sp))
|
|
||||||
{
|
|
||||||
allmine: SEM_FREE_INIT(sp);
|
|
||||||
SEM_MARK_BUSY(sp);
|
|
||||||
if ( ! (flag & HPPA_SEM_INITIALLY_FREE))
|
|
||||||
SEM_MARK_GRABBED(sp);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Free up the control semaphore
|
|
||||||
*/
|
|
||||||
|
|
||||||
hppa_semaphore_release(SEM_CONTROL);
|
|
||||||
|
|
||||||
return sp;
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
Makefile
|
|
||||||
Makefile.in
|
|
||||||
@@ -1,28 +0,0 @@
|
|||||||
##
|
|
||||||
## $Id$
|
|
||||||
##
|
|
||||||
|
|
||||||
|
|
||||||
PGM = $(ARCH)/timer.rel
|
|
||||||
|
|
||||||
C_FILES = timer.c
|
|
||||||
|
|
||||||
timer_rel_OBJECTS = $(C_FILES:%.c=$(ARCH)/%.$(OBJEXT))
|
|
||||||
|
|
||||||
include $(top_srcdir)/../../../automake/compile.am
|
|
||||||
include $(top_srcdir)/../../../automake/lib.am
|
|
||||||
|
|
||||||
#
|
|
||||||
# (OPTIONAL) Add local stuff here using +=
|
|
||||||
#
|
|
||||||
|
|
||||||
$(PGM): $(timer_rel_OBJECTS)
|
|
||||||
$(make-rel)
|
|
||||||
|
|
||||||
all-local: $(ARCH) $(timer_rel_OBJECTS) $(PGM)
|
|
||||||
|
|
||||||
.PRECIOUS: $(PGM)
|
|
||||||
|
|
||||||
EXTRA_DIST = timer.c
|
|
||||||
|
|
||||||
include $(top_srcdir)/../../../automake/local.am
|
|
||||||
@@ -1,62 +0,0 @@
|
|||||||
/* timer.c
|
|
||||||
*
|
|
||||||
* This file manages the interval timer on the PA-RISC.
|
|
||||||
*
|
|
||||||
* NOTE: It is important that the timer start/stop overhead be
|
|
||||||
* determined when porting or modifying this code.
|
|
||||||
*
|
|
||||||
* COPYRIGHT (c) 1989-1999.
|
|
||||||
* On-Line Applications Research Corporation (OAR).
|
|
||||||
*
|
|
||||||
* The license and distribution terms for this file may be
|
|
||||||
* found in the file LICENSE in this distribution or at
|
|
||||||
* http://www.rtems.com/license/LICENSE.
|
|
||||||
*
|
|
||||||
* $Id$
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <rtems.h>
|
|
||||||
|
|
||||||
volatile rtems_unsigned32 Timer_starting;
|
|
||||||
rtems_boolean Timer_driver_Find_average_overhead;
|
|
||||||
|
|
||||||
void Timer_initialize()
|
|
||||||
{
|
|
||||||
Timer_starting = get_itimer();
|
|
||||||
set_eiem(0x80000000);
|
|
||||||
}
|
|
||||||
|
|
||||||
#define AVG_OVERHEAD 0 /* It typically takes 3.0 microseconds */
|
|
||||||
/* (6 countdowns) to start/stop the timer. */
|
|
||||||
#define LEAST_VALID 1 /* Don't trust a value lower than this */
|
|
||||||
|
|
||||||
int Read_timer()
|
|
||||||
{
|
|
||||||
rtems_unsigned32 clicks;
|
|
||||||
rtems_unsigned32 total;
|
|
||||||
|
|
||||||
clicks = get_itimer();
|
|
||||||
|
|
||||||
total = clicks - Timer_starting;
|
|
||||||
|
|
||||||
if ( Timer_driver_Find_average_overhead == 1 )
|
|
||||||
return total; /* in XXX microsecond units */
|
|
||||||
|
|
||||||
else {
|
|
||||||
if ( total < LEAST_VALID )
|
|
||||||
return 0; /* below timer resolution */
|
|
||||||
return (total - AVG_OVERHEAD);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
rtems_status_code Empty_function( void )
|
|
||||||
{
|
|
||||||
return RTEMS_SUCCESSFUL;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Set_find_average_overhead(
|
|
||||||
rtems_boolean find_flag
|
|
||||||
)
|
|
||||||
{
|
|
||||||
Timer_driver_Find_average_overhead = find_flag;
|
|
||||||
}
|
|
||||||
Reference in New Issue
Block a user