annotate packages/kernel/current/src/common/clock.cxx @ 1249:cfe2937847da

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