annotate packages/kernel/current/src/common/clock.cxx @ 1088:4c13726203c5

* include/clock.hxx: Made Cyg_Counter::add_alarm() and Cyg_Counter::rem_alarm() private functions. They no longer lock the scheduler, so should not be called directly, only via the Cyg_Alarm functions. * include/clock.inl: Removed inline version of Cyg_Alarm::disable(). It's no longer a one-liner and is thus better as a proper function. * src/common/clock.cxx (Cyg_Counter::tick): Rewrote the unsorted list option. If the function of one alarm adds or removes other alarms, then is was possible for the list to become corrupted. The new implementation attempts to avoid this problem. (Cyg_Alarm::initialize): Added scheduler locking to protect the enabled flag. (Cyg_Alarm::enable): Ditto. (Cyg_Alarm::disable): Ditto. Moved here from clock.inl. (Cyg_Alarm::add_alarm): Removed scheduler locking, it is now always called from functions that have already locked it. Added an assertion to double-check this. (Cyg_Alarm::rem_alarm): Ditto. * cdl/kernel.cdl: * tests/kalarm0.c: Added new test to test that alarms can be added and removed in alarm functions safely.
author nickg
date Tue, 01 Jul 2003 17:34:53 +0000
parents e4850e482c80
children 9ab0a182923a
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1 //==========================================================================
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
2 //
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
3 // common/clock.cxx
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
4 //
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
5 // Clock class implementations
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
6 //
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
7 //==========================================================================
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 174
diff changeset
8 //####ECOSGPLCOPYRIGHTBEGIN####
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 174
diff changeset
9 // -------------------------------------------
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 174
diff changeset
10 // This file is part of eCos, the Embedded Configurable Operating System.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 174
diff changeset
11 // Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
356
b77e86276ec3 * src/common/clock.cxx (add_alarm): Tweak last change to allow
jlarmour
parents: 210
diff changeset
12 // Copyright (C) 2002 Jonathan Larmour
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 174
diff changeset
13 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 174
diff changeset
14 // eCos is free software; you can redistribute it and/or modify it under
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 174
diff changeset
15 // the terms of the GNU General Public License as published by the Free
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 174
diff changeset
16 // Software Foundation; either version 2 or (at your option) any later version.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 174
diff changeset
17 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 174
diff changeset
18 // eCos is distributed in the hope that it will be useful, but WITHOUT ANY
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 174
diff changeset
19 // WARRANTY; without even the implied warranty of MERCHANTABILITY or
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 174
diff changeset
20 // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 174
diff changeset
21 // for more details.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 174
diff changeset
22 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 174
diff changeset
23 // You should have received a copy of the GNU General Public License along
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 174
diff changeset
24 // with eCos; if not, write to the Free Software Foundation, Inc.,
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 174
diff changeset
25 // 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 174
diff changeset
26 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 174
diff changeset
27 // As a special exception, if other files instantiate templates or use macros
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 174
diff changeset
28 // or inline functions from this file, or you compile this file and link it
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 174
diff changeset
29 // with other works to produce a work based on this file, this file does not
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 174
diff changeset
30 // by itself cause the resulting work to be covered by the GNU General Public
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 174
diff changeset
31 // License. However the source code for this file must still be made available
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 174
diff changeset
32 // in accordance with section (3) of the GNU General Public License.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 174
diff changeset
33 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 174
diff changeset
34 // This exception does not invalidate any other reasons why a work based on
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 174
diff changeset
35 // this file might be covered by the GNU General Public License.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 174
diff changeset
36 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 174
diff changeset
37 // Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
210
d2c90368aeef Merge from eCos master repository on 2002-05-23-21:39:14-BST
jlarmour
parents: 208
diff changeset
38 // at http://sources.redhat.com/ecos/ecos-license/
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 174
diff changeset
39 // -------------------------------------------
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 174
diff changeset
40 //####ECOSGPLCOPYRIGHTEND####
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
41 //==========================================================================
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
42 //#####DESCRIPTIONBEGIN####
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
43 //
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
44 // Author(s): nickg
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
45 // Contributors: nickg
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
46 // Date: 1997-09-15
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
47 // Purpose: Clock class implementation
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
48 // Description: This file contains the definitions of the counter,
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
49 // clock and alarm class member functions that are common
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
50 // to all clock implementations.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
51 //
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
52 //####DESCRIPTIONEND####
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
53 //
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
54 //==========================================================================
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
55
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
56 #include <pkgconf/kernel.h>
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
57
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
58 #include <cyg/kernel/ktypes.h> // base kernel types
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
59 #include <cyg/infra/cyg_trac.h> // tracing macros
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
60 #include <cyg/infra/cyg_ass.h> // assertion macros
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
61
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
62 #include <cyg/kernel/clock.hxx> // our header
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
63
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
64 #include <cyg/kernel/sched.hxx> // scheduler definitions
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
65 #include <cyg/kernel/thread.hxx> // thread definitions
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
66 #include <cyg/kernel/intr.hxx> // interrupt definitions
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
67
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
68 #include <cyg/kernel/sched.inl> // scheduler inlines
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
69 #include <cyg/kernel/clock.inl> // Clock inlines
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
70
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
71 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
72 // Static variables
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
73
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
74 #ifdef CYGVAR_KERNEL_COUNTERS_CLOCK
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
75
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
76 Cyg_Clock *Cyg_Clock::real_time_clock = NULL; // System real time clock
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
77
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
78 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
79
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
80 //==========================================================================
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
81 // Constructor for counter object
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
82
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
83 Cyg_Counter::Cyg_Counter(
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
84 cyg_uint32 incr
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
85 )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
86 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
87 CYG_REPORT_FUNCTION();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
88
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
89 counter = 0;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
90 increment = incr;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
91
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
92 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
93
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
94 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
95 // Destructor for Counter object
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
96
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
97 Cyg_Counter::~Cyg_Counter()
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
98 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
99 CYG_REPORT_FUNCTION();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
100
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
101
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
102 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
103
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
104 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
105 //
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
106
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
107 #ifdef CYGDBG_USE_ASSERTS
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
108
78
59d97b6ba612 Merge from eCos master repository on 2000-03-28-19:50:47-BST
jlarmour
parents: 66
diff changeset
109 cyg_bool Cyg_Counter::check_this( cyg_assert_class_zeal zeal) const
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
110 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
111 // check that we have a non-NULL pointer first
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
112 if( this == NULL ) return false;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
113
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
114 switch( zeal )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
115 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
116 case cyg_system_test:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
117 case cyg_extreme:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
118 case cyg_thorough:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
119 case cyg_quick:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
120 case cyg_trivial:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
121 case cyg_none:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
122 default:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
123 break;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
124 };
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
125
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
126 return true;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
127 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
128
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
129 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
130
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
131 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
132 // Counter tick function
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
133
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
134 void Cyg_Counter::tick( cyg_uint32 ticks )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
135 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
136 // CYG_REPORT_FUNCTION();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
137
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
138 CYG_ASSERTCLASS( this, "Bad counter object" );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
139
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
140 // Increment the counter in a loop so we process
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
141 // each tick separately. This is easier than trying
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
142 // to cope with a range of increments.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
143
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
144 while( ticks-- )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
145 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
146 Cyg_Scheduler::lock();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
147
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
148 // increment the counter, note that it is
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
149 // allowed to wrap.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
150 counter += increment;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
151
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
152 // now check for any expired alarms
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
153
148
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 132
diff changeset
154 Cyg_Alarm_List *alarm_list_ptr; // pointer to list
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
155
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
156 #if defined(CYGIMP_KERNEL_COUNTERS_SINGLE_LIST)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
157
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
158 alarm_list_ptr = &alarm_list;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
159
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
160 #elif defined(CYGIMP_KERNEL_COUNTERS_MULTI_LIST)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
161
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
162 // With multiple lists, each one contains only the alarms
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
163 // that will expire at a given tick modulo the list number.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
164 // So we only have a fraction of the alarms to check here.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
165
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
166 alarm_list_ptr = &(alarm_list[
1088
4c13726203c5 * include/clock.hxx: Made Cyg_Counter::add_alarm() and
nickg
parents: 1077
diff changeset
167 (counter/increment) % CYGNUM_KERNEL_COUNTERS_MULTI_LIST_SIZE ] );
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
168
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
169 #else
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
170 #error "No CYGIMP_KERNEL_COUNTERS_x_LIST config"
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
171 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
172
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
173 // Now that we have the list pointer, we can use common code for
1077
e4850e482c80 * src/common/clock.cxx (Cyg_Counter::rem_alarm): Bugfix: call
jlarmour
parents: 356
diff changeset
174 // both list organizations.
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
175
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
176 #ifdef CYGIMP_KERNEL_COUNTERS_SORT_LIST
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
177
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
178 // With a sorted alarm list, we can simply pick alarms off the
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
179 // front of the list until we find one that is in the future.
148
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 132
diff changeset
180
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 132
diff changeset
181 while( !alarm_list_ptr->empty() )
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
182 {
148
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 132
diff changeset
183 Cyg_Alarm *alarm = alarm_list_ptr->get_head();
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 132
diff changeset
184
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
185 CYG_ASSERTCLASS(alarm, "Bad alarm in counter list" );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
186
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
187 if( alarm->trigger <= counter )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
188 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
189 // remove alarm from list
148
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 132
diff changeset
190 alarm_list_ptr->rem_head();
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
191
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
192 if( alarm->interval != 0 )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
193 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
194 // The alarm has a retrigger interval.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
195 // Reset the trigger time and requeue
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
196 // the alarm.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
197 alarm->trigger += alarm->interval;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
198 add_alarm( alarm );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
199 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
200 else alarm->enabled = false;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
201
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
202 CYG_INSTRUMENT_ALARM( CALL, this, alarm );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
203
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
204 // call alarm function
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
205 alarm->alarm(alarm, alarm->data);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
206
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
207 // all done, loop
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
208 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
209 else break;
148
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 132
diff changeset
210
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 132
diff changeset
211 }
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
212 #else
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
213
1088
4c13726203c5 * include/clock.hxx: Made Cyg_Counter::add_alarm() and
nickg
parents: 1077
diff changeset
214 // With unsorted lists we must scan the whole list for
4c13726203c5 * include/clock.hxx: Made Cyg_Counter::add_alarm() and
nickg
parents: 1077
diff changeset
215 // candidates. However, we must be careful here since it is
4c13726203c5 * include/clock.hxx: Made Cyg_Counter::add_alarm() and
nickg
parents: 1077
diff changeset
216 // possible for the function of one alarm to add or remove
4c13726203c5 * include/clock.hxx: Made Cyg_Counter::add_alarm() and
nickg
parents: 1077
diff changeset
217 // other alarms to/from this list. Having the list shift under
4c13726203c5 * include/clock.hxx: Made Cyg_Counter::add_alarm() and
nickg
parents: 1077
diff changeset
218 // our feet in this way could be disasterous. We solve this by
4c13726203c5 * include/clock.hxx: Made Cyg_Counter::add_alarm() and
nickg
parents: 1077
diff changeset
219 // detecting when the list has changed and restarting the scan
4c13726203c5 * include/clock.hxx: Made Cyg_Counter::add_alarm() and
nickg
parents: 1077
diff changeset
220 // from the beginning.
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
221
1088
4c13726203c5 * include/clock.hxx: Made Cyg_Counter::add_alarm() and
nickg
parents: 1077
diff changeset
222 Cyg_DNode_T<Cyg_Alarm> *node = alarm_list_ptr->get_head();
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
223
1088
4c13726203c5 * include/clock.hxx: Made Cyg_Counter::add_alarm() and
nickg
parents: 1077
diff changeset
224 while( node != NULL )
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
225 {
1088
4c13726203c5 * include/clock.hxx: Made Cyg_Counter::add_alarm() and
nickg
parents: 1077
diff changeset
226 Cyg_Alarm *alarm = CYG_CLASSFROMBASE( Cyg_Alarm, Cyg_DNode, node );
4c13726203c5 * include/clock.hxx: Made Cyg_Counter::add_alarm() and
nickg
parents: 1077
diff changeset
227 Cyg_DNode_T<Cyg_Alarm> *next = alarm->get_next();
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
228
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
229 CYG_ASSERTCLASS(alarm, "Bad alarm in counter list" );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
230
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
231 if( alarm->trigger <= counter )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
232 {
1088
4c13726203c5 * include/clock.hxx: Made Cyg_Counter::add_alarm() and
nickg
parents: 1077
diff changeset
233 Cyg_DNode *next_next, *next_prev;
4c13726203c5 * include/clock.hxx: Made Cyg_Counter::add_alarm() and
nickg
parents: 1077
diff changeset
234 Cyg_Alarm *head;
4c13726203c5 * include/clock.hxx: Made Cyg_Counter::add_alarm() and
nickg
parents: 1077
diff changeset
235
4c13726203c5 * include/clock.hxx: Made Cyg_Counter::add_alarm() and
nickg
parents: 1077
diff changeset
236 alarm_list_ptr->remove(alarm);
4c13726203c5 * include/clock.hxx: Made Cyg_Counter::add_alarm() and
nickg
parents: 1077
diff changeset
237
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
238 if( alarm->interval != 0 )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
239 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
240 // The alarm has a retrigger interval.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
241 // Reset the trigger time and requeue
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
242 // the alarm.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
243 alarm->trigger += alarm->interval;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
244 add_alarm( alarm );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
245 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
246 else alarm->enabled = false;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
247
1088
4c13726203c5 * include/clock.hxx: Made Cyg_Counter::add_alarm() and
nickg
parents: 1077
diff changeset
248 // Save some details of the list state so we can
4c13726203c5 * include/clock.hxx: Made Cyg_Counter::add_alarm() and
nickg
parents: 1077
diff changeset
249 // detect if it has changed.
4c13726203c5 * include/clock.hxx: Made Cyg_Counter::add_alarm() and
nickg
parents: 1077
diff changeset
250 next_next = next->get_next();
4c13726203c5 * include/clock.hxx: Made Cyg_Counter::add_alarm() and
nickg
parents: 1077
diff changeset
251 next_prev = next->get_prev();
4c13726203c5 * include/clock.hxx: Made Cyg_Counter::add_alarm() and
nickg
parents: 1077
diff changeset
252 head = alarm_list_ptr->get_head();
4c13726203c5 * include/clock.hxx: Made Cyg_Counter::add_alarm() and
nickg
parents: 1077
diff changeset
253
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
254 CYG_INSTRUMENT_ALARM( CALL, this, alarm );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
255
1088
4c13726203c5 * include/clock.hxx: Made Cyg_Counter::add_alarm() and
nickg
parents: 1077
diff changeset
256 // Call alarm function
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
257 alarm->alarm(alarm, alarm->data);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
258
1088
4c13726203c5 * include/clock.hxx: Made Cyg_Counter::add_alarm() and
nickg
parents: 1077
diff changeset
259 // If that alarm function has added or removed an
4c13726203c5 * include/clock.hxx: Made Cyg_Counter::add_alarm() and
nickg
parents: 1077
diff changeset
260 // alarm on this list that might affect this scan,
4c13726203c5 * include/clock.hxx: Made Cyg_Counter::add_alarm() and
nickg
parents: 1077
diff changeset
261 // then start again from beginning. The main test here
4c13726203c5 * include/clock.hxx: Made Cyg_Counter::add_alarm() and
nickg
parents: 1077
diff changeset
262 // is whether the link fields of the next node have
4c13726203c5 * include/clock.hxx: Made Cyg_Counter::add_alarm() and
nickg
parents: 1077
diff changeset
263 // changed, implying that it may have been moved. The
4c13726203c5 * include/clock.hxx: Made Cyg_Counter::add_alarm() and
nickg
parents: 1077
diff changeset
264 // test against the list head detects the case where
4c13726203c5 * include/clock.hxx: Made Cyg_Counter::add_alarm() and
nickg
parents: 1077
diff changeset
265 // the next node was the only node in the list, when
4c13726203c5 * include/clock.hxx: Made Cyg_Counter::add_alarm() and
nickg
parents: 1077
diff changeset
266 // moving is would have left the links unchanged.
4c13726203c5 * include/clock.hxx: Made Cyg_Counter::add_alarm() and
nickg
parents: 1077
diff changeset
267
4c13726203c5 * include/clock.hxx: Made Cyg_Counter::add_alarm() and
nickg
parents: 1077
diff changeset
268 if( next_next != next->get_next() ||
4c13726203c5 * include/clock.hxx: Made Cyg_Counter::add_alarm() and
nickg
parents: 1077
diff changeset
269 next_prev != next->get_prev() ||
4c13726203c5 * include/clock.hxx: Made Cyg_Counter::add_alarm() and
nickg
parents: 1077
diff changeset
270 head != alarm_list_ptr->get_head() )
4c13726203c5 * include/clock.hxx: Made Cyg_Counter::add_alarm() and
nickg
parents: 1077
diff changeset
271 {
4c13726203c5 * include/clock.hxx: Made Cyg_Counter::add_alarm() and
nickg
parents: 1077
diff changeset
272 node = alarm_list_ptr->get_head();
4c13726203c5 * include/clock.hxx: Made Cyg_Counter::add_alarm() and
nickg
parents: 1077
diff changeset
273 continue;
4c13726203c5 * include/clock.hxx: Made Cyg_Counter::add_alarm() and
nickg
parents: 1077
diff changeset
274 }
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
275 }
1088
4c13726203c5 * include/clock.hxx: Made Cyg_Counter::add_alarm() and
nickg
parents: 1077
diff changeset
276
4c13726203c5 * include/clock.hxx: Made Cyg_Counter::add_alarm() and
nickg
parents: 1077
diff changeset
277 // If the next node is the head of the list, then we have
4c13726203c5 * include/clock.hxx: Made Cyg_Counter::add_alarm() and
nickg
parents: 1077
diff changeset
278 // looped all the way around. The node == next test
4c13726203c5 * include/clock.hxx: Made Cyg_Counter::add_alarm() and
nickg
parents: 1077
diff changeset
279 // catches the case where we only had one element to start
4c13726203c5 * include/clock.hxx: Made Cyg_Counter::add_alarm() and
nickg
parents: 1077
diff changeset
280 // with.
4c13726203c5 * include/clock.hxx: Made Cyg_Counter::add_alarm() and
nickg
parents: 1077
diff changeset
281 if( next == alarm_list_ptr->get_head() || node == next )
4c13726203c5 * include/clock.hxx: Made Cyg_Counter::add_alarm() and
nickg
parents: 1077
diff changeset
282 node = NULL;
4c13726203c5 * include/clock.hxx: Made Cyg_Counter::add_alarm() and
nickg
parents: 1077
diff changeset
283 else
4c13726203c5 * include/clock.hxx: Made Cyg_Counter::add_alarm() and
nickg
parents: 1077
diff changeset
284 node = next;
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
285 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
286
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
287 #endif
148
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 132
diff changeset
288 Cyg_Scheduler::unlock();
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
289
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
290 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
291
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
292 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
293
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
294 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
295 // Add an alarm to this counter
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
296
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
297 void Cyg_Counter::add_alarm( Cyg_Alarm *alarm )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
298 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
299 CYG_REPORT_FUNCTION();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
300
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
301 CYG_ASSERTCLASS( this, "Bad counter object" );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
302 CYG_ASSERTCLASS( alarm, "Bad alarm passed" );
1088
4c13726203c5 * include/clock.hxx: Made Cyg_Counter::add_alarm() and
nickg
parents: 1077
diff changeset
303 CYG_ASSERT( Cyg_Scheduler::get_sched_lock() > 0, "Scheduler not locked");
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
304
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
305 // set this now to allow an immediate handler call to manipulate
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
306 // this alarm sensibly.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
307 alarm->enabled = true;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
308
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
309 // Check here for an alarm that triggers now or in the past and
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
310 // call its alarm function immediately.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
311 if( alarm->trigger <= counter )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
312 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
313 CYG_INSTRUMENT_ALARM( CALL, this, alarm );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
314
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
315 // call alarm function. Note that this is being
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
316 // called here before the add_alarm has returned.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
317 // Note that this function may disable the alarm.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
318
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
319 alarm->alarm(alarm, alarm->data);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
320
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
321 // Note that this extra check on alarm->enabled is in case the
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
322 // handler function disables this alarm!
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
323 if( alarm->interval != 0 && alarm->enabled )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
324 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
325 // The alarm has a retrigger interval.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
326 // Reset the trigger interval and drop
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
327 // through to queue it.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
328 alarm->trigger += alarm->interval;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
329 // ensure the next alarm time is in our future, and in phase
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
330 // with the original time requested.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
331 alarm->synchronize();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
332 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
333 else
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
334 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
335 // The alarm is all done with, disable it
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
336 // unlock and return.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
337 alarm->enabled = false;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
338 return;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
339 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
340 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
341
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
342 CYG_INSTRUMENT_ALARM( ADD, this, alarm );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
343
148
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 132
diff changeset
344 // Find the pointer to the relevant list _after_ a retrigger
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 132
diff changeset
345 // alarm has been given its new trigger time.
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
346
148
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 132
diff changeset
347 Cyg_Alarm_List *alarm_list_ptr; // pointer to list
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
348
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
349 #if defined(CYGIMP_KERNEL_COUNTERS_SINGLE_LIST)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
350
148
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 132
diff changeset
351 alarm_list_ptr = &alarm_list;
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
352
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
353 #elif defined(CYGIMP_KERNEL_COUNTERS_MULTI_LIST)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
354
148
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 132
diff changeset
355 // Each alarm must go into the list that covers the tick that is
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 132
diff changeset
356 // going to happen _after_ the trigger time (or at it if trigger
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 132
diff changeset
357 // happens to fall on a tick.
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
358
148
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 132
diff changeset
359 alarm_list_ptr = &(alarm_list[
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 132
diff changeset
360 ((alarm->trigger+increment-1)/increment) %
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 132
diff changeset
361 CYGNUM_KERNEL_COUNTERS_MULTI_LIST_SIZE ] );
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
362
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
363 #else
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
364 #error "No CYGIMP_KERNEL_COUNTERS_x_LIST config"
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
365 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
366
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
367 #ifdef CYGIMP_KERNEL_COUNTERS_SORT_LIST
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
368
148
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 132
diff changeset
369 // Now that we have the list pointer, we can use common code for
356
b77e86276ec3 * src/common/clock.cxx (add_alarm): Tweak last change to allow
jlarmour
parents: 210
diff changeset
370 // both list organizations.
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
371
148
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 132
diff changeset
372 Cyg_Alarm *list_alarm = alarm_list_ptr->get_head();
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 132
diff changeset
373
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 132
diff changeset
374 if( list_alarm != NULL )
356
b77e86276ec3 * src/common/clock.cxx (add_alarm): Tweak last change to allow
jlarmour
parents: 210
diff changeset
375 {
148
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 132
diff changeset
376 do
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
377 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
378 CYG_ASSERTCLASS(list_alarm, "Bad alarm in counter list" );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
379
356
b77e86276ec3 * src/common/clock.cxx (add_alarm): Tweak last change to allow
jlarmour
parents: 210
diff changeset
380 // The alarms are in ascending trigger order. If we
b77e86276ec3 * src/common/clock.cxx (add_alarm): Tweak last change to allow
jlarmour
parents: 210
diff changeset
381 // find an alarm that triggers later than us, we go
b77e86276ec3 * src/common/clock.cxx (add_alarm): Tweak last change to allow
jlarmour
parents: 210
diff changeset
382 // in front of it.
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
383
148
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 132
diff changeset
384 if( list_alarm->trigger > alarm->trigger )
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 132
diff changeset
385 {
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 132
diff changeset
386 alarm_list_ptr->insert( list_alarm, alarm );
356
b77e86276ec3 * src/common/clock.cxx (add_alarm): Tweak last change to allow
jlarmour
parents: 210
diff changeset
387 goto add_alarm_unlock_return;
148
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 132
diff changeset
388 }
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 132
diff changeset
389
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 132
diff changeset
390 list_alarm = list_alarm->get_next();
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 132
diff changeset
391
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 132
diff changeset
392 } while( list_alarm != alarm_list_ptr->get_head() );
356
b77e86276ec3 * src/common/clock.cxx (add_alarm): Tweak last change to allow
jlarmour
parents: 210
diff changeset
393 // a lower or equal alarm time was not found, so drop through
b77e86276ec3 * src/common/clock.cxx (add_alarm): Tweak last change to allow
jlarmour
parents: 210
diff changeset
394 // so it is added to the list tail
b77e86276ec3 * src/common/clock.cxx (add_alarm): Tweak last change to allow
jlarmour
parents: 210
diff changeset
395 }
b77e86276ec3 * src/common/clock.cxx (add_alarm): Tweak last change to allow
jlarmour
parents: 210
diff changeset
396 alarm_list_ptr->add_tail( alarm );
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
397
356
b77e86276ec3 * src/common/clock.cxx (add_alarm): Tweak last change to allow
jlarmour
parents: 210
diff changeset
398 add_alarm_unlock_return:
148
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 132
diff changeset
399 #else
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
400
148
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 132
diff changeset
401 alarm_list_ptr->add_tail( alarm );
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 132
diff changeset
402
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 132
diff changeset
403 #endif
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 132
diff changeset
404
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
405 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
406
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
407 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
408 // Remove an alarm from this counter
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
409
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
410 void Cyg_Counter::rem_alarm( Cyg_Alarm *alarm )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
411 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
412 CYG_REPORT_FUNCTION();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
413
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
414 CYG_ASSERTCLASS( this, "Bad counter object" );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
415 CYG_ASSERTCLASS( alarm, "Bad alarm passed" );
1088
4c13726203c5 * include/clock.hxx: Made Cyg_Counter::add_alarm() and
nickg
parents: 1077
diff changeset
416 CYG_ASSERT( Cyg_Scheduler::get_sched_lock() > 0, "Scheduler not locked");
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
417
148
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 132
diff changeset
418 Cyg_Alarm_List *alarm_list_ptr; // pointer to list
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
419
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
420 #if defined(CYGIMP_KERNEL_COUNTERS_SINGLE_LIST)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
421
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
422 alarm_list_ptr = &alarm_list;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
423
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
424 #elif defined(CYGIMP_KERNEL_COUNTERS_MULTI_LIST)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
425
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
426 alarm_list_ptr = &(alarm_list[
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
427 ((alarm->trigger+increment-1)/increment) %
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
428 CYGNUM_KERNEL_COUNTERS_MULTI_LIST_SIZE ] );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
429
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
430 #else
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
431 #error "No CYGIMP_KERNEL_COUNTERS_x_LIST config"
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
432 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
433
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
434 // Now that we have the list pointer, we can use common code for
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
435 // both list organizations.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
436
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
437 CYG_INSTRUMENT_ALARM( REM, this, alarm );
148
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 132
diff changeset
438
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 132
diff changeset
439 alarm_list_ptr->remove( alarm );
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
440
151
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 148
diff changeset
441 alarm->enabled = false;
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 148
diff changeset
442
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
443 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
444
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
445 //==========================================================================
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
446 // Constructor for clock object
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
447
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
448 Cyg_Clock::Cyg_Clock(
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
449 cyg_resolution res
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
450 )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
451 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
452 CYG_REPORT_FUNCTION();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
453
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
454 resolution = res;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
455 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
456
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
457 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
458 // Destructor for Clock objects
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
459
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
460 Cyg_Clock::~Cyg_Clock()
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
461 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
462 CYG_REPORT_FUNCTION();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
463
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
464 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
465
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
466 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
467 //
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
468
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
469 #ifdef CYGDBG_USE_ASSERTS
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
470
78
59d97b6ba612 Merge from eCos master repository on 2000-03-28-19:50:47-BST
jlarmour
parents: 66
diff changeset
471 cyg_bool Cyg_Clock::check_this( cyg_assert_class_zeal zeal) const
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
472 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
473 // check that we have a non-NULL pointer first
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
474 if( this == NULL ) return false;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
475
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
476 switch( zeal )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
477 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
478 case cyg_system_test:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
479 case cyg_extreme:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
480 case cyg_thorough:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
481 case cyg_quick:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
482 case cyg_trivial:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
483 case cyg_none:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
484 default:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
485 break;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
486 };
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
487
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
488 return true;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
489 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
490
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
491 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
492
64
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
493 // -------------------------------------------------------------------------
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
494 //
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
495 // Clock Converters: split a rational into 4 factors to try to prevent
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
496 // overflow whilst retaining reasonable accuracy.
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
497 //
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
498 // typically we get numbers like 1,000,000 for ns_per and
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
499 // 100 and 1,000,000,000 for the dividend and divisor.
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
500 // So we want answers like 1/10 and 10/1 out of these routines.
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
501
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
502 static void construct_converter( Cyg_Clock::converter *pcc,
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
503 cyg_uint64 m1, cyg_uint64 d1,
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
504 cyg_uint64 m2, cyg_uint64 d2 )
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
505 {
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
506 cyg_uint64 upper, lower;
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
507 unsigned int i;
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
508 static cyg_uint16 primes[] = {
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
509 3,5,7,11,13,17,19,23,29,31,37,41,43,47,
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
510 53,59,61,67,71,73,79,83,89,97,
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
511 101,103,107,109,113,127,131,137,139,149,
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
512 151,157,163,167,173,179,181,191,193,197,199,
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
513 239, // for 1,111,111
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
514 541, // for 10,101,011
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
515 1667, // for 8,333,333
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
516 };
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
517
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
518 int rounding = 0;
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
519
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
520 // Here we assume that our workings will fit in a 64; the point is to
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
521 // allow calculations with a number of ticks that may be large.
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
522 upper = m1 * m2;
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
523 lower = d1 * d2;
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
524 #ifdef CYGDBG_USE_ASSERTS
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
525 cyg_uint64 save_upper = upper;
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
526 cyg_uint64 save_lower = lower;
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
527 #endif
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
528
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
529 retry_rounding:
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
530 // First strip out common powers of 2
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
531 while ( (0 == (1 & upper)) && ( 0 == (1 & lower)) ) {
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
532 upper >>= 1;
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
533 lower >>= 1;
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
534 }
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
535
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
536 // then common factors - use lazy table above
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
537 for ( i = 0 ; i < (sizeof( primes )/sizeof( primes[0] )); i++ ) {
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
538 cyg_uint64 j, k, p = (cyg_uint64)(primes[i]);
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
539 j = upper / p;
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
540 while ( j * p == upper ) {
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
541 k = lower / p;
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
542 if ( k * p != lower )
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
543 break;
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
544 upper = j;
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
545 lower = k;
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
546 j = upper / p;
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
547 }
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
548 }
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
549
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
550 m1 = upper;
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
551 d1 = lower;
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
552 m2 = 1;
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
553 d2 = 1;
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
554
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
555 if ( m1 > 0x10000 ) {
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
556 // only bother if there are more than 16 bits consumed here
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
557
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
558 // now move powers of 2 from d1 to d2
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
559 // keeping them the same order of magnitude
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
560 while ( (0 == (1 & d1)) && (d2 < d1) ) {
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
561 d1 >>= 1;
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
562 d2 <<= 1;
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
563 }
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
564
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
565 // and factors from the table - go too far, if anything
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
566 int cont = (d2 < d1);
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
567 for ( i = 0 ; cont && (i < (sizeof( primes )/sizeof( primes[0] ))); i++ ) {
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
568 cyg_uint64 k, p = (cyg_uint64)(primes[i]);
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
569 k = d1 / p;
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
570 while ( cont && ((k * p) == d1) ) {
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
571 // we can extract a prime
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
572 d1 = k;
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
573 d2 *= p;
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
574 k = d1 / p;
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
575 cont = (d2 < d1);
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
576 }
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
577 }
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
578
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
579 // move powers of 2 from m1 to m2 so long as we do not go less than d1
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
580 while ( (0 == (1 & m1)) && (m2 < m1) && (m1 > (d1 << 5)) ) {
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
581 m1 >>= 1;
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
582 m2 <<= 1;
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
583 if ( m1 < 0x10000 )
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
584 break;
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
585 }
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
586
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
587 // and factors from the table - ensure m1 stays well larger than d1
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
588 cont = ((m2 < m1) && (m1 > (d1 << 4)) && (m1 > 0x10000));
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
589 for ( i = 0 ; cont && (i < (sizeof( primes )/sizeof( primes[0] ))); i++ ) {
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
590 cyg_uint64 k, p = (cyg_uint64)(primes[i]);
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
591 k = m1 / p;
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
592 cont = cont && (k > (d1 << 4) && (k > 0x10000));
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
593 while ( cont && ((k * p) == m1) ) {
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
594 // we can extract a prime
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
595 m1 = k;
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
596 m2 *= p;
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
597 k = m1 / p; // examine k for getting too small
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
598 cont = ((m2 < m1) && (k > (d1 << 4)) && (k > 0x10000));
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
599 }
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
600 }
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
601
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
602 // if, after all that, m1 odd and unchanged, and too large,
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
603 // decrement it just the once and try again: then try it
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
604 // incremented once.
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
605 if ( (m1 & 1) && (m1 == upper) && (m1 > 0x10000) && (rounding < 2) ) {
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
606 CYG_ASSERT( 1 == m2, "m2 should be 1 to try rounding" );
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
607 m1--;
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
608 upper = m1;
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
609 rounding++;
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
610 goto retry_rounding;
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
611 }
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
612 // likewise for d1 - each of the pair can be odd only once each
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
613 if ( (d1 & 1) && (d1 == lower) && (d1 > 0x10000) && (rounding < 2) ) {
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
614 CYG_ASSERT( 1 == d2, "d2 should be 1 to try rounding" );
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
615 d1--;
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
616 lower = d1;
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
617 rounding++;
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
618 goto retry_rounding;
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
619 }
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
620 }
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
621
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
622 CYG_ASSERT( 0 != m1, "m1 zero" );
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
623 CYG_ASSERT( 0 != m2, "m2 zero" );
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
624 CYG_ASSERT( 0 != d1, "d1 zero" );
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
625 CYG_ASSERT( 0 != d2, "d2 zero" );
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
626 CYG_ASSERT( rounding || save_upper/save_lower == (m1 * m2)/(d1 * d2),
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
627 "Unequal in forwards direction" );
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
628 CYG_ASSERT( rounding || save_lower/save_upper == (d1 * d2)/(m1 * m2),
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
629 "Unequal in reverse direction" );
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
630
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
631 pcc->mul1 = m1;
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
632 pcc->div1 = d1;
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
633 pcc->mul2 = m2;
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
634 pcc->div2 = d2;
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
635 }
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
636
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
637 // other to clocks is (other * ns_per * dividend / divisor)
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
638 void Cyg_Clock::get_other_to_clock_converter(
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
639 cyg_uint64 ns_per_other_tick,
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
640 struct converter *pcc )
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
641 {
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
642 construct_converter( pcc,
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
643 ns_per_other_tick, 1,
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
644 resolution.divisor, resolution.dividend );
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
645 }
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
646
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
647 // clocks to other is (ticks * divisor / dividend / ns_per)
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
648 void Cyg_Clock::get_clock_to_other_converter(
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
649 cyg_uint64 ns_per_other_tick,
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
650 struct converter *pcc )
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
651 {
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
652 construct_converter( pcc,
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
653 1, ns_per_other_tick,
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
654 resolution.dividend, resolution.divisor );
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
655 }
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
656
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
657
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
658 //==========================================================================
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
659 // Constructor for alarm object
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
660
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
661 Cyg_Alarm::Cyg_Alarm(
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
662 Cyg_Counter *c, // Attached to this counter
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
663 cyg_alarm_fn *a, // Call-back function
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
664 CYG_ADDRWORD d // Call-back data
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
665 )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
666 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
667 CYG_REPORT_FUNCTION();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
668
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
669 counter = c;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
670 alarm = a;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
671 data = d;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
672 trigger = 0;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
673 interval = 0;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
674 enabled = false;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
675
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
676 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
677
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
678 Cyg_Alarm::Cyg_Alarm(){}
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
679
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
680 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
681 // Destructor
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
682
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
683 Cyg_Alarm::~Cyg_Alarm()
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
684 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
685 CYG_REPORT_FUNCTION();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
686
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
687 disable();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
688 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
689
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
690 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
691 //
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
692
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
693 #ifdef CYGDBG_USE_ASSERTS
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
694
78
59d97b6ba612 Merge from eCos master repository on 2000-03-28-19:50:47-BST
jlarmour
parents: 66
diff changeset
695 cyg_bool Cyg_Alarm::check_this( cyg_assert_class_zeal zeal) const
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
696 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
697 // check that we have a non-NULL pointer first
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
698 if( this == NULL ) return false;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
699
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
700 switch( zeal )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
701 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
702 case cyg_system_test:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
703 case cyg_extreme:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
704 case cyg_thorough:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
705 if( trigger != 0 && !enabled ) return false;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
706 case cyg_quick:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
707 case cyg_trivial:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
708 case cyg_none:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
709 default:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
710 break;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
711 };
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
712
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
713 return true;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
714 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
715
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
716 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
717
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
718 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
719 // Initialize Alarm and enable
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
720
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
721 void Cyg_Alarm::initialize(
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
722 cyg_tick_count t, // Absolute trigger time
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
723 cyg_tick_count i // Relative retrigger interval
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
724 )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
725 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
726 CYG_REPORT_FUNCTION();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
727
1088
4c13726203c5 * include/clock.hxx: Made Cyg_Counter::add_alarm() and
nickg
parents: 1077
diff changeset
728 Cyg_Scheduler::lock();
4c13726203c5 * include/clock.hxx: Made Cyg_Counter::add_alarm() and
nickg
parents: 1077
diff changeset
729
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
730 // If already enabled, remove from counter
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
731
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
732 if( enabled ) counter->rem_alarm(this);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
733
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
734 CYG_INSTRUMENT_ALARM( INIT, this, 0 );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
735 CYG_INSTRUMENT_ALARM( TRIGGER,
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
736 ((cyg_uint32 *)&t)[0],
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
737 ((cyg_uint32 *)&t)[1] );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
738 CYG_INSTRUMENT_ALARM( INTERVAL,
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
739 ((cyg_uint32 *)&i)[0],
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
740 ((cyg_uint32 *)&i)[1] );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
741
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
742 trigger = t;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
743 interval = i;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
744
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
745 counter->add_alarm(this);
1088
4c13726203c5 * include/clock.hxx: Made Cyg_Counter::add_alarm() and
nickg
parents: 1077
diff changeset
746
4c13726203c5 * include/clock.hxx: Made Cyg_Counter::add_alarm() and
nickg
parents: 1077
diff changeset
747 Cyg_Scheduler::unlock();
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
748 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
749
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
750 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
751 // Synchronize with a past alarm stream that had been disabled,
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
752 // bring past times into synch, and the like.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
753
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
754 void
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
755 Cyg_Alarm::synchronize( void )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
756 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
757 if( interval != 0 ) {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
758 // This expression sets the trigger to the next whole interval
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
759 // at or after the current time. This means that alarms will
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
760 // continue at the same intervals as if they had never been
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
761 // disabled. The alternative would be to just set trigger to
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
762 // (counter->counter + interval), but this is less satisfying
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
763 // than preserving the original intervals. That behaviour can
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
764 // always be obtained by using initialize() rather than
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
765 // enable(), while the current behaviour would be more
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
766 // difficult to achieve that way.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
767 cyg_tick_count d;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
768 d = counter->current_value() + interval - trigger;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
769 if ( d > interval ) {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
770 // then trigger was in the past, so resynchronize
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
771 trigger += interval * ((d - 1) / interval );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
772 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
773 // otherwise, we were just set up, so no worries.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
774 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
775 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
776
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
777 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
778 // Ensure alarm enabled
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
779
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
780 void Cyg_Alarm::enable()
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
781 {
1088
4c13726203c5 * include/clock.hxx: Made Cyg_Counter::add_alarm() and
nickg
parents: 1077
diff changeset
782 Cyg_Scheduler::lock();
4c13726203c5 * include/clock.hxx: Made Cyg_Counter::add_alarm() and
nickg
parents: 1077
diff changeset
783
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
784 if( !enabled )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
785 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
786 // ensure the alarm time is in our future:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
787 synchronize();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
788 enabled = true;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
789 counter->add_alarm(this);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
790 }
1088
4c13726203c5 * include/clock.hxx: Made Cyg_Counter::add_alarm() and
nickg
parents: 1077
diff changeset
791
4c13726203c5 * include/clock.hxx: Made Cyg_Counter::add_alarm() and
nickg
parents: 1077
diff changeset
792 Cyg_Scheduler::unlock();
4c13726203c5 * include/clock.hxx: Made Cyg_Counter::add_alarm() and
nickg
parents: 1077
diff changeset
793 }
4c13726203c5 * include/clock.hxx: Made Cyg_Counter::add_alarm() and
nickg
parents: 1077
diff changeset
794
4c13726203c5 * include/clock.hxx: Made Cyg_Counter::add_alarm() and
nickg
parents: 1077
diff changeset
795 // -------------------------------------------------------------------------
4c13726203c5 * include/clock.hxx: Made Cyg_Counter::add_alarm() and
nickg
parents: 1077
diff changeset
796 // Ensure alarm disabled
4c13726203c5 * include/clock.hxx: Made Cyg_Counter::add_alarm() and
nickg
parents: 1077
diff changeset
797
4c13726203c5 * include/clock.hxx: Made Cyg_Counter::add_alarm() and
nickg
parents: 1077
diff changeset
798 void Cyg_Alarm::disable()
4c13726203c5 * include/clock.hxx: Made Cyg_Counter::add_alarm() and
nickg
parents: 1077
diff changeset
799 {
4c13726203c5 * include/clock.hxx: Made Cyg_Counter::add_alarm() and
nickg
parents: 1077
diff changeset
800 Cyg_Scheduler::lock();
4c13726203c5 * include/clock.hxx: Made Cyg_Counter::add_alarm() and
nickg
parents: 1077
diff changeset
801
4c13726203c5 * include/clock.hxx: Made Cyg_Counter::add_alarm() and
nickg
parents: 1077
diff changeset
802 if( enabled ) counter->rem_alarm(this);
4c13726203c5 * include/clock.hxx: Made Cyg_Counter::add_alarm() and
nickg
parents: 1077
diff changeset
803
4c13726203c5 * include/clock.hxx: Made Cyg_Counter::add_alarm() and
nickg
parents: 1077
diff changeset
804 Cyg_Scheduler::unlock();
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
805 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
806
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
807 // -------------------------------------------------------------------------
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
808 // Get the current time values from the alarm
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
809
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
810 void Cyg_Alarm::get_times(
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
811 cyg_tick_count *t, // Next trigger time
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
812 cyg_tick_count *i // Current interval
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
813 )
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
814 {
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
815 // Lock the scheduler while we do this to avoid
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
816 // race conditions.
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
817 Cyg_Scheduler::lock();
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
818
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
819 if( t != NULL ) *t = trigger;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
820 if( i != NULL ) *i = interval;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
821
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
822 Cyg_Scheduler::unlock();
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
823 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
824
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
825 //==========================================================================
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
826 // System clock object
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
827
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
828 #ifdef CYGVAR_KERNEL_COUNTERS_CLOCK
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
829
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
830 class Cyg_RealTimeClock
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
831 : public Cyg_Clock
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
832 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
833 Cyg_Interrupt interrupt;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
834
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
835 static cyg_uint32 isr(cyg_vector vector, CYG_ADDRWORD data);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
836
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
837 static void dsr(cyg_vector vector, cyg_ucount32 count, CYG_ADDRWORD data);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
838
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
839 Cyg_RealTimeClock();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
840
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
841 static Cyg_RealTimeClock rtc;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
842 };
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
843
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
844 Cyg_Clock::cyg_resolution rtc_resolution = CYGNUM_KERNEL_COUNTERS_RTC_RESOLUTION;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
845
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
846 //Cyg_RealTimeClock Cyg_RealTimeClock::rtc __attribute__((init_priority (1)));
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
847
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
848 Cyg_RealTimeClock Cyg_RealTimeClock::rtc CYG_INIT_PRIORITY( CLOCK );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
849
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
850 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
851
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
852 Cyg_RealTimeClock::Cyg_RealTimeClock()
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
853 : Cyg_Clock(rtc_resolution),
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
854 interrupt(CYGNUM_HAL_INTERRUPT_RTC, 1, (CYG_ADDRWORD)this, isr, dsr)
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
855 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
856 CYG_REPORT_FUNCTION();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
857
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
858 HAL_CLOCK_INITIALIZE( CYGNUM_KERNEL_COUNTERS_RTC_PERIOD );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
859
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
860 interrupt.attach();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
861
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
862 interrupt.unmask_interrupt(CYGNUM_HAL_INTERRUPT_RTC);
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
863
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
864 Cyg_Clock::real_time_clock = this;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
865 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
866
34
29bc183297e1 Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents: 18
diff changeset
867 #if defined(CYGVAR_KERNEL_COUNTERS_CLOCK_LATENCY) && defined(HAL_CLOCK_LATENCY)
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
868 cyg_tick_count total_clock_latency, total_clock_interrupts;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
869 cyg_int32 min_clock_latency = 0x7FFFFFFF;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
870 cyg_int32 max_clock_latency = 0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
871 bool measure_clock_latency = false;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
872 #endif
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
873
34
29bc183297e1 Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents: 18
diff changeset
874 #if defined(CYGVAR_KERNEL_COUNTERS_CLOCK_DSR_LATENCY)
29bc183297e1 Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents: 18
diff changeset
875 cyg_tick_count total_clock_dsr_latency, total_clock_dsr_calls;
29bc183297e1 Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents: 18
diff changeset
876 cyg_int32 min_clock_dsr_latency = 0x7FFFFFFF;
29bc183297e1 Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents: 18
diff changeset
877 cyg_int32 max_clock_dsr_latency = 0;
66
bf00f99aec69 Merge from eCos master repository on 2000-02-02-19:16:44-GMT
jlarmour
parents: 64
diff changeset
878 cyg_uint32 clock_dsr_start = 0;
34
29bc183297e1 Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents: 18
diff changeset
879 #endif
29bc183297e1 Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents: 18
diff changeset
880
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
881 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
882
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
883 cyg_uint32 Cyg_RealTimeClock::isr(cyg_vector vector, CYG_ADDRWORD data)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
884 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
885 // CYG_REPORT_FUNCTION();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
886
34
29bc183297e1 Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents: 18
diff changeset
887 #if defined(CYGVAR_KERNEL_COUNTERS_CLOCK_LATENCY) && defined(HAL_CLOCK_LATENCY)
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
888 if (measure_clock_latency) {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
889 cyg_int32 delta;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
890 HAL_CLOCK_LATENCY(&delta);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
891 // Note: Ignore a latency of 0 when finding min_clock_latency.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
892 if (delta > 0) {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
893 // Valid delta measured
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
894 total_clock_latency += delta;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
895 total_clock_interrupts++;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
896 if (min_clock_latency > delta) min_clock_latency = delta;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
897 if (max_clock_latency < delta) max_clock_latency = delta;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
898 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
899 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
900 #endif
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
901
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
902 CYG_INSTRUMENT_CLOCK( ISR, 0, 0);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
903
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
904 HAL_CLOCK_RESET( CYGNUM_HAL_INTERRUPT_RTC, CYGNUM_KERNEL_COUNTERS_RTC_PERIOD );
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
905
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
906 Cyg_Interrupt::acknowledge_interrupt(CYGNUM_HAL_INTERRUPT_RTC);
34
29bc183297e1 Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents: 18
diff changeset
907
29bc183297e1 Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents: 18
diff changeset
908 #if defined(CYGVAR_KERNEL_COUNTERS_CLOCK_DSR_LATENCY)
29bc183297e1 Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents: 18
diff changeset
909 HAL_CLOCK_READ(&clock_dsr_start);
29bc183297e1 Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents: 18
diff changeset
910 #endif
18
7253dcc42a09 Merge from eCos master repository on 1999-06-25-15:31:50-BST
jlarmour
parents: 2
diff changeset
911 return Cyg_Interrupt::CALL_DSR|Cyg_Interrupt::HANDLED;
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
912 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
913
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
914 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
915
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
916 void Cyg_RealTimeClock::dsr(cyg_vector vector, cyg_ucount32 count, CYG_ADDRWORD data)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
917 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
918 // CYG_REPORT_FUNCTION();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
919
210
d2c90368aeef Merge from eCos master repository on 2002-05-23-21:39:14-BST
jlarmour
parents: 208
diff changeset
920 #if defined(CYGVAR_KERNEL_COUNTERS_CLOCK_DSR_LATENCY) && defined(HAL_CLOCK_LATENCY)
34
29bc183297e1 Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents: 18
diff changeset
921 if (measure_clock_latency) {
174
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents: 151
diff changeset
922 cyg_int32 delta;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents: 151
diff changeset
923 HAL_CLOCK_READ((cyg_uint32 *)&delta);
34
29bc183297e1 Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents: 18
diff changeset
924 delta -= clock_dsr_start;
29bc183297e1 Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents: 18
diff changeset
925 // Note: Ignore a latency of <= 0 when finding min_clock_latency.
29bc183297e1 Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents: 18
diff changeset
926 if (delta > 0 ) {
29bc183297e1 Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents: 18
diff changeset
927 // Valid delta measured
29bc183297e1 Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents: 18
diff changeset
928 total_clock_dsr_latency += delta;
29bc183297e1 Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents: 18
diff changeset
929 total_clock_dsr_calls++;
29bc183297e1 Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents: 18
diff changeset
930 if (min_clock_dsr_latency > delta) min_clock_dsr_latency = delta;
29bc183297e1 Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents: 18
diff changeset
931 if (max_clock_dsr_latency < delta) max_clock_dsr_latency = delta;
29bc183297e1 Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents: 18
diff changeset
932 }
29bc183297e1 Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents: 18
diff changeset
933 }
29bc183297e1 Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents: 18
diff changeset
934 #endif
29bc183297e1 Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents: 18
diff changeset
935
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
936 Cyg_RealTimeClock *rtc = (Cyg_RealTimeClock *)data;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
937
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
938 CYG_INSTRUMENT_CLOCK( TICK_START,
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
939 rtc->current_value_lo(),
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
940 rtc->current_value_hi());
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
941
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
942 rtc->tick( count );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
943
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
944 #ifdef CYGSEM_KERNEL_SCHED_TIMESLICE
132
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents: 115
diff changeset
945 #if 0 == CYGINT_KERNEL_SCHEDULER_UNIQUE_PRIORITIES
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
946
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
947 // If timeslicing is enabled, call the scheduler to
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
948 // handle it. But not if we have unique priorities.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
949
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
950 Cyg_Scheduler::scheduler.timeslice();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
951
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
952 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
953 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
954
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
955 CYG_INSTRUMENT_CLOCK( TICK_END,
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
956 rtc->current_value_lo(),
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
957 rtc->current_value_hi());
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
958
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
959 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
960
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
961 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
962
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
963 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
964 // EOF common/clock.cxx