summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJoel Sherrill <joel.sherrill@OARcorp.com>2002-01-16 22:09:50 +0000
committerJoel Sherrill <joel.sherrill@OARcorp.com>2002-01-16 22:09:50 +0000
commitc55df856aaba12355354374983fc1e69bb60373d (patch)
tree69d27f1748f29490a291d934a76b4e4afb9baadd
parent3afb0d231a5dac8c4168bd15189048313d565a5a (diff)
downloadrtems-c55df856aaba12355354374983fc1e69bb60373d.tar.bz2
2001-01-16 Joel Sherrill <joel@OARcorp.com>
* Added task-based timers to the Timer Manager. This added three new directives: - rtems_timer_initiate_server - rtems_timer_server_fire_after - rtems_timer_server_fire_when In the process of doing this, a number of cleanups were made. * src/timerserver.c, src/timerserverfireafter.c, src/timerserverfirewhen.c: New files. * include/timer/timer.h: Added new prototypes and supporting types. * inline/rtems/rtems/timer.h, macros/rtems/rtems/timer.h: Enhanced _Timer_Is_interval_class() to cover the class TIMER_INTERVAL_ON_TASK. * src/Makefile.am: Accounted for new files. * src/rtemstimer.c: Added initialization of _Timer_Server variable. * src/timercancel.c, src/timerreset.c: Account for addition of timer classes. Also corrected the headers. * src/timercreate.c, src/timerdelete.c, src/timerfireafter.c, src/timerfireafter.c, src/timerident.c: Corrected header.
-rw-r--r--c/src/exec/rtems/ChangeLog20
-rw-r--r--c/src/exec/rtems/include/rtems/rtems/timer.h133
-rw-r--r--c/src/exec/rtems/inline/rtems/rtems/timer.inl2
-rw-r--r--c/src/exec/rtems/macros/rtems/rtems/timer.inl3
-rw-r--r--c/src/exec/rtems/src/Makefile.am3
-rw-r--r--c/src/exec/rtems/src/rtemstimer.c9
-rw-r--r--c/src/exec/rtems/src/timercancel.c6
-rw-r--r--c/src/exec/rtems/src/timercreate.c8
-rw-r--r--c/src/exec/rtems/src/timerdelete.c6
-rw-r--r--c/src/exec/rtems/src/timerfireafter.c13
-rw-r--r--c/src/exec/rtems/src/timerfirewhen.c7
-rw-r--r--c/src/exec/rtems/src/timerident.c8
-rw-r--r--c/src/exec/rtems/src/timerreset.c26
-rw-r--r--cpukit/rtems/ChangeLog20
-rw-r--r--cpukit/rtems/include/rtems/rtems/timer.h133
-rw-r--r--cpukit/rtems/inline/rtems/rtems/timer.inl2
-rw-r--r--cpukit/rtems/macros/rtems/rtems/timer.inl3
-rw-r--r--cpukit/rtems/src/Makefile.am3
-rw-r--r--cpukit/rtems/src/rtemstimer.c9
-rw-r--r--cpukit/rtems/src/timercancel.c6
-rw-r--r--cpukit/rtems/src/timercreate.c8
-rw-r--r--cpukit/rtems/src/timerdelete.c6
-rw-r--r--cpukit/rtems/src/timerfireafter.c13
-rw-r--r--cpukit/rtems/src/timerfirewhen.c7
-rw-r--r--cpukit/rtems/src/timerident.c8
-rw-r--r--cpukit/rtems/src/timerreset.c26
26 files changed, 406 insertions, 82 deletions
diff --git a/c/src/exec/rtems/ChangeLog b/c/src/exec/rtems/ChangeLog
index 416813a92b..94151de535 100644
--- a/c/src/exec/rtems/ChangeLog
+++ b/c/src/exec/rtems/ChangeLog
@@ -1,5 +1,25 @@
2001-01-16 Joel Sherrill <joel@OARcorp.com>
+ * Added task-based timers to the Timer Manager. This added three
+ new directives:
+ - rtems_timer_initiate_server
+ - rtems_timer_server_fire_after
+ - rtems_timer_server_fire_when
+ In the process of doing this, a number of cleanups were made.
+ * src/timerserver.c, src/timerserverfireafter.c,
+ src/timerserverfirewhen.c: New files.
+ * include/timer/timer.h: Added new prototypes and supporting types.
+ * inline/rtems/rtems/timer.h, macros/rtems/rtems/timer.h: Enhanced
+ _Timer_Is_interval_class() to cover the class TIMER_INTERVAL_ON_TASK.
+ * src/Makefile.am: Accounted for new files.
+ * src/rtemstimer.c: Added initialization of _Timer_Server variable.
+ * src/timercancel.c, src/timerreset.c: Account for addition
+ of timer classes. Also corrected the headers.
+ * src/timercreate.c, src/timerdelete.c, src/timerfireafter.c,
+ src/timerfireafter.c, src/timerident.c: Corrected header.
+
+2001-01-16 Joel Sherrill <joel@OARcorp.com>
+
* src/taskmode.c: Ensure the this service does not dispatch before
tasking is enabled at initialization time.
diff --git a/c/src/exec/rtems/include/rtems/rtems/timer.h b/c/src/exec/rtems/include/rtems/rtems/timer.h
index 87e21d3228..8f9b765037 100644
--- a/c/src/exec/rtems/include/rtems/rtems/timer.h
+++ b/c/src/exec/rtems/include/rtems/rtems/timer.h
@@ -10,12 +10,17 @@
* + create a timer
* + get an ID of a timer
* + delete a timer
- * + set a timer to fire after a number of ticks have passed
- * + set a timer to fire when a specified date and time has been reached
+ * + set timer to fire in context of clock tick
+ * - after a number of ticks have passed
+ * - when a specified date and time has been reached
+ * + initiate the timer server task
+ * + set timer to fire in context of the timer server task
+ * - after a number of ticks have passed
+ * - when a specified date and time has been reached
* + reset a timer
* + cancel a time
*
- * COPYRIGHT (c) 1989-1999.
+ * COPYRIGHT (c) 1989-2002.
* On-Line Applications Research Corporation (OAR).
*
* The license and distribution terms for this file may be
@@ -35,6 +40,7 @@ extern "C" {
#include <rtems/score/object.h>
#include <rtems/score/tod.h>
#include <rtems/score/watchdog.h>
+#include <rtems/rtems/attr.h>
/*
* The following enumerated type details the classes to which a timer
@@ -43,7 +49,9 @@ extern "C" {
typedef enum {
TIMER_INTERVAL,
+ TIMER_INTERVAL_ON_TASK,
TIMER_TIME_OF_DAY,
+ TIMER_TIME_OF_DAY_ON_TASK,
TIMER_DORMANT
} Timer_Classes;
@@ -66,6 +74,29 @@ typedef rtems_timer_service_routine ( *rtems_timer_service_routine_entry )(
RTEMS_EXTERN Objects_Information _Timer_Information;
/*
+ * Pointer to TCB of the Timer Server. This is NULL before the
+ * server is executing and task-based timers are not allowed to be
+ * initiated until the server is started.
+ */
+
+RTEMS_EXTERN Thread_Control *_Timer_Server;
+
+/*
+ * The following chains contain the list of interval timers that are
+ * executed in the context of the Timer Server.
+ *
+ * NOTE: These are extern'ed because they do not have to be in the
+ * minimum footprint. They are only really required when
+ * task-based timers are used. Since task-based timers can
+ * not be started until the server is initiated, these structures
+ * do not have to be initialized until then. They are declared
+ * in the same file as _Timer_Server_body.
+ */
+
+extern Chain_Control _Timer_Ticks_chain;
+extern Chain_Control _Timer_Seconds_chain;
+
+/*
* The following records define the control block used to manage
* each timer.
*/
@@ -89,6 +120,39 @@ void _Timer_Manager_initialization(
);
/*
+ * _Timer_Server_body
+ *
+ * DESCRIPTION:
+ *
+ * This is the server for task based timers. This task executes whenever
+ * a task-based timer should fire. It services both "after" and "when"
+ * timers. It is not created automatically but must be created explicitly
+ * by the application before task-based timers may be initiated.
+ */
+
+Thread _Timer_Server_body(
+ unsigned32 ignored
+);
+
+/*
+ * _Timer_Server_reset
+ *
+ * DESCRIPTION:
+ *
+ * This routine resets the timers which determine when the Timer Server
+ * will wake up next to service task-based timers.
+ */
+
+typedef enum {
+ TIMER_SERVER_RESET_TICKS,
+ TIMER_SERVER_RESET_SECONDS
+} Timer_Server_reset_mode;
+
+void _Timer_Server_reset(
+ Timer_Server_reset_mode reset_mode
+);
+
+/*
* rtems_timer_create
*
* DESCRIPTION:
@@ -151,8 +215,10 @@ rtems_status_code rtems_timer_delete(
* DESCRIPTION:
*
* This routine implements the rtems_timer_fire_after directive. It
- * initiates the timer associated with ID to fire in ticks clock
- * ticks. When the timer fires, the routine will be invoked.
+ * initiates the timer associated with ID to fire in ticks clock ticks.
+ * When the timer fires, the routine will be invoked in the context
+ * of the rtems_clock_tick directive which is normally invoked as
+ * part of servicing a periodic interupt.
*/
rtems_status_code rtems_timer_fire_after(
@@ -163,13 +229,34 @@ rtems_status_code rtems_timer_fire_after(
);
/*
+ * rtems_timer_server_fire_after
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_timer_server_fire_after directive. It
+ * initiates the timer associated with ID to fire in ticks clock
+ * ticks. When the timer fires, the routine will be invoked by the
+ * Timer Server in the context of a task NOT IN THE CONTEXT of the
+ * clock tick interrupt.
+ */
+
+rtems_status_code rtems_timer_server_fire_after(
+ Objects_Id id,
+ rtems_interval ticks,
+ rtems_timer_service_routine_entry routine,
+ void *user_data
+);
+
+/*
* rtems_timer_fire_when
*
* DESCRIPTION:
*
* This routine implements the rtems_timer_fire_when directive. It
* initiates the timer associated with ID to fire at wall_time
- * When the timer fires, the routine will be invoked.
+ * When the timer fires, the routine will be invoked in the context
+ * of the rtems_clock_tick directive which is normally invoked as
+ * part of servicing a periodic interupt.
*/
rtems_status_code rtems_timer_fire_when(
@@ -180,6 +267,25 @@ rtems_status_code rtems_timer_fire_when(
);
/*
+ * rtems_timer_server_fire_when
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_timer_server_fire_when directive. It
+ * initiates the timer associated with ID to fire at wall_time
+ * When the timer fires, the routine will be invoked by the
+ * Timer Server in the context of a task NOT IN THE CONTEXT of the
+ * clock tick interrupt.
+ */
+
+rtems_status_code rtems_timer_server_fire_when(
+ Objects_Id id,
+ rtems_time_of_day *wall_time,
+ rtems_timer_service_routine_entry routine,
+ void *user_data
+);
+
+/*
* rtems_timer_reset
*
* DESCRIPTION:
@@ -194,6 +300,21 @@ rtems_status_code rtems_timer_reset(
Objects_Id id
);
+/*
+ * rtems_timer_initiate_server
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_timer_initiate_server directive.
+ * It creates and starts the server that executes task-based timers.
+ * It must be invoked before any task-based timers can be initiated.
+ */
+
+rtems_status_code rtems_timer_initiate_server(
+ unsigned32 stack_size,
+ rtems_attribute attribute_set
+);
+
#ifndef __RTEMS_APPLICATION__
#include <rtems/rtems/timer.inl>
#endif
diff --git a/c/src/exec/rtems/inline/rtems/rtems/timer.inl b/c/src/exec/rtems/inline/rtems/rtems/timer.inl
index a887553ce4..33bf5fc3c6 100644
--- a/c/src/exec/rtems/inline/rtems/rtems/timer.inl
+++ b/c/src/exec/rtems/inline/rtems/rtems/timer.inl
@@ -84,7 +84,7 @@ RTEMS_INLINE_ROUTINE boolean _Timer_Is_interval_class (
Timer_Classes the_class
)
{
- return ( the_class == TIMER_INTERVAL );
+ return (the_class == TIMER_INTERVAL) || (the_class == TIMER_INTERVAL_ON_TASK);
}
/*PAGE
diff --git a/c/src/exec/rtems/macros/rtems/rtems/timer.inl b/c/src/exec/rtems/macros/rtems/rtems/timer.inl
index 36b0fdfe85..aa47189776 100644
--- a/c/src/exec/rtems/macros/rtems/rtems/timer.inl
+++ b/c/src/exec/rtems/macros/rtems/rtems/timer.inl
@@ -51,7 +51,8 @@
*/
#define _Timer_Is_interval_class( _the_class ) \
- ( (_the_class) == TIMER_INTERVAL )
+ ( ((_the_class) == TIMER_INTERVAL) ||
+ ((_the_class) == TIMER_INTERVAL_ON_TASK) )
/*PAGE
*
diff --git a/c/src/exec/rtems/src/Makefile.am b/c/src/exec/rtems/src/Makefile.am
index 8b8824876c..f1402ef9de 100644
--- a/c/src/exec/rtems/src/Makefile.am
+++ b/c/src/exec/rtems/src/Makefile.am
@@ -26,7 +26,8 @@ INTR_C_FILES = intr.c intrbody.c intrcatch.c
CLOCK_C_FILES = rtclock.c clockget.c clockset.c clocktick.c
TIMER_C_FILES = rtemstimer.c timercancel.c timercreate.c timerdelete.c \
- timerfireafter.c timerfirewhen.c timerident.c timerreset.c
+ timerfireafter.c timerfirewhen.c timerident.c timerreset.c timerserver.c \
+ timerserverfireafter.c timerserverfirewhen.c
MESSAGE_QUEUE_C_FILES = msg.c msgqallocate.c msgqbroadcast.c msgqcreate.c \
msgqdelete.c msgqflush.c msgqgetnumberpending.c msgqident.c \
diff --git a/c/src/exec/rtems/src/rtemstimer.c b/c/src/exec/rtems/src/rtemstimer.c
index e413681549..6954f1dec6 100644
--- a/c/src/exec/rtems/src/rtemstimer.c
+++ b/c/src/exec/rtems/src/rtemstimer.c
@@ -2,7 +2,7 @@
* Timer Manager
*
*
- * COPYRIGHT (c) 1989-1999.
+ * COPYRIGHT (c) 1989-2002.
* On-Line Applications Research Corporation (OAR).
*
* The license and distribution terms for this file may be
@@ -47,4 +47,11 @@ void _Timer_Manager_initialization(
RTEMS_MAXIMUM_NAME_LENGTH,
FALSE
);
+
+ /*
+ * Initialize the pointer to the Timer Server TCB to NULL indicating
+ * that task-based timer support is not initialized.
+ */
+
+ _Timer_Server = NULL;
}
diff --git a/c/src/exec/rtems/src/timercancel.c b/c/src/exec/rtems/src/timercancel.c
index 9db829d717..a4b2ea60d5 100644
--- a/c/src/exec/rtems/src/timercancel.c
+++ b/c/src/exec/rtems/src/timercancel.c
@@ -1,8 +1,8 @@
/*
- * Timer Manager
+ * Timer Manager - rtems_timer_cancel directive
*
*
- * COPYRIGHT (c) 1989-1999.
+ * COPYRIGHT (c) 1989-2002.
* On-Line Applications Research Corporation (OAR).
*
* The license and distribution terms for this file may be
@@ -32,7 +32,7 @@
*
* Output parameters:
* RTEMS_SUCCESSFUL - if successful
- * error code - if unsuccessful
+ * error code - if unsuccessful
*/
rtems_status_code rtems_timer_cancel(
diff --git a/c/src/exec/rtems/src/timercreate.c b/c/src/exec/rtems/src/timercreate.c
index 33e7f00d79..a1734e980f 100644
--- a/c/src/exec/rtems/src/timercreate.c
+++ b/c/src/exec/rtems/src/timercreate.c
@@ -1,8 +1,8 @@
/*
- * Timer Manager
+ * Timer Manager - rtems_timer_create directive
*
*
- * COPYRIGHT (c) 1989-1999.
+ * COPYRIGHT (c) 1989-2002.
* On-Line Applications Research Corporation (OAR).
*
* The license and distribution terms for this file may be
@@ -32,9 +32,9 @@
* id - pointer to timer id
*
* Output parameters:
- * id - timer id
+ * id - timer id
* RTEMS_SUCCESSFUL - if successful
- * error code - if unsuccessful
+ * error code - if unsuccessful
*/
rtems_status_code rtems_timer_create(
diff --git a/c/src/exec/rtems/src/timerdelete.c b/c/src/exec/rtems/src/timerdelete.c
index c207cb0ab7..87c61941d7 100644
--- a/c/src/exec/rtems/src/timerdelete.c
+++ b/c/src/exec/rtems/src/timerdelete.c
@@ -1,8 +1,8 @@
/*
- * Timer Manager
+ * Timer Manager - rtems_timer_delete directive
*
*
- * COPYRIGHT (c) 1989-1999.
+ * COPYRIGHT (c) 1989-2002.
* On-Line Applications Research Corporation (OAR).
*
* The license and distribution terms for this file may be
@@ -32,7 +32,7 @@
*
* Output parameters:
* RTEMS_SUCCESSFUL - if successful
- * error code - if unsuccessful
+ * error code - if unsuccessful
*/
rtems_status_code rtems_timer_delete(
diff --git a/c/src/exec/rtems/src/timerfireafter.c b/c/src/exec/rtems/src/timerfireafter.c
index f31b63ae92..76a3e3a0e6 100644
--- a/c/src/exec/rtems/src/timerfireafter.c
+++ b/c/src/exec/rtems/src/timerfireafter.c
@@ -1,8 +1,8 @@
/*
- * Timer Manager
+ * Timer Manager - rtems_timer_fire_after directive
*
*
- * COPYRIGHT (c) 1989-1999.
+ * COPYRIGHT (c) 1989-2002.
* On-Line Applications Research Corporation (OAR).
*
* The license and distribution terms for this file may be
@@ -28,13 +28,14 @@
* This directive allows a thread to start a timer.
*
* Input parameters:
- * id - timer id
- * ticks - interval until routine is fired
- * routine - routine to schedule
+ * id - timer id
+ * ticks - interval until routine is fired
+ * routine - routine to schedule
+ * user_data - passed as argument to routine when it is fired
*
* Output parameters:
* RTEMS_SUCCESSFUL - if successful
- * error code - if unsuccessful
+ * error code - if unsuccessful
*/
rtems_status_code rtems_timer_fire_after(
diff --git a/c/src/exec/rtems/src/timerfirewhen.c b/c/src/exec/rtems/src/timerfirewhen.c
index 309261351a..c2d9fdc222 100644
--- a/c/src/exec/rtems/src/timerfirewhen.c
+++ b/c/src/exec/rtems/src/timerfirewhen.c
@@ -1,8 +1,8 @@
/*
- * Timer Manager
+ * Timer Manager - rtems_timer_fire_when directive
*
*
- * COPYRIGHT (c) 1989-1999.
+ * COPYRIGHT (c) 1989-2002.
* On-Line Applications Research Corporation (OAR).
*
* The license and distribution terms for this file may be
@@ -31,10 +31,11 @@
* id - timer id
* wall_time - time of day to fire timer
* routine - routine to schedule
+ * user_data - passed as argument to routine when it is fired
*
* Output parameters:
* RTEMS_SUCCESSFUL - if successful
- * error code - if unsuccessful
+ * error code - if unsuccessful
*/
rtems_status_code rtems_timer_fire_when(
diff --git a/c/src/exec/rtems/src/timerident.c b/c/src/exec/rtems/src/timerident.c
index 492f55c6ac..f8cb36bdc6 100644
--- a/c/src/exec/rtems/src/timerident.c
+++ b/c/src/exec/rtems/src/timerident.c
@@ -1,8 +1,8 @@
/*
- * Timer Manager
+ * Timer Manager - rtems_timer_ident directive
*
*
- * COPYRIGHT (c) 1989-1999.
+ * COPYRIGHT (c) 1989-2002.
* On-Line Applications Research Corporation (OAR).
*
* The license and distribution terms for this file may be
@@ -33,9 +33,9 @@
* id - pointer to timer id
*
* Output parameters:
- * *id - message queue id
+ * *id - message queue id
* RTEMS_SUCCESSFUL - if successful
- * error code - if unsuccessful
+ * error code - if unsuccessful
*/
rtems_status_code rtems_timer_ident(
diff --git a/c/src/exec/rtems/src/timerreset.c b/c/src/exec/rtems/src/timerreset.c
index f538098b1e..33a45e1fc3 100644
--- a/c/src/exec/rtems/src/timerreset.c
+++ b/c/src/exec/rtems/src/timerreset.c
@@ -1,8 +1,8 @@
/*
- * Timer Manager
+ * Timer Manager - rtems_timer_reset directive
*
*
- * COPYRIGHT (c) 1989-1999.
+ * COPYRIGHT (c) 1989-2002.
* On-Line Applications Research Corporation (OAR).
*
* The license and distribution terms for this file may be
@@ -32,7 +32,7 @@
*
* Output parameters:
* RTEMS_SUCCESSFUL - if successful
- * error code - if unsuccessful
+ * error code - if unsuccessful
*/
rtems_status_code rtems_timer_reset(
@@ -51,13 +51,23 @@ rtems_status_code rtems_timer_reset(
return RTEMS_INVALID_ID;
case OBJECTS_LOCAL:
- if ( _Timer_Is_interval_class( the_timer->the_class ) ) {
- _Watchdog_Reset( &the_timer->Ticker );
- _Thread_Enable_dispatch();
- return RTEMS_SUCCESSFUL;
+ switch ( the_timer->the_class ) {
+ case TIMER_INTERVAL:
+ _Watchdog_Remove( &the_timer->Ticker );
+ _Watchdog_Insert( &_Watchdog_Ticks_chain, &the_timer->Ticker );
+ break;
+ case TIMER_INTERVAL_ON_TASK:
+ _Watchdog_Remove( &the_timer->Ticker );
+ _Watchdog_Insert( &_Timer_Ticks_chain, &the_timer->Ticker );
+ break;
+ case TIMER_TIME_OF_DAY:
+ case TIMER_TIME_OF_DAY_ON_TASK:
+ case TIMER_DORMANT:
+ _Thread_Enable_dispatch();
+ return RTEMS_NOT_DEFINED;
}
_Thread_Enable_dispatch();
- return RTEMS_NOT_DEFINED;
+ return RTEMS_SUCCESSFUL;
}
return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */
diff --git a/cpukit/rtems/ChangeLog b/cpukit/rtems/ChangeLog
index 416813a92b..94151de535 100644
--- a/cpukit/rtems/ChangeLog
+++ b/cpukit/rtems/ChangeLog
@@ -1,5 +1,25 @@
2001-01-16 Joel Sherrill <joel@OARcorp.com>
+ * Added task-based timers to the Timer Manager. This added three
+ new directives:
+ - rtems_timer_initiate_server
+ - rtems_timer_server_fire_after
+ - rtems_timer_server_fire_when
+ In the process of doing this, a number of cleanups were made.
+ * src/timerserver.c, src/timerserverfireafter.c,
+ src/timerserverfirewhen.c: New files.
+ * include/timer/timer.h: Added new prototypes and supporting types.
+ * inline/rtems/rtems/timer.h, macros/rtems/rtems/timer.h: Enhanced
+ _Timer_Is_interval_class() to cover the class TIMER_INTERVAL_ON_TASK.
+ * src/Makefile.am: Accounted for new files.
+ * src/rtemstimer.c: Added initialization of _Timer_Server variable.
+ * src/timercancel.c, src/timerreset.c: Account for addition
+ of timer classes. Also corrected the headers.
+ * src/timercreate.c, src/timerdelete.c, src/timerfireafter.c,
+ src/timerfireafter.c, src/timerident.c: Corrected header.
+
+2001-01-16 Joel Sherrill <joel@OARcorp.com>
+
* src/taskmode.c: Ensure the this service does not dispatch before
tasking is enabled at initialization time.
diff --git a/cpukit/rtems/include/rtems/rtems/timer.h b/cpukit/rtems/include/rtems/rtems/timer.h
index 87e21d3228..8f9b765037 100644
--- a/cpukit/rtems/include/rtems/rtems/timer.h
+++ b/cpukit/rtems/include/rtems/rtems/timer.h
@@ -10,12 +10,17 @@
* + create a timer
* + get an ID of a timer
* + delete a timer
- * + set a timer to fire after a number of ticks have passed
- * + set a timer to fire when a specified date and time has been reached
+ * + set timer to fire in context of clock tick
+ * - after a number of ticks have passed
+ * - when a specified date and time has been reached
+ * + initiate the timer server task
+ * + set timer to fire in context of the timer server task
+ * - after a number of ticks have passed
+ * - when a specified date and time has been reached
* + reset a timer
* + cancel a time
*
- * COPYRIGHT (c) 1989-1999.
+ * COPYRIGHT (c) 1989-2002.
* On-Line Applications Research Corporation (OAR).
*
* The license and distribution terms for this file may be
@@ -35,6 +40,7 @@ extern "C" {
#include <rtems/score/object.h>
#include <rtems/score/tod.h>
#include <rtems/score/watchdog.h>
+#include <rtems/rtems/attr.h>
/*
* The following enumerated type details the classes to which a timer
@@ -43,7 +49,9 @@ extern "C" {
typedef enum {
TIMER_INTERVAL,
+ TIMER_INTERVAL_ON_TASK,
TIMER_TIME_OF_DAY,
+ TIMER_TIME_OF_DAY_ON_TASK,
TIMER_DORMANT
} Timer_Classes;
@@ -66,6 +74,29 @@ typedef rtems_timer_service_routine ( *rtems_timer_service_routine_entry )(
RTEMS_EXTERN Objects_Information _Timer_Information;
/*
+ * Pointer to TCB of the Timer Server. This is NULL before the
+ * server is executing and task-based timers are not allowed to be
+ * initiated until the server is started.
+ */
+
+RTEMS_EXTERN Thread_Control *_Timer_Server;
+
+/*
+ * The following chains contain the list of interval timers that are
+ * executed in the context of the Timer Server.
+ *
+ * NOTE: These are extern'ed because they do not have to be in the
+ * minimum footprint. They are only really required when
+ * task-based timers are used. Since task-based timers can
+ * not be started until the server is initiated, these structures
+ * do not have to be initialized until then. They are declared
+ * in the same file as _Timer_Server_body.
+ */
+
+extern Chain_Control _Timer_Ticks_chain;
+extern Chain_Control _Timer_Seconds_chain;
+
+/*
* The following records define the control block used to manage
* each timer.
*/
@@ -89,6 +120,39 @@ void _Timer_Manager_initialization(
);
/*
+ * _Timer_Server_body
+ *
+ * DESCRIPTION:
+ *
+ * This is the server for task based timers. This task executes whenever
+ * a task-based timer should fire. It services both "after" and "when"
+ * timers. It is not created automatically but must be created explicitly
+ * by the application before task-based timers may be initiated.
+ */
+
+Thread _Timer_Server_body(
+ unsigned32 ignored
+);
+
+/*
+ * _Timer_Server_reset
+ *
+ * DESCRIPTION:
+ *
+ * This routine resets the timers which determine when the Timer Server
+ * will wake up next to service task-based timers.
+ */
+
+typedef enum {
+ TIMER_SERVER_RESET_TICKS,
+ TIMER_SERVER_RESET_SECONDS
+} Timer_Server_reset_mode;
+
+void _Timer_Server_reset(
+ Timer_Server_reset_mode reset_mode
+);
+
+/*
* rtems_timer_create
*
* DESCRIPTION:
@@ -151,8 +215,10 @@ rtems_status_code rtems_timer_delete(
* DESCRIPTION:
*
* This routine implements the rtems_timer_fire_after directive. It
- * initiates the timer associated with ID to fire in ticks clock
- * ticks. When the timer fires, the routine will be invoked.
+ * initiates the timer associated with ID to fire in ticks clock ticks.
+ * When the timer fires, the routine will be invoked in the context
+ * of the rtems_clock_tick directive which is normally invoked as
+ * part of servicing a periodic interupt.
*/
rtems_status_code rtems_timer_fire_after(
@@ -163,13 +229,34 @@ rtems_status_code rtems_timer_fire_after(
);
/*
+ * rtems_timer_server_fire_after
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_timer_server_fire_after directive. It
+ * initiates the timer associated with ID to fire in ticks clock
+ * ticks. When the timer fires, the routine will be invoked by the
+ * Timer Server in the context of a task NOT IN THE CONTEXT of the
+ * clock tick interrupt.
+ */
+
+rtems_status_code rtems_timer_server_fire_after(
+ Objects_Id id,
+ rtems_interval ticks,
+ rtems_timer_service_routine_entry routine,
+ void *user_data
+);
+
+/*
* rtems_timer_fire_when
*
* DESCRIPTION:
*
* This routine implements the rtems_timer_fire_when directive. It
* initiates the timer associated with ID to fire at wall_time
- * When the timer fires, the routine will be invoked.
+ * When the timer fires, the routine will be invoked in the context
+ * of the rtems_clock_tick directive which is normally invoked as
+ * part of servicing a periodic interupt.
*/
rtems_status_code rtems_timer_fire_when(
@@ -180,6 +267,25 @@ rtems_status_code rtems_timer_fire_when(
);
/*
+ * rtems_timer_server_fire_when
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_timer_server_fire_when directive. It
+ * initiates the timer associated with ID to fire at wall_time
+ * When the timer fires, the routine will be invoked by the
+ * Timer Server in the context of a task NOT IN THE CONTEXT of the
+ * clock tick interrupt.
+ */
+
+rtems_status_code rtems_timer_server_fire_when(
+ Objects_Id id,
+ rtems_time_of_day *wall_time,
+ rtems_timer_service_routine_entry routine,
+ void *user_data
+);
+
+/*
* rtems_timer_reset
*
* DESCRIPTION:
@@ -194,6 +300,21 @@ rtems_status_code rtems_timer_reset(
Objects_Id id
);
+/*
+ * rtems_timer_initiate_server
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_timer_initiate_server directive.
+ * It creates and starts the server that executes task-based timers.
+ * It must be invoked before any task-based timers can be initiated.
+ */
+
+rtems_status_code rtems_timer_initiate_server(
+ unsigned32 stack_size,
+ rtems_attribute attribute_set
+);
+
#ifndef __RTEMS_APPLICATION__
#include <rtems/rtems/timer.inl>
#endif
diff --git a/cpukit/rtems/inline/rtems/rtems/timer.inl b/cpukit/rtems/inline/rtems/rtems/timer.inl
index a887553ce4..33bf5fc3c6 100644
--- a/cpukit/rtems/inline/rtems/rtems/timer.inl
+++ b/cpukit/rtems/inline/rtems/rtems/timer.inl
@@ -84,7 +84,7 @@ RTEMS_INLINE_ROUTINE boolean _Timer_Is_interval_class (
Timer_Classes the_class
)
{
- return ( the_class == TIMER_INTERVAL );
+ return (the_class == TIMER_INTERVAL) || (the_class == TIMER_INTERVAL_ON_TASK);
}
/*PAGE
diff --git a/cpukit/rtems/macros/rtems/rtems/timer.inl b/cpukit/rtems/macros/rtems/rtems/timer.inl
index 36b0fdfe85..aa47189776 100644
--- a/cpukit/rtems/macros/rtems/rtems/timer.inl
+++ b/cpukit/rtems/macros/rtems/rtems/timer.inl
@@ -51,7 +51,8 @@
*/
#define _Timer_Is_interval_class( _the_class ) \
- ( (_the_class) == TIMER_INTERVAL )
+ ( ((_the_class) == TIMER_INTERVAL) ||
+ ((_the_class) == TIMER_INTERVAL_ON_TASK) )
/*PAGE
*
diff --git a/cpukit/rtems/src/Makefile.am b/cpukit/rtems/src/Makefile.am
index 8b8824876c..f1402ef9de 100644
--- a/cpukit/rtems/src/Makefile.am
+++ b/cpukit/rtems/src/Makefile.am
@@ -26,7 +26,8 @@ INTR_C_FILES = intr.c intrbody.c intrcatch.c
CLOCK_C_FILES = rtclock.c clockget.c clockset.c clocktick.c
TIMER_C_FILES = rtemstimer.c timercancel.c timercreate.c timerdelete.c \
- timerfireafter.c timerfirewhen.c timerident.c timerreset.c
+ timerfireafter.c timerfirewhen.c timerident.c timerreset.c timerserver.c \
+ timerserverfireafter.c timerserverfirewhen.c
MESSAGE_QUEUE_C_FILES = msg.c msgqallocate.c msgqbroadcast.c msgqcreate.c \
msgqdelete.c msgqflush.c msgqgetnumberpending.c msgqident.c \
diff --git a/cpukit/rtems/src/rtemstimer.c b/cpukit/rtems/src/rtemstimer.c
index e413681549..6954f1dec6 100644
--- a/cpukit/rtems/src/rtemstimer.c
+++ b/cpukit/rtems/src/rtemstimer.c
@@ -2,7 +2,7 @@
* Timer Manager
*
*
- * COPYRIGHT (c) 1989-1999.
+ * COPYRIGHT (c) 1989-2002.
* On-Line Applications Research Corporation (OAR).
*
* The license and distribution terms for this file may be
@@ -47,4 +47,11 @@ void _Timer_Manager_initialization(
RTEMS_MAXIMUM_NAME_LENGTH,
FALSE
);
+
+ /*
+ * Initialize the pointer to the Timer Server TCB to NULL indicating
+ * that task-based timer support is not initialized.
+ */
+
+ _Timer_Server = NULL;
}
diff --git a/cpukit/rtems/src/timercancel.c b/cpukit/rtems/src/timercancel.c
index 9db829d717..a4b2ea60d5 100644
--- a/cpukit/rtems/src/timercancel.c
+++ b/cpukit/rtems/src/timercancel.c
@@ -1,8 +1,8 @@
/*
- * Timer Manager
+ * Timer Manager - rtems_timer_cancel directive
*
*
- * COPYRIGHT (c) 1989-1999.
+ * COPYRIGHT (c) 1989-2002.
* On-Line Applications Research Corporation (OAR).
*
* The license and distribution terms for this file may be
@@ -32,7 +32,7 @@
*
* Output parameters:
* RTEMS_SUCCESSFUL - if successful
- * error code - if unsuccessful
+ * error code - if unsuccessful
*/
rtems_status_code rtems_timer_cancel(
diff --git a/cpukit/rtems/src/timercreate.c b/cpukit/rtems/src/timercreate.c
index 33e7f00d79..a1734e980f 100644
--- a/cpukit/rtems/src/timercreate.c
+++ b/cpukit/rtems/src/timercreate.c
@@ -1,8 +1,8 @@
/*
- * Timer Manager
+ * Timer Manager - rtems_timer_create directive
*
*
- * COPYRIGHT (c) 1989-1999.
+ * COPYRIGHT (c) 1989-2002.
* On-Line Applications Research Corporation (OAR).
*
* The license and distribution terms for this file may be
@@ -32,9 +32,9 @@
* id - pointer to timer id
*
* Output parameters:
- * id - timer id
+ * id - timer id
* RTEMS_SUCCESSFUL - if successful
- * error code - if unsuccessful
+ * error code - if unsuccessful
*/
rtems_status_code rtems_timer_create(
diff --git a/cpukit/rtems/src/timerdelete.c b/cpukit/rtems/src/timerdelete.c
index c207cb0ab7..87c61941d7 100644
--- a/cpukit/rtems/src/timerdelete.c
+++ b/cpukit/rtems/src/timerdelete.c
@@ -1,8 +1,8 @@
/*
- * Timer Manager
+ * Timer Manager - rtems_timer_delete directive
*
*
- * COPYRIGHT (c) 1989-1999.
+ * COPYRIGHT (c) 1989-2002.
* On-Line Applications Research Corporation (OAR).
*
* The license and distribution terms for this file may be
@@ -32,7 +32,7 @@
*
* Output parameters:
* RTEMS_SUCCESSFUL - if successful
- * error code - if unsuccessful
+ * error code - if unsuccessful
*/
rtems_status_code rtems_timer_delete(
diff --git a/cpukit/rtems/src/timerfireafter.c b/cpukit/rtems/src/timerfireafter.c
index f31b63ae92..76a3e3a0e6 100644
--- a/cpukit/rtems/src/timerfireafter.c
+++ b/cpukit/rtems/src/timerfireafter.c
@@ -1,8 +1,8 @@
/*
- * Timer Manager
+ * Timer Manager - rtems_timer_fire_after directive
*
*
- * COPYRIGHT (c) 1989-1999.
+ * COPYRIGHT (c) 1989-2002.
* On-Line Applications Research Corporation (OAR).
*
* The license and distribution terms for this file may be
@@ -28,13 +28,14 @@
* This directive allows a thread to start a timer.
*
* Input parameters:
- * id - timer id
- * ticks - interval until routine is fired
- * routine - routine to schedule
+ * id - timer id
+ * ticks - interval until routine is fired
+ * routine - routine to schedule
+ * user_data - passed as argument to routine when it is fired
*
* Output parameters:
* RTEMS_SUCCESSFUL - if successful
- * error code - if unsuccessful
+ * error code - if unsuccessful
*/
rtems_status_code rtems_timer_fire_after(
diff --git a/cpukit/rtems/src/timerfirewhen.c b/cpukit/rtems/src/timerfirewhen.c
index 309261351a..c2d9fdc222 100644
--- a/cpukit/rtems/src/timerfirewhen.c
+++ b/cpukit/rtems/src/timerfirewhen.c
@@ -1,8 +1,8 @@
/*
- * Timer Manager
+ * Timer Manager - rtems_timer_fire_when directive
*
*
- * COPYRIGHT (c) 1989-1999.
+ * COPYRIGHT (c) 1989-2002.
* On-Line Applications Research Corporation (OAR).
*
* The license and distribution terms for this file may be
@@ -31,10 +31,11 @@
* id - timer id
* wall_time - time of day to fire timer
* routine - routine to schedule
+ * user_data - passed as argument to routine when it is fired
*
* Output parameters:
* RTEMS_SUCCESSFUL - if successful
- * error code - if unsuccessful
+ * error code - if unsuccessful
*/
rtems_status_code rtems_timer_fire_when(
diff --git a/cpukit/rtems/src/timerident.c b/cpukit/rtems/src/timerident.c
index 492f55c6ac..f8cb36bdc6 100644
--- a/cpukit/rtems/src/timerident.c
+++ b/cpukit/rtems/src/timerident.c
@@ -1,8 +1,8 @@
/*
- * Timer Manager
+ * Timer Manager - rtems_timer_ident directive
*
*
- * COPYRIGHT (c) 1989-1999.
+ * COPYRIGHT (c) 1989-2002.
* On-Line Applications Research Corporation (OAR).
*
* The license and distribution terms for this file may be
@@ -33,9 +33,9 @@
* id - pointer to timer id
*
* Output parameters:
- * *id - message queue id
+ * *id - message queue id
* RTEMS_SUCCESSFUL - if successful
- * error code - if unsuccessful
+ * error code - if unsuccessful
*/
rtems_status_code rtems_timer_ident(
diff --git a/cpukit/rtems/src/timerreset.c b/cpukit/rtems/src/timerreset.c
index f538098b1e..33a45e1fc3 100644
--- a/cpukit/rtems/src/timerreset.c
+++ b/cpukit/rtems/src/timerreset.c
@@ -1,8 +1,8 @@
/*
- * Timer Manager
+ * Timer Manager - rtems_timer_reset directive
*
*
- * COPYRIGHT (c) 1989-1999.
+ * COPYRIGHT (c) 1989-2002.
* On-Line Applications Research Corporation (OAR).
*
* The license and distribution terms for this file may be
@@ -32,7 +32,7 @@
*
* Output parameters:
* RTEMS_SUCCESSFUL - if successful
- * error code - if unsuccessful
+ * error code - if unsuccessful
*/
rtems_status_code rtems_timer_reset(
@@ -51,13 +51,23 @@ rtems_status_code rtems_timer_reset(
return RTEMS_INVALID_ID;
case OBJECTS_LOCAL:
- if ( _Timer_Is_interval_class( the_timer->the_class ) ) {
- _Watchdog_Reset( &the_timer->Ticker );
- _Thread_Enable_dispatch();
- return RTEMS_SUCCESSFUL;
+ switch ( the_timer->the_class ) {
+ case TIMER_INTERVAL:
+ _Watchdog_Remove( &the_timer->Ticker );
+ _Watchdog_Insert( &_Watchdog_Ticks_chain, &the_timer->Ticker );
+ break;
+ case TIMER_INTERVAL_ON_TASK:
+ _Watchdog_Remove( &the_timer->Ticker );
+ _Watchdog_Insert( &_Timer_Ticks_chain, &the_timer->Ticker );
+ break;
+ case TIMER_TIME_OF_DAY:
+ case TIMER_TIME_OF_DAY_ON_TASK:
+ case TIMER_DORMANT:
+ _Thread_Enable_dispatch();
+ return RTEMS_NOT_DEFINED;
}
_Thread_Enable_dispatch();
- return RTEMS_NOT_DEFINED;
+ return RTEMS_SUCCESSFUL;
}
return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */