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