annotate packages/kernel/current/src/common/clock.cxx @ 64:c38311975d4f ecos-sw-2000-01-28

Merge from eCos master repository on 2000-01-28-04:28:11-GMT
author jlarmour
date Fri, 28 Jan 2000 04:59:39 +0000
parents 29bc183297e1
children bf00f99aec69
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 //==========================================================================
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
8 //####COPYRIGHTBEGIN####
64
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
9 //
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
10 // -------------------------------------------
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
11 // The contents of this file are subject to the Red Hat eCos Public License
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
12 // Version 1.0 (the "License"); you may not use this file except in
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
13 // compliance with the License. You may obtain a copy of the License at
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
14 // http://sourceware.cygnus.com/ecos
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
15 //
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
16 // Software distributed under the License is distributed on an
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
17 // basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
18 // License for the specific language governing rights and limitations under
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
19 // the License.
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
20 //
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
21 // The Original Code is eCos - Embedded Configurable Operating System,
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
22 // released September 30, 1998.
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
23 //
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
24 // The Initial Developer of the Original Code is Red Hat.
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
25 // Portions created by Red Hat are
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
26 // Copyright (C) 1998, 1999, 2000 Red Hat, Inc.
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
27 // All Rights Reserved.
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
28 // -------------------------------------------
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
29 //
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
30 //####COPYRIGHTEND####
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
31 //==========================================================================
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
32 //#####DESCRIPTIONBEGIN####
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
33 //
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
34 // Author(s): nickg
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
35 // Contributors: nickg
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
36 // Date: 1997-09-15
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
37 // Purpose: Clock class implementation
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
38 // Description: This file contains the definitions of the counter,
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
39 // clock and alarm class member functions that are common
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
40 // to all clock implementations.
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 //####DESCRIPTIONEND####
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
43 //
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
44 //==========================================================================
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
45
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
46 #include <pkgconf/kernel.h>
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
47
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
48 #include <cyg/kernel/ktypes.h> // base kernel types
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
49 #include <cyg/infra/cyg_trac.h> // tracing macros
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
50 #include <cyg/infra/cyg_ass.h> // assertion macros
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 #include <cyg/kernel/clock.hxx> // our header
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 #include <cyg/kernel/sched.hxx> // scheduler definitions
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
55 #include <cyg/kernel/thread.hxx> // thread definitions
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
56 #include <cyg/kernel/intr.hxx> // interrupt definitions
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/sched.inl> // scheduler inlines
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
59 #include <cyg/kernel/clock.inl> // Clock inlines
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
60
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 // Static variables
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 #ifdef CYGVAR_KERNEL_COUNTERS_CLOCK
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
65
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
66 Cyg_Clock *Cyg_Clock::real_time_clock = NULL; // System real time clock
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 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
69
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 // Constructor for counter object
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
72
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
73 Cyg_Counter::Cyg_Counter(
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
74 cyg_uint32 incr
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 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
77 CYG_REPORT_FUNCTION();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
78
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
79 counter = 0;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
80 increment = incr;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
81 #if defined(CYGIMP_KERNEL_COUNTERS_SINGLE_LIST)
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 alarm_list = NULL; // Linear list of Alarms
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
84
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
85 #elif defined(CYGIMP_KERNEL_COUNTERS_MULTI_LIST)
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 for(cyg_ucount32 i=0; i < CYGNUM_KERNEL_COUNTERS_MULTI_LIST_SIZE; i++) {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
88 alarm_list[i] = NULL;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
89 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
90
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
91 #else
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
92 #error "No CYGIMP_KERNEL_COUNTERS_x_LIST config"
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
93 #endif
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 }
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 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
98 // Destructor for Counter object
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
99
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
100 Cyg_Counter::~Cyg_Counter()
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 CYG_REPORT_FUNCTION();
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 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
108 //
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
109
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
110 #ifdef CYGDBG_USE_ASSERTS
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
111
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
112 bool Cyg_Counter::check_this( cyg_assert_class_zeal zeal) const
0
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 // check that we have a non-NULL pointer first
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
115 if( this == NULL ) return false;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
116
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
117 switch( zeal )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
118 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
119 case cyg_system_test:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
120 case cyg_extreme:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
121 case cyg_thorough:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
122 case cyg_quick:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
123 case cyg_trivial:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
124 case cyg_none:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
125 default:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
126 break;
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 return true;
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 #endif
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 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
135 // Counter tick function
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
136
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
137 void Cyg_Counter::tick( cyg_uint32 ticks )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
138 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
139 // CYG_REPORT_FUNCTION();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
140
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
141 CYG_ASSERTCLASS( this, "Bad counter object" );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
142
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
143 // Increment the counter in a loop so we process
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
144 // each tick separately. This is easier than trying
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
145 // to cope with a range of increments.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
146
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
147 while( ticks-- )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
148 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
149 Cyg_Scheduler::lock();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
150
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
151 // increment the counter, note that it is
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
152 // allowed to wrap.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
153 counter += increment;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
154
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
155 // now check for any expired alarms
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
156
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
157 Cyg_Alarm **alarm_list_ptr; // pointer to list
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
158
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
159 #if defined(CYGIMP_KERNEL_COUNTERS_SINGLE_LIST)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
160
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
161 alarm_list_ptr = &alarm_list;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
162
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
163 #elif defined(CYGIMP_KERNEL_COUNTERS_MULTI_LIST)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
164
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
165 // With multiple lists, each one contains only the alarms
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
166 // that will expire at a given tick modulo the list number.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
167 // So we only have a fraction of the alarms to check here.
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 alarm_list_ptr = &(alarm_list[
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
170 (counter/increment) % CYGNUM_KERNEL_COUNTERS_MULTI_LIST_SIZE ] );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
171
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
172 #else
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
173 #error "No CYGIMP_KERNEL_COUNTERS_x_LIST config"
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
174 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
175
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
176 // 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
177 // both list oragnizations.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
178
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
179 #ifdef CYGIMP_KERNEL_COUNTERS_SORT_LIST
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
180
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
181 // 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
182 // front of the list until we find one that is in the future.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
183
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
184 while( *alarm_list_ptr != NULL )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
185 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
186 Cyg_Alarm *alarm = *alarm_list_ptr;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
187
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
188 CYG_ASSERTCLASS(alarm, "Bad alarm in counter list" );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
189
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
190 if( alarm->trigger <= counter )
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 // remove alarm from list
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
193 *alarm_list_ptr = alarm->next;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
194
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
195 if( alarm->interval != 0 )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
196 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
197 // The alarm has a retrigger interval.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
198 // Reset the trigger time and requeue
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
199 // the alarm.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
200 alarm->trigger += alarm->interval;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
201 add_alarm( alarm );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
202 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
203 else alarm->enabled = false;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
204
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
205 CYG_INSTRUMENT_ALARM( CALL, this, alarm );
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 // call alarm function
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
208 alarm->alarm(alarm, alarm->data);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
209
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
210 // all done, loop
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
211 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
212 else break;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
213 }
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
214 #else
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
215
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
216 // With an unsorted list, we must scan the whole list for
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
217 // candidates. We move the whole list to a temporary location
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
218 // before doing this so that we are not disturbed by new
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
219 // alarms being added to the list. As we consider and
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
220 // eliminate alarms we put them onto the done_list and at the
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
221 // end we then move it back to where it belongs.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
222
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
223 Cyg_Alarm *done_list = NULL;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
224
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
225 Cyg_Alarm *alarm_list = *alarm_list_ptr;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
226 *alarm_list_ptr = NULL;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
227
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
228 while( alarm_list != NULL )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
229 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
230 Cyg_Alarm *alarm = alarm_list;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
231
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
232 CYG_ASSERTCLASS(alarm, "Bad alarm in counter list" );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
233
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
234 // remove alarm from list
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
235 alarm_list = alarm->next;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
236
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
237 if( alarm->trigger <= counter )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
238 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
239 if( alarm->interval != 0 )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
240 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
241 // The alarm has a retrigger interval.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
242 // Reset the trigger time and requeue
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
243 // the alarm.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
244 alarm->trigger += alarm->interval;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
245 add_alarm( alarm );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
246 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
247 else alarm->enabled = false;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
248
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
249 CYG_INSTRUMENT_ALARM( CALL, this, alarm );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
250
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
251 // call alarm function
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
252 alarm->alarm(alarm, alarm->data);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
253
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
254 // all done, loop
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
255 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
256 else
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
257 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
258 // add unused alarm to done list.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
259 alarm->next = done_list;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
260 done_list = alarm;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
261 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
262 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
263
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
264 // Transfer any alarms that might have been added to the
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
265 // alarm list by alarm callbacks to the done list. This
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
266 // happens very rarely.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
267 while( *alarm_list_ptr != NULL )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
268 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
269 Cyg_Alarm *alarm = *alarm_list_ptr;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
270 *alarm_list_ptr = alarm->next;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
271 alarm->next = done_list;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
272 done_list = alarm;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
273 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
274
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
275 // return done list to real list
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
276 *alarm_list_ptr = done_list;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
277
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
278 #endif
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
279 Cyg_Scheduler::unlock();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
280
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
281 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
282
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
283 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
284
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
285 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
286 // Add an alarm to this counter
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
287
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
288 void Cyg_Counter::add_alarm( Cyg_Alarm *alarm )
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 CYG_REPORT_FUNCTION();
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 CYG_ASSERTCLASS( this, "Bad counter object" );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
293 CYG_ASSERTCLASS( alarm, "Bad alarm passed" );
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 Cyg_Scheduler::lock();
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 // set this now to allow an immediate handler call to manipulate
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
298 // this alarm sensibly.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
299 alarm->enabled = true;
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 // 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
302 // call its alarm function immediately.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
303 if( alarm->trigger <= counter )
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 CYG_INSTRUMENT_ALARM( CALL, this, alarm );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
306
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
307 // call alarm function. Note that this is being
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
308 // called here before the add_alarm has returned.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
309 // Note that this function may disable the alarm.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
310
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
311 alarm->alarm(alarm, alarm->data);
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 // Note that this extra check on alarm->enabled is in case the
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
314 // handler function disables this alarm!
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
315 if( alarm->interval != 0 && alarm->enabled )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
316 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
317 // The alarm has a retrigger interval.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
318 // Reset the trigger interval and drop
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
319 // through to queue it.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
320 alarm->trigger += alarm->interval;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
321 // ensure the next alarm time is in our future, and in phase
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
322 // with the original time requested.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
323 alarm->synchronize();
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 else
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
326 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
327 // The alarm is all done with, disable it
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
328 // unlock and return.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
329 alarm->enabled = false;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
330 Cyg_Scheduler::unlock();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
331 return;
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 }
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 CYG_INSTRUMENT_ALARM( ADD, this, alarm );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
336
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
337 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
338 // Find the pointer to the relevant list _after_ a retrigger
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
339 // alarm has been given its new trigger time.
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 Cyg_Alarm **alarm_list_ptr; // pointer to list
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
342
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
343 #if defined(CYGIMP_KERNEL_COUNTERS_SINGLE_LIST)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
344
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
345 alarm_list_ptr = &alarm_list;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
346
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
347 #elif defined(CYGIMP_KERNEL_COUNTERS_MULTI_LIST)
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 // Each alarm must go into the list that covers the tick that is
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
350 // going to happen _after_ the trigger time (or at it if trigger
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
351 // happens to fall on a tick.
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 alarm_list_ptr = &(alarm_list[
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
354 ((alarm->trigger+increment-1)/increment) %
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
355 CYGNUM_KERNEL_COUNTERS_MULTI_LIST_SIZE ] );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
356
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
357 #else
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
358 #error "No CYGIMP_KERNEL_COUNTERS_x_LIST config"
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
359 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
360
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
361 #ifdef CYGIMP_KERNEL_COUNTERS_SORT_LIST
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
362
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
363 // 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
364 // both list oragnizations.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
365
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
366 while( *alarm_list_ptr != NULL )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
367 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
368 Cyg_Alarm *list_alarm = *alarm_list_ptr;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
369
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
370 CYG_ASSERTCLASS(list_alarm, "Bad alarm in counter list" );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
371
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
372 // The alarms are in ascending trigger order. When we
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
373 // find an alarm that is later than us, we go in front of
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
374 // it.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
375
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
376 if( list_alarm->trigger > alarm->trigger ) break;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
377 else alarm_list_ptr = &list_alarm->next;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
378 }
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
379 #endif
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
380 // Insert the new alarm at *alarm_list_ptr
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
381
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
382 alarm->next = *alarm_list_ptr;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
383 *alarm_list_ptr = alarm;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
384
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
385 Cyg_Scheduler::unlock();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
386 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
387 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
388
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
389 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
390 // Remove an alarm from this counter
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
391
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
392 void Cyg_Counter::rem_alarm( Cyg_Alarm *alarm )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
393 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
394 CYG_REPORT_FUNCTION();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
395
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
396 CYG_ASSERTCLASS( this, "Bad counter object" );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
397 CYG_ASSERTCLASS( alarm, "Bad alarm passed" );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
398
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
399 Cyg_Alarm **alarm_list_ptr; // pointer to list
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
400
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
401 #if defined(CYGIMP_KERNEL_COUNTERS_SINGLE_LIST)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
402
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
403 alarm_list_ptr = &alarm_list;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
404
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
405 #elif defined(CYGIMP_KERNEL_COUNTERS_MULTI_LIST)
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 alarm_list_ptr = &(alarm_list[
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
408 ((alarm->trigger+increment-1)/increment) %
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
409 CYGNUM_KERNEL_COUNTERS_MULTI_LIST_SIZE ] );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
410
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
411 #else
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
412 #error "No CYGIMP_KERNEL_COUNTERS_x_LIST config"
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
413 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
414
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
415 // 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
416 // both list organizations.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
417
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
418 Cyg_Scheduler::lock();
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 CYG_INSTRUMENT_ALARM( REM, this, alarm );
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 while( *alarm_list_ptr != NULL )
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 Cyg_Alarm *list_alarm = *alarm_list_ptr;
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 CYG_ASSERTCLASS(list_alarm, "Bad alarm in counter list" );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
427
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
428 if( list_alarm == alarm ) break;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
429 else alarm_list_ptr = &list_alarm->next;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
430 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
431
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
432 // If the alarm was found, remove it from the list.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
433 if( *alarm_list_ptr != NULL )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
434 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
435 *alarm_list_ptr = alarm->next;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
436 alarm->enabled = false;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
437 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
438
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
439 Cyg_Scheduler::unlock();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
440 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
441
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
442 //==========================================================================
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
443 // Constructor for clock object
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 Cyg_Clock::Cyg_Clock(
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
446 cyg_resolution res
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 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
449 CYG_REPORT_FUNCTION();
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 resolution = res;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
452 }
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 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
455 // Destructor for Clock objects
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 Cyg_Clock::~Cyg_Clock()
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
458 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
459 CYG_REPORT_FUNCTION();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
460
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
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 #ifdef CYGDBG_USE_ASSERTS
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
467
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
468 bool Cyg_Clock::check_this( cyg_assert_class_zeal zeal) const
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
469 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
470 // check that we have a non-NULL pointer first
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
471 if( this == NULL ) return false;
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 switch( zeal )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
474 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
475 case cyg_system_test:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
476 case cyg_extreme:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
477 case cyg_thorough:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
478 case cyg_quick:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
479 case cyg_trivial:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
480 case cyg_none:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
481 default:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
482 break;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
483 };
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
484
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
485 return true;
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 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
489
64
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
490 // -------------------------------------------------------------------------
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
491 //
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
492 // 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
493 // overflow whilst retaining reasonable accuracy.
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 // 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
496 // 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
497 // 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
498
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
499 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
500 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
501 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
502 {
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
503 cyg_uint64 upper, lower;
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
504 unsigned int i;
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
505 static cyg_uint16 primes[] = {
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
506 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
507 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
508 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
509 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
510 239, // for 1,111,111
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
511 541, // for 10,101,011
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
512 1667, // for 8,333,333
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
513 };
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
514
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
515 int rounding = 0;
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 // 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
518 // 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
519 upper = m1 * m2;
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
520 lower = d1 * d2;
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
521 #ifdef CYGDBG_USE_ASSERTS
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
522 cyg_uint64 save_upper = upper;
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
523 cyg_uint64 save_lower = lower;
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
524 #endif
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
525
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
526 retry_rounding:
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
527 // 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
528 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
529 upper >>= 1;
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
530 lower >>= 1;
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
531 }
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
532
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
533 // 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
534 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
535 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
536 j = upper / p;
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
537 while ( j * p == upper ) {
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
538 k = lower / p;
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
539 if ( k * p != lower )
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
540 break;
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
541 upper = j;
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
542 lower = k;
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
543 j = upper / p;
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
544 }
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
545 }
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
546
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
547 m1 = upper;
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
548 d1 = lower;
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
549 m2 = 1;
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
550 d2 = 1;
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
551
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
552 if ( m1 > 0x10000 ) {
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
553 // 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
554
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
555 // 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
556 // 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
557 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
558 d1 >>= 1;
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
559 d2 <<= 1;
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
560 }
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
561
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
562 // 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
563 int cont = (d2 < d1);
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
564 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
565 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
566 k = d1 / p;
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
567 while ( cont && ((k * p) == d1) ) {
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
568 // we can extract a prime
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
569 d1 = k;
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
570 d2 *= p;
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
571 k = d1 / p;
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
572 cont = (d2 < d1);
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
573 }
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
574 }
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
575
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
576 // 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
577 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
578 m1 >>= 1;
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
579 m2 <<= 1;
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
580 if ( m1 < 0x10000 )
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
581 break;
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
582 }
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
583
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
584 // 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
585 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
586 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
587 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
588 k = m1 / p;
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
589 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
590 while ( cont && ((k * p) == m1) ) {
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
591 // we can extract a prime
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
592 m1 = k;
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
593 m2 *= p;
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
594 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
595 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
596 }
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
597 }
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
598
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
599 // 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
600 // 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
601 // incremented once.
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
602 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
603 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
604 m1--;
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
605 upper = m1;
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
606 rounding++;
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
607 goto retry_rounding;
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
608 }
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
609 // 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
610 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
611 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
612 d1--;
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
613 lower = d1;
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
614 rounding++;
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
615 goto retry_rounding;
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
616 }
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
617 }
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
618
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
619 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
620 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
621 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
622 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
623 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
624 "Unequal in forwards direction" );
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
625 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
626 "Unequal in reverse direction" );
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
627
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
628 pcc->mul1 = m1;
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
629 pcc->div1 = d1;
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
630 pcc->mul2 = m2;
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
631 pcc->div2 = d2;
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
632 }
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
633
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
634 // 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
635 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
636 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
637 struct converter *pcc )
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
638 {
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
639 construct_converter( pcc,
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
640 ns_per_other_tick, 1,
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
641 resolution.divisor, resolution.dividend );
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
642 }
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
643
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
644 // 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
645 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
646 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
647 struct converter *pcc )
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
648 {
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
649 construct_converter( pcc,
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
650 1, ns_per_other_tick,
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
651 resolution.dividend, resolution.divisor );
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
652 }
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
653
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 34
diff changeset
654
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
655 //==========================================================================
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
656 // Constructor for alarm object
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
657
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
658 Cyg_Alarm::Cyg_Alarm(
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
659 Cyg_Counter *c, // Attached to this counter
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
660 cyg_alarm_fn *a, // Call-back function
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
661 CYG_ADDRWORD d // Call-back data
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
662 )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
663 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
664 CYG_REPORT_FUNCTION();
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 counter = c;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
667 alarm = a;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
668 data = d;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
669 trigger = 0;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
670 interval = 0;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
671 enabled = false;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
672
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
673 #if defined(CYGIMP_KERNEL_COUNTERS_SINGLE_LIST) || defined(CYGIMP_KERNEL_COUNTERS_MULTI_LIST)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
674 next = NULL;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
675 #endif
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
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
679 Cyg_Alarm::Cyg_Alarm(){}
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 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
682 // Destructor
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
683
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
684 Cyg_Alarm::~Cyg_Alarm()
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
685 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
686 CYG_REPORT_FUNCTION();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
687
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
688 disable();
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
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
694 #ifdef CYGDBG_USE_ASSERTS
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
695
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
696 bool Cyg_Alarm::check_this( cyg_assert_class_zeal zeal) const
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
697 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
698 // check that we have a non-NULL pointer first
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
699 if( this == NULL ) return false;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
700
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
701 switch( zeal )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
702 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
703 case cyg_system_test:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
704 case cyg_extreme:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
705 case cyg_thorough:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
706 if( trigger != 0 && !enabled ) return false;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
707 case cyg_quick:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
708 case cyg_trivial:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
709 case cyg_none:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
710 default:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
711 break;
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
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
714 return true;
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
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
717 #endif
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 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
720 // Initialize Alarm and enable
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
721
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
722 void Cyg_Alarm::initialize(
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
723 cyg_tick_count t, // Absolute trigger time
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
724 cyg_tick_count i // Relative retrigger interval
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 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
727 CYG_REPORT_FUNCTION();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
728
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
729 // If already enabled, remove from counter
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
730
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
731 if( enabled ) counter->rem_alarm(this);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
732
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
733 CYG_INSTRUMENT_ALARM( INIT, this, 0 );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
734 CYG_INSTRUMENT_ALARM( TRIGGER,
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
735 ((cyg_uint32 *)&t)[0],
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
736 ((cyg_uint32 *)&t)[1] );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
737 CYG_INSTRUMENT_ALARM( INTERVAL,
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
738 ((cyg_uint32 *)&i)[0],
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
739 ((cyg_uint32 *)&i)[1] );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
740
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
741 trigger = t;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
742 interval = i;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
743
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
744 counter->add_alarm(this);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
745 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
746
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
747 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
748 // Synchronize with a past alarm stream that had been disabled,
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
749 // bring past times into synch, and the like.
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 void
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
752 Cyg_Alarm::synchronize( void )
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 if( interval != 0 ) {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
755 // This expression sets the trigger to the next whole interval
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
756 // at or after the current time. This means that alarms will
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
757 // continue at the same intervals as if they had never been
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
758 // disabled. The alternative would be to just set trigger to
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
759 // (counter->counter + interval), but this is less satisfying
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
760 // than preserving the original intervals. That behaviour can
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
761 // always be obtained by using initialize() rather than
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
762 // enable(), while the current behaviour would be more
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
763 // difficult to achieve that way.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
764 cyg_tick_count d;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
765 d = counter->current_value() + interval - trigger;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
766 if ( d > interval ) {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
767 // then trigger was in the past, so resynchronize
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
768 trigger += interval * ((d - 1) / interval );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
769 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
770 // otherwise, we were just set up, so no worries.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
771 }
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
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 // Ensure alarm enabled
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 void Cyg_Alarm::enable()
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
778 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
779 if( !enabled )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
780 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
781 // ensure the alarm time is in our future:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
782 synchronize();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
783 enabled = true;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
784 counter->add_alarm(this);
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 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
787
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
788 //==========================================================================
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
789 // System clock object
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
790
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
791 #ifdef CYGVAR_KERNEL_COUNTERS_CLOCK
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
792
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
793 class Cyg_RealTimeClock
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
794 : public Cyg_Clock
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
795 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
796 Cyg_Interrupt interrupt;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
797
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
798 static cyg_uint32 isr(cyg_vector vector, CYG_ADDRWORD data);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
799
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
800 static void dsr(cyg_vector vector, cyg_ucount32 count, CYG_ADDRWORD data);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
801
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
802 Cyg_RealTimeClock();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
803
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
804 static Cyg_RealTimeClock rtc;
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
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
807 Cyg_Clock::cyg_resolution rtc_resolution = CYGNUM_KERNEL_COUNTERS_RTC_RESOLUTION;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
808
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
809 //Cyg_RealTimeClock Cyg_RealTimeClock::rtc __attribute__((init_priority (1)));
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
810
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
811 Cyg_RealTimeClock Cyg_RealTimeClock::rtc CYG_INIT_PRIORITY( CLOCK );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
812
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
813 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
814
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
815 Cyg_RealTimeClock::Cyg_RealTimeClock()
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
816 : Cyg_Clock(rtc_resolution),
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
817 interrupt(CYGNUM_HAL_INTERRUPT_RTC, 1, (CYG_ADDRWORD)this, isr, dsr)
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
818 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
819 CYG_REPORT_FUNCTION();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
820
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
821 HAL_CLOCK_INITIALIZE( CYGNUM_KERNEL_COUNTERS_RTC_PERIOD );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
822
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
823 interrupt.attach();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
824
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
825 interrupt.unmask_interrupt(CYGNUM_HAL_INTERRUPT_RTC);
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
826
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
827 Cyg_Clock::real_time_clock = this;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
828 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
829
34
29bc183297e1 Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents: 18
diff changeset
830 #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
831 cyg_tick_count total_clock_latency, total_clock_interrupts;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
832 cyg_int32 min_clock_latency = 0x7FFFFFFF;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
833 cyg_int32 max_clock_latency = 0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
834 bool measure_clock_latency = false;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
835 #endif
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
836
34
29bc183297e1 Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents: 18
diff changeset
837 #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
838 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
839 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
840 cyg_int32 max_clock_dsr_latency = 0;
29bc183297e1 Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents: 18
diff changeset
841 cyg_int32 clock_dsr_start = 0;
29bc183297e1 Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents: 18
diff changeset
842 #endif
29bc183297e1 Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents: 18
diff changeset
843
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
844 // -------------------------------------------------------------------------
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_uint32 Cyg_RealTimeClock::isr(cyg_vector vector, CYG_ADDRWORD data)
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_REPORT_FUNCTION();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
849
34
29bc183297e1 Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents: 18
diff changeset
850 #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
851 if (measure_clock_latency) {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
852 cyg_int32 delta;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
853 HAL_CLOCK_LATENCY(&delta);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
854 // 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
855 if (delta > 0) {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
856 // Valid delta measured
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
857 total_clock_latency += delta;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
858 total_clock_interrupts++;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
859 if (min_clock_latency > delta) min_clock_latency = delta;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
860 if (max_clock_latency < delta) max_clock_latency = delta;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
861 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
862 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
863 #endif
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
864
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
865 CYG_INSTRUMENT_CLOCK( ISR, 0, 0);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
866
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
867 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
868
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
869 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
870
29bc183297e1 Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents: 18
diff changeset
871 #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
872 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
873 #endif
18
7253dcc42a09 Merge from eCos master repository on 1999-06-25-15:31:50-BST
jlarmour
parents: 2
diff changeset
874 return Cyg_Interrupt::CALL_DSR|Cyg_Interrupt::HANDLED;
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
875 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
876
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
877 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
878
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
879 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
880 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
881 // CYG_REPORT_FUNCTION();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
882
34
29bc183297e1 Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents: 18
diff changeset
883 #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
884 if (measure_clock_latency) {
29bc183297e1 Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents: 18
diff changeset
885 cyg_int32 delta;
29bc183297e1 Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents: 18
diff changeset
886 HAL_CLOCK_READ(&delta);
29bc183297e1 Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents: 18
diff changeset
887 delta -= clock_dsr_start;
29bc183297e1 Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents: 18
diff changeset
888 // 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
889 if (delta > 0 ) {
29bc183297e1 Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents: 18
diff changeset
890 // Valid delta measured
29bc183297e1 Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents: 18
diff changeset
891 total_clock_dsr_latency += delta;
29bc183297e1 Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents: 18
diff changeset
892 total_clock_dsr_calls++;
29bc183297e1 Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents: 18
diff changeset
893 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
894 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
895 }
29bc183297e1 Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents: 18
diff changeset
896 }
29bc183297e1 Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents: 18
diff changeset
897 #endif
29bc183297e1 Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents: 18
diff changeset
898
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
899 Cyg_RealTimeClock *rtc = (Cyg_RealTimeClock *)data;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
900
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
901 CYG_INSTRUMENT_CLOCK( TICK_START,
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
902 rtc->current_value_lo(),
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
903 rtc->current_value_hi());
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
904
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
905 rtc->tick( count );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
906
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
907 #ifdef CYGSEM_KERNEL_SCHED_TIMESLICE
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
908 #if 0 == CYG_SCHED_UNIQUE_PRIORITIES
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
909
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
910 // If timeslicing is enabled, call the scheduler to
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
911 // handle it. But not if we have unique priorities.
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 Cyg_Scheduler::scheduler.timeslice();
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 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
916 #endif
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_INSTRUMENT_CLOCK( TICK_END,
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
919 rtc->current_value_lo(),
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
920 rtc->current_value_hi());
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
921
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
922 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
923
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
924 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
925
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
926 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
927 // EOF common/clock.cxx