Mercurial > ecos-v2_0-branch
diff packages/kernel/current/include/clock.hxx @ 0:3111d98ba7b3 ecos-v1_1-release
Initial commit of eCos version 1.1
| author | jlarmour |
|---|---|
| date | Tue, 11 May 1999 11:16:07 +0000 |
| parents | |
| children | 443894e2e912 |
line wrap: on
line diff
new file mode 100644 --- /dev/null +++ b/packages/kernel/current/include/clock.hxx @@ -0,0 +1,220 @@ +#ifndef CYGONCE_KERNEL_CLOCK_HXX +#define CYGONCE_KERNEL_CLOCK_HXX + +//========================================================================== +// +// clock.hxx +// +// Clock and Alarm class declaration(s) +// +//========================================================================== +//####COPYRIGHTBEGIN#### +// +// ------------------------------------------- +// The contents of this file are subject to the Cygnus eCos Public License +// Version 1.0 (the "License"); you may not use this file except in +// compliance with the License. You may obtain a copy of the License at +// http://sourceware.cygnus.com/ecos +// +// Software distributed under the License is distributed on an "AS IS" +// basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the +// License for the specific language governing rights and limitations under +// the License. +// +// The Original Code is eCos - Embedded Cygnus Operating System, released +// September 30, 1998. +// +// The Initial Developer of the Original Code is Cygnus. Portions created +// by Cygnus are Copyright (C) 1998 Cygnus Solutions. All Rights Reserved. +// ------------------------------------------- +// +//####COPYRIGHTEND#### +//========================================================================== +//#####DESCRIPTIONBEGIN#### +// +// Author(s): nickg +// Contributors: nickg +// Date: 1997-09-09 +// Purpose: Define Clock and Alarm class interfaces +// Description: The classes defined here collectively implement the +// internal API used to create, configure and manage Counters, +// Clocks and Alarms. +// Usage: #include <cyg/kernel/clock.hxx> +// +//####DESCRIPTIONEND#### +// +//========================================================================== + +#include <cyg/kernel/ktypes.h> +#include <cyg/infra/cyg_ass.h> // assertion macros + +// ------------------------------------------------------------------------- + +class Cyg_Alarm; + +typedef void cyg_alarm_fn(Cyg_Alarm *alarm, CYG_ADDRWORD data); + +// ------------------------------------------------------------------------- +// Counter object. + +class Cyg_Counter +{ + + friend class Cyg_Alarm; + +#if defined(CYGIMP_KERNEL_COUNTERS_SINGLE_LIST) + + Cyg_Alarm *alarm_list; // Linear list of Alarms + +#elif defined(CYGIMP_KERNEL_COUNTERS_MULTI_LIST) + + Cyg_Alarm *alarm_list[CYGNUM_KERNEL_COUNTERS_MULTI_LIST_SIZE]; + +#endif + + cyg_tick_count counter; // counter value + + cyg_uint32 increment; // increment per tick + +public: + + CYGDBG_DEFINE_CHECK_THIS + + Cyg_Counter( + cyg_uint32 increment = 1 + ); + + ~Cyg_Counter(); + + // Return current value of counter + cyg_tick_count current_value(); + + // Return low and high halves of the + // counter value. + cyg_uint32 current_value_lo(); + cyg_uint32 current_value_hi(); + + // Set the counter's current value + void set_value( cyg_tick_count new_value); + + // Advance counter by some number of ticks + void tick( cyg_uint32 ticks = 1); + + // Add an alarm to this counter + void add_alarm( Cyg_Alarm *alarm ); + + // Remove an alarm from this counter + void rem_alarm( Cyg_Alarm *alarm ); + +}; + +// ------------------------------------------------------------------------- +// Clock class. This is derived from a Counter and defines extra +// features to support clock-like behaviour. + +class Cyg_Clock + : public Cyg_Counter +{ + +public: + + CYGDBG_DEFINE_CHECK_THIS + + // This structure allows a more accurate representation + // of the resolution than a single integer would allow. + // The resolution is defined as dividend/divisor nanoseconds + // per tick. + struct cyg_resolution { + cyg_uint32 dividend; + cyg_uint32 divisor; + }; + +private: + + cyg_resolution resolution; // Current clock resolution + +public: + + Cyg_Clock( // Create clock with given resolution + cyg_resolution resolution + ); + + ~Cyg_Clock(); // Destructor + + cyg_resolution get_resolution(); // Return current resolution + + void set_resolution( // Set new resolution + cyg_resolution resolution + ); + +#ifdef CYGVAR_KERNEL_COUNTERS_CLOCK + + // There is a system supplied real time clock... + + static Cyg_Clock *real_time_clock; + +#endif + +}; + +// ------------------------------------------------------------------------- +// Alarm class. An alarm may be attached to a counter (or a clock) to be +// called when the trigger value is reached. + +class Cyg_Alarm +{ + friend class Cyg_Counter; + +#if defined(CYGIMP_KERNEL_COUNTERS_SINGLE_LIST) || defined(CYGIMP_KERNEL_COUNTERS_MULTI_LIST) + + Cyg_Alarm *next; // next alarm in list + +#endif + +protected: + Cyg_Counter *counter; // Attached to this counter/clock + + cyg_alarm_fn *alarm; // Call-back function + + CYG_ADDRWORD data; // Call-back data + + cyg_tick_count trigger; // Absolute trigger time + + cyg_tick_count interval; // Retrigger interval + + cyg_bool enabled; // True if enabled + + Cyg_Alarm(); + + void synchronize( void ); // deal with times in the past, + // make next alarm in synch. + +public: + + CYGDBG_DEFINE_CHECK_THIS + + Cyg_Alarm // Constructor + ( + Cyg_Counter *counter, // Attached to this counter + cyg_alarm_fn *alarm, // Call-back function + CYG_ADDRWORD data // Call-back data + ); + + ~Cyg_Alarm(); // Destructor + + void initialize( // Initialize Alarm + cyg_tick_count trigger, // Absolute trigger time + cyg_tick_count interval = 0 // Relative retrigger interval + ); + + void enable(); // Ensure alarm enabled + + void disable(); // Ensure alarm disabled + + +}; + +// ------------------------------------------------------------------------- + +#endif // ifndef CYGONCE_KERNEL_CLOCK_HXX +// EOF clock.hxx
