annotate packages/kernel/current/src/common/thread.cxx @ 0:3111d98ba7b3 ecos-v1_1-release

Initial commit of eCos version 1.1
author jlarmour
date Tue, 11 May 1999 11:16:07 +0000
parents
children 443894e2e912
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 //
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
3 // common/thread.cxx
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
4 //
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
5 // Thread class implementations
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
6 //
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
7 //==========================================================================
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
8 //####COPYRIGHTBEGIN####
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
9 //
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
10 // -------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
11 // The contents of this file are subject to the Cygnus eCos Public License
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
12 // Version 1.0 (the "License"); you may not use this file except in
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
13 // compliance with the License. You may obtain a copy of the License at
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
14 // http://sourceware.cygnus.com/ecos
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
15 //
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
16 // Software distributed under the License is distributed on an "AS IS"
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
17 // basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
18 // License for the specific language governing rights and limitations under
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
19 // the License.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
20 //
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
21 // The Original Code is eCos - Embedded Cygnus Operating System, released
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
22 // September 30, 1998.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
23 //
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
24 // The Initial Developer of the Original Code is Cygnus. Portions created
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
25 // by Cygnus are Copyright (C) 1998 Cygnus Solutions. All Rights Reserved.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
26 // -------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
27 //
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
28 //####COPYRIGHTEND####
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
29 //==========================================================================
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
30 //#####DESCRIPTIONBEGIN####
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
31 //
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
32 // Author(s): nickg
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
33 // Contributors: nickg
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
34 // Date: 1997-09-15
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
35 // Purpose: Thread class implementation
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
36 // Description: This file contains the definitions of the thread class
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
37 // member functions that are common to all thread implementations.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
38 //
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
39 //####DESCRIPTIONEND####
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
40 //
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
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
43 #include <pkgconf/kernel.h> // kernel configuration file
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
44
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
45 #include <cyg/kernel/ktypes.h> // base kernel types
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
46 #include <cyg/infra/cyg_trac.h> // tracing macros
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
47 #include <cyg/infra/cyg_ass.h> // assertion macros
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
48 #include <cyg/kernel/instrmnt.h> // instrumentation
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
49
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
50 #include <cyg/kernel/thread.hxx> // our header
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
51
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
52 #include <cyg/kernel/intr.hxx> // Interrupt support
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
53
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
54 #include <cyg/kernel/thread.inl> // thread inlines
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
55 #include <cyg/kernel/sched.inl> // scheduler inlines
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
56 #include <cyg/kernel/clock.inl> // clock inlines
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 // =========================================================================
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
59 // Cyg_HardwareThread members
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
60
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
61 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
62 // Thread entry point.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
63 // This is inserted as the PC value in all initial thread contexts.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
64 // It does some housekeeping and then calls the real entry point.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
65
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
66 void
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
67 Cyg_HardwareThread::thread_entry( Cyg_Thread *thread )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
68 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
69 CYG_REPORT_FUNCTION();
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 Cyg_Scheduler::scheduler.need_reschedule = false; // finished rescheduling
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
72 Cyg_Scheduler::scheduler.current_thread = thread; // restore current thread pointer
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 CYGSEM_KERNEL_SCHED_TIMESLICE
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
75 // Reset the timeslice counter so that this thread gets a full
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
76 // quantum.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
77 Cyg_Scheduler::reset_timeslice_count();
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 // Zero the lock
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
81 Cyg_Scheduler::sched_lock = 0;
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 // Call entry point in a loop.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
84
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
85 for(;;)
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 thread->entry_point(thread->entry_data);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
88 thread->exit();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
89 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
90 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
91
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 // Cyg_Thread members
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
94
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
95 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
96 // Statics and thread list functions
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
97
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
98 #ifdef CYGVAR_KERNEL_THREADS_LIST
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
99
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
100 // List of all extant threads
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
101 Cyg_Thread *Cyg_Thread::thread_list = 0;
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 inline void
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
104 Cyg_Thread::add_to_list( void )
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 // Add thread to housekeeping list
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
107 Cyg_Scheduler::lock();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
108
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
109 if( thread_list == 0 )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
110 list_next = this;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
111 else {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
112 Cyg_Thread *prev = thread_list;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
113 do {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
114 if ( this == prev )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
115 break; // found it already!
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
116 prev = prev->list_next;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
117 } while ( prev != thread_list );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
118 if ( this != prev ) {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
119 // insert it in the list:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
120 list_next = thread_list->list_next;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
121 thread_list->list_next = this;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
122 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
123 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
124 thread_list = this;
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 Cyg_Scheduler::unlock();
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 inline void
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
130 Cyg_Thread::remove_from_list( void )
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 // remove thread from housekeeping list
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
133 Cyg_Scheduler::lock();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
134
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
135 Cyg_Thread *prev = thread_list;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
136
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
137 do {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
138 if( prev->list_next == this ) {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
139 prev->list_next = list_next;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
140 if( thread_list == this )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
141 thread_list = list_next;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
142 break;
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 prev = prev->list_next;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
145 } while ( prev != thread_list );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
146
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
147 Cyg_Scheduler::unlock();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
148 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
149
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
150 #endif
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 static cyg_uint16 next_unique_id = 1;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
153
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
154 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
155 // Magic new operator to allow the thread constructor to be
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
156 // recalled.
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 inline void *
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
159 operator new(size_t size, Cyg_Thread *ptr)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
160 { return (void *)ptr; };
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 // Constructor
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
163 // This constructor is deprecated and should be replaced with the new
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
164 // one below. Until that happens, any changes must be made to both
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
165 // constructors.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
166
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
167 Cyg_Thread::Cyg_Thread(
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
168 cyg_thread_entry *entry, // entry point function
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
169 CYG_ADDRWORD entry_data, // entry data
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
170 cyg_ucount32 stack_size, // stack size, 0 = use default
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
171 CYG_ADDRESS stack_base // stack base, NULL = allocate
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 : Cyg_HardwareThread(entry, entry_data, stack_size, stack_base),
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
174 Cyg_SchedThread(this, CYG_SCHED_DEFAULT_INFO)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
175 #ifdef CYGFUN_KERNEL_THREADS_TIMER
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
176 ,timer(this)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
177 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
178 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
179 CYG_REPORT_FUNCTION();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
180
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
181 // Start the thread in suspended state.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
182 state = SUSPENDED;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
183 suspend_count = 1;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
184
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
185 // Initialize sleep_reason which is used by kill, release
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
186 sleep_reason = NONE;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
187 wake_reason = NONE;
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 // Assign a 16 bit id to the thread.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
190 unique_id = next_unique_id++;
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 #ifdef CYGVAR_KERNEL_THREADS_DATA
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
193 // Zero all per-thread data entries.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
194 for( int i = 0; i < CYGNUM_KERNEL_THREADS_DATA_MAX; i++ )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
195 thread_data[i] = 0;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
196 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
197 #ifdef CYGVAR_KERNEL_THREADS_NAME
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
198 name = 0;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
199 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
200 #ifdef CYGVAR_KERNEL_THREADS_LIST
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
201 // Add thread to housekeeping list
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
202 add_to_list();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
203 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
204
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
205 Cyg_Scheduler::scheduler.register_thread(this);
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 init_context(this);
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 CYG_REPORT_RETURN();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
210 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
211
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
212 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
213 // Constructor
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
214 // This is an alternative constructor that will become the default
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
215 // eventually.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
216
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
217 Cyg_Thread::Cyg_Thread(
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
218 CYG_ADDRWORD sched_info, // Scheduling parameter(s)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
219 cyg_thread_entry *entry, // entry point function
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
220 CYG_ADDRWORD entry_data, // entry data
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
221 char *name_arg, // thread name cookie
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
222 CYG_ADDRESS stack_base, // stack base, NULL = allocate
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
223 cyg_ucount32 stack_size // stack size, 0 = use default
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
224 )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
225 : Cyg_HardwareThread(entry, entry_data, stack_size, stack_base),
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
226 Cyg_SchedThread(this, sched_info)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
227 #ifdef CYGFUN_KERNEL_THREADS_TIMER
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
228 ,timer(this)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
229 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
230 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
231 CYG_REPORT_FUNCTION();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
232
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
233 // Start the thread in suspended state.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
234 state = SUSPENDED;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
235 suspend_count = 1;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
236
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
237 // Initialize sleep_reason which is used by kill, release
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
238 sleep_reason = NONE;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
239 wake_reason = NONE;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
240
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
241 // Assign a 16 bit id to the thread.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
242 unique_id = next_unique_id++;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
243
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
244 #ifdef CYGVAR_KERNEL_THREADS_DATA
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
245 // Zero all per-thread data entries.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
246 for( int i = 0; i < CYGNUM_KERNEL_THREADS_DATA_MAX; i++ )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
247 thread_data[i] = 0;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
248 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
249 #ifdef CYGVAR_KERNEL_THREADS_NAME
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
250 name = name_arg;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
251 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
252 #ifdef CYGVAR_KERNEL_THREADS_LIST
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
253 // Add thread to housekeeping list
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
254 add_to_list();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
255 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
256
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
257 Cyg_Scheduler::scheduler.register_thread(this);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
258
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
259 init_context(this);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
260
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
261 CYG_REPORT_RETURN();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
262 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
263
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
264
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
265 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
266 // Re-initialize this thread.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
267 // We do this by re-invoking the constructor with the original
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
268 // arguments, which are still available in the object.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
269
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
270 void
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
271 Cyg_Thread::reinitialize()
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
272 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
273 CYG_REPORT_FUNCTION();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
274
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
275 CYG_ASSERTCLASS( this, "Bad thread");
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
276 CYG_ASSERT( this != Cyg_Scheduler::get_current_thread(),
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
277 "Attempt to reinitialize current thread");
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
278 CYG_ASSERT( get_current_queue() == NULL , "Thread is still on a queue");
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
279
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
280 #ifdef CYGFUN_KERNEL_THREADS_TIMER
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
281 // Clear the timeout. It is irrelevant whether there was
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
282 // actually a timeout pending.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
283 timer.disable();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
284 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
285
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
286 // Ensure the scheduler has let go of us.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
287 Cyg_Scheduler::scheduler.deregister_thread(this);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
288
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
289 cyg_priority pri = get_priority();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
290 #ifdef CYGVAR_KERNEL_THREADS_NAME
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
291 char * name_arg = name;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
292 #else
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
293 char * name_arg = NULL;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
294 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
295
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
296 new(this) Cyg_Thread( pri,
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
297 entry_point, entry_data,
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
298 name_arg,
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
299 stack_base, stack_size );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
300 // the constructor re-registers the thread with the scheduler.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
301
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
302 CYG_ASSERTCLASS( this, "Thread corrupted by reinitialize");
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
303
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
304 CYG_REPORT_RETURN();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
305 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
306
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
307 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
308 // Destructor.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
309
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
310 Cyg_Thread::~Cyg_Thread()
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
311 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
312 CYG_REPORT_FUNCTION();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
313
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
314 Cyg_Scheduler::scheduler.deregister_thread(this);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
315
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
316 #ifdef CYGVAR_KERNEL_THREADS_LIST
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
317 // Remove thread from housekeeping list.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
318 remove_from_list();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
319 #endif
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 CYG_REPORT_RETURN();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
322 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
323
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 // Thread consistency checker.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
326
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
327 #ifdef CYGDBG_USE_ASSERTS
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
328
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
329 bool
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
330 Cyg_Thread::check_this( cyg_assert_class_zeal zeal)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
331 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
332 // CYG_REPORT_FUNCTION();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
333
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
334 // check that we have a non-NULL pointer first
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
335 if( this == NULL ) return false;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
336
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
337 switch( zeal )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
338 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
339 case cyg_system_test:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
340 case cyg_extreme:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
341 case cyg_thorough:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
342 if( (state & SUSPENDED) && (suspend_count == 0) ) return false;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
343 case cyg_quick:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
344 case cyg_trivial:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
345 case cyg_none:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
346 default:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
347 break;
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
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
350 return true;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
351 }
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 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
354
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
355 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
356 // Put the thread to sleep.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
357 // This can only be called by the current thread on itself, hence
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
358 // it is a static function.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
359
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
360 void
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
361 Cyg_Thread::sleep()
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 CYG_REPORT_FUNCTION();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
364
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
365 Cyg_Thread *current = Cyg_Scheduler::get_current_thread();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
366
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
367 CYG_ASSERTCLASS( current, "Bad current thread" );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
368
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
369 CYG_INSTRUMENT_THREAD(SLEEP,current,0);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
370
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
371 // Prevent preemption
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
372 Cyg_Scheduler::lock();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
373
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
374 // If running, remove from run qs
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
375 if ( current->state == RUNNING )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
376 Cyg_Scheduler::scheduler.rem_thread(current);
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 // Set the state
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
379 current->state |= SLEEPING;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
380
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
381 // Unlock the scheduler and switch threads
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
382 Cyg_Scheduler::unlock();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
383
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
384 CYG_REPORT_RETURN();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
385 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
386
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
387 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
388 // Awaken the thread from sleep.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
389
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
390 void
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
391 Cyg_Thread::wake()
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
392 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
393 CYG_REPORT_FUNCTION();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
394
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
395 CYG_INSTRUMENT_THREAD(WAKE,this,Cyg_Scheduler::current_thread);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
396
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
397 // Prevent preemption
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
398 Cyg_Scheduler::lock();
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 if( 0 != (state & SLEEPSET) )
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 // Set the state
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
403 state &= ~SLEEPSET;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
404
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
405 // remove from any queue we were on
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
406 remove();
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 // If the thread is now runnable, return it to run queue
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
409 if( state == RUNNING )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
410 Cyg_Scheduler::scheduler.add_thread(this);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
411
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
412 }
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 // Unlock the scheduler and maybe switch threads
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
415 Cyg_Scheduler::unlock();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
416
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
417 CYG_REPORT_RETURN();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
418 }
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 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
421 // Put the thread to sleep, with wakeup count.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
422 // This can only be called by the current thread on itself, hence
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
423 // it is a static function.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
424
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
425 void
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
426 Cyg_Thread::counted_sleep()
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 CYG_REPORT_FUNCTION();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
429
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
430 Cyg_Thread *current = Cyg_Scheduler::get_current_thread();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
431
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
432 CYG_ASSERTCLASS( current, "Bad current thread" );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
433
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
434 CYG_INSTRUMENT_THREAD(SLEEP,current,0);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
435
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
436 // Prevent preemption
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
437 Cyg_Scheduler::lock();
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 if ( 0 == current->wakeup_count ) {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
440 set_sleep_reason( Cyg_Thread::WAIT );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
441 current->sleep(); // prepare to sleep
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
442 current->state |= COUNTSLEEP; // Set the state
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
443 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
444 else
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
445 // there is a queued wakeup, do not sleep
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
446 current->wakeup_count--;
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 // Unlock the scheduler and switch threads
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
449 Cyg_Scheduler::unlock();
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 // and deal with anything we must do when we return
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
452 switch( current->wake_reason ) {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
453 case DESTRUCT:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
454 case EXIT:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
455 current->exit();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
456 break;
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 default:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
459 break;
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 CYG_REPORT_RETURN();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
463 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
464
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
465 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
466 // Put the thread to sleep for a delay, with wakeup count.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
467 // This can only be called by the current thread on itself, hence
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
468 // it is a static function.
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 #ifdef CYGFUN_KERNEL_THREADS_TIMER
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
471 void
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
472 Cyg_Thread::counted_sleep( cyg_tick_count delay )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
473 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
474 CYG_REPORT_FUNCTION();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
475
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
476 Cyg_Thread *current = Cyg_Scheduler::get_current_thread();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
477
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
478 CYG_ASSERTCLASS( current, "Bad current thread" );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
479
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
480 CYG_INSTRUMENT_THREAD(SLEEP,current,0);
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 // Prevent preemption
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
483 Cyg_Scheduler::lock();
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 if ( 0 == current->wakeup_count ) {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
486
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
487 // Set the timer (once outside any waiting loop.)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
488 set_timer( Cyg_Clock::real_time_clock->current_value()+delay,
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
489 Cyg_Thread::TIMEOUT );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
490
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
491 // If the timeout is in the past, the wake reason will have been
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
492 // set to something other than NONE already.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
493
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
494 if( current->get_wake_reason() == Cyg_Thread::NONE )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
495 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
496 set_sleep_reason( Cyg_Thread::TIMEOUT );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
497 current->sleep(); // prepare to sleep
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
498 current->state |= COUNTSLEEP; // Set the state
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
499
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
500 CYG_ASSERT( Cyg_Scheduler::get_sched_lock() == 1,
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
501 "Called with non-zero scheduler lock");
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
502
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
503 Cyg_Scheduler::unlock();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
504 Cyg_Scheduler::lock();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
505
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
506 // clear the timer; if it actually fired, no worries.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
507 clear_timer();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
508 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
509 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
510 else
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
511 // there is a queued wakeup, do not sleep
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
512 current->wakeup_count--;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
513
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
514 // Unlock the scheduler and switch threads
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
515 Cyg_Scheduler::unlock();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
516
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
517 // and deal with anything we must do when we return
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
518 switch( current->wake_reason ) {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
519 case DESTRUCT:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
520 case EXIT:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
521 current->exit();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
522 break;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
523
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
524 default:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
525 break;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
526 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
527
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
528 CYG_REPORT_RETURN();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
529 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
530 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
531
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
532 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
533 // Awaken the thread from sleep.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
534
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
535 void
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
536 Cyg_Thread::counted_wake()
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
537 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
538 CYG_REPORT_FUNCTION();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
539
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
540 CYG_INSTRUMENT_THREAD(WAKE,this,Cyg_Scheduler::current_thread);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
541
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
542 // Prevent preemption
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
543 Cyg_Scheduler::lock();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
544
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
545 if ( 0 == (state & COUNTSLEEP) ) // already awake, or waiting:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
546 wakeup_count++; // not in a counted sleep anyway.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
547 else {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
548 sleep_reason = NONE;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
549 wake_reason = DONE;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
550 wake(); // and awaken the thread
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
551 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
552
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
553 #ifdef CYGNUM_KERNEL_MAX_COUNTED_WAKE_COUNT_ASSERT
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
554 CYG_ASSERT( CYGNUM_KERNEL_MAX_COUNTED_WAKE_COUNT_ASSERT > wakeup_count,
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
555 "wakeup_count overflow" );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
556 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
557
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
558 // Unlock the scheduler and maybe switch threads
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
559 Cyg_Scheduler::unlock();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
560
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
561 CYG_REPORT_RETURN();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
562 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
563
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
564 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
565 // Cancel wakeups for this thread and return how many were pending
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
566 cyg_uint32
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
567 Cyg_Thread::cancel_counted_wake()
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
568 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
569 CYG_REPORT_FUNCTION();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
570
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
571 CYG_INSTRUMENT_THREAD(WAKE,this,Cyg_Scheduler::current_thread);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
572
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
573 // Prevent preemption
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
574 Cyg_Scheduler::lock();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
575
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
576 cyg_uint32 result = wakeup_count;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
577 wakeup_count = 0;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
578
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
579 // Unlock the scheduler
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
580 Cyg_Scheduler::unlock();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
581
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
582 CYG_REPORT_RETVAL( result );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
583 return result;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
584 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
585
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
586 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
587 // Suspend thread. Increment suspend count and deschedule thread
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
588 // if still running.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
589
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
590 void
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
591 Cyg_Thread::suspend()
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
592 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
593 CYG_REPORT_FUNCTION();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
594
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
595 CYG_INSTRUMENT_THREAD(SUSPEND,this,Cyg_Scheduler::current_thread);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
596
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
597 // Prevent preemption
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
598 Cyg_Scheduler::lock();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
599
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
600 suspend_count++;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
601
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
602 #ifdef CYGNUM_KERNEL_MAX_SUSPEND_COUNT_ASSERT
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
603 CYG_ASSERT( CYGNUM_KERNEL_MAX_SUSPEND_COUNT_ASSERT > suspend_count,
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
604 "suspend_count overflow" );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
605 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
606
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
607 // If running, remove from run qs
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
608 if( state == RUNNING )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
609 Cyg_Scheduler::scheduler.rem_thread(this);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
610
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
611 // Set the state
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
612 state |= SUSPENDED;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
613
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
614 // Unlock the scheduler and maybe switch threads
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
615 Cyg_Scheduler::unlock();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
616
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
617 CYG_REPORT_RETURN();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
618 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
619
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
620 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
621 // Resume thread. Decrement suspend count and reschedule if it
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
622 // is zero.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
623
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
624 void
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
625 Cyg_Thread::resume()
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
626 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
627 CYG_REPORT_FUNCTION();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
628
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
629 CYG_INSTRUMENT_THREAD(RESUME,this,Cyg_Scheduler::current_thread);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
630
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
631 // Prevent preemption
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
632 Cyg_Scheduler::lock();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
633
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
634 // If we are about to zero the count, clear the state bit and
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
635 // reschedule the thread if possible.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
636
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
637 if( suspend_count == 1 )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
638 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
639 suspend_count = 0;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
640
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
641 CYG_ASSERT( (state & SUSPENDED) != 0, "SUSPENDED bit not set" );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
642
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
643 // Set the state
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
644 state &= ~SUSPENDED;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
645
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
646 // Return thread to scheduler if runnable
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
647 if( state == RUNNING )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
648 Cyg_Scheduler::scheduler.add_thread(this);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
649 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
650 else
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
651 if( suspend_count > 0 )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
652 suspend_count--;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
653 // else ignore attempt to resume
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 // Unlock the scheduler and maybe switch threads
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
656 Cyg_Scheduler::unlock();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
657 CYG_REPORT_RETURN();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
658 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
659
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 // Forced Resume thread. Zero suspend count and reschedule...
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 void
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
664 Cyg_Thread::force_resume()
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
665 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
666 CYG_REPORT_FUNCTION();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
667
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
668 CYG_INSTRUMENT_THREAD(RESUME,this,Cyg_Scheduler::current_thread);
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 // Prevent preemption
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
671 Cyg_Scheduler::lock();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
672
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
673 // If we are about to zero the count, clear the state bit and
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
674 // reschedule the thread if possible.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
675
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
676 if ( 0 < suspend_count ) {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
677 suspend_count = 0;
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_ASSERT( (state & SUSPENDED) != 0, "SUSPENDED bit not set" );
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 // Set the state
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
682 state &= ~SUSPENDED;
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 // Return thread to scheduler if runnable
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
685 if( state == RUNNING )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
686 Cyg_Scheduler::scheduler.add_thread(this);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
687 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
688
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
689 // Unlock the scheduler and maybe switch threads
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
690 Cyg_Scheduler::unlock();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
691 CYG_REPORT_RETURN();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
692 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
693
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
694 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
695 // Force thread to wake up from a sleep with a wake_reason of
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
696 // BREAK. It is the responsibility of the woken thread to detect
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
697 // the release() and do the right thing.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
698
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
699 void
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
700 Cyg_Thread::release()
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
701 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
702 CYG_REPORT_FUNCTION();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
703 // Prevent preemption
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
704 Cyg_Scheduler::lock();
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 // If the thread is in any of the sleep states, set the
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
707 // wake reason and wake it up.
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 switch( sleep_reason )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
710 {
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 case NONE:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
713 // The thread is not sleeping for any reason, do nothing.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
714 // drop through...
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
715
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
716 case DESTRUCT:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
717 case BREAK:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
718 case EXIT:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
719 case DONE:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
720 // Do nothing in any of these cases. They are here to
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
721 // keep the compiler happy.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
722
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
723 Cyg_Scheduler::unlock();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
724 CYG_REPORT_RETURN();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
725 return;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
726
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
727 case WAIT:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
728 // The thread was waiting for some sync object to do
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
729 // something.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
730 // drop through...
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
731
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
732 case TIMEOUT:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
733 // The thread was waiting on a sync object with a timeout.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
734 // drop through...
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 case DELAY:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
737 // The thread was simply delaying, unless it has been
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
738 // woken up for some other reason, wake it now.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
739 sleep_reason = NONE;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
740 wake_reason = BREAK;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
741 break;
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 wake();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
745
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
746 // Allow preemption
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
747 Cyg_Scheduler::unlock();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
748
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
749 CYG_REPORT_RETURN();
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
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
752 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
753 // Exit thread. This puts the thread into EXITED state.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
754
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
755 void
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
756 Cyg_Thread::exit()
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
757 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
758 // The thread should never return from this function.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
759
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
760 Cyg_Thread *self = Cyg_Thread::self();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
761
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
762 Cyg_Scheduler::lock();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
763
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
764 // clear the timer; if there was none, no worries.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
765 clear_timer();
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 self->state = EXITED;
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 Cyg_Scheduler::scheduler.rem_thread(self);
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 // Un-nest any scheduler locks we have until we
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
772 // suspend.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
773 for( ;; ) Cyg_Scheduler::unlock();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
774 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
775
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
776 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
777 // Kill thread. Force the thread into EXITED state externally, or
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
778 // make it wake up and call exit().
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
779
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
780 void
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
781 Cyg_Thread::kill()
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
782 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
783 CYG_REPORT_FUNCTION();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
784 // If this is called by the current thread on itself,
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
785 // just call exit(), which is what he should have done
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
786 // in the first place.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
787 if( this == Cyg_Scheduler::get_current_thread() )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
788 exit();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
789
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
790 // Prevent preemption
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
791 Cyg_Scheduler::lock();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
792
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
793 // We are killing someone else. Find out what state he is
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
794 // in and force him to wakeup and call exit().
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
795
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
796 force_resume(); // this is necessary for when
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
797 // he is asleep AND suspended.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
798 #ifdef CYGFUN_KERNEL_THREADS_TIMER
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
799 timer.disable(); // and make sure the timer
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
800 // does not persist.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
801 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
802
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
803 switch( sleep_reason )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
804 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
805
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
806 case NONE:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
807 // The thread is not sleeping for any reason, it must be
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
808 // on a run queue.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
809 // We can safely deschedule and set its state.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
810 if( state == RUNNING ) Cyg_Scheduler::scheduler.rem_thread(this);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
811 state = EXITED;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
812 break;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
813
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
814 case DESTRUCT:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
815 case BREAK:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
816 case EXIT:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
817 case DONE:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
818 // Do nothing in any of these cases. They are here to
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
819 // keep the compiler happy.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
820
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
821 Cyg_Scheduler::unlock();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
822 CYG_REPORT_RETURN();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
823 return;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
824
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
825 case WAIT:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
826 // The thread was waiting for some sync object to do
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
827 // something.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
828 // drop through...
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
829
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
830 case TIMEOUT:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
831 // The thread was waiting on a sync object with a timeout.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
832 // drop through...
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
833
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
834 case DELAY:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
835 // The thread was simply delaying, unless it has been
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
836 // woken up for some other reason, wake it now.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
837 sleep_reason = NONE;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
838 wake_reason = EXIT;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
839 break;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
840 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
841
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
842 wake();
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 // Allow preemption
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
845 Cyg_Scheduler::unlock();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
846 CYG_REPORT_RETURN();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
847 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
848
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 // Set thread priority
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 #ifdef CYGIMP_THREAD_PRIORITY
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 void
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
855 Cyg_Thread::set_priority( cyg_priority new_priority )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
856 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
857 CYG_REPORT_FUNCTION();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
858
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
859 // CYG_ASSERT( new_priority >= CYG_THREAD_MAX_PRIORITY, "Priority out of range");
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
860 // CYG_ASSERT( new_priority <= CYG_THREAD_MIN_PRIORITY, "Priority out of range");
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
861
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
862 CYG_INSTRUMENT_THREAD(PRIORITY,this,priority);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
863
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
864 // Prevent preemption
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
865 Cyg_Scheduler::lock();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
866
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
867 Cyg_ThreadQueue *queue = NULL;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
868
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
869 // If running, remove from run qs
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
870 if( state == RUNNING )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
871 Cyg_Scheduler::scheduler.rem_thread(this);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
872 else if( state & SLEEPING )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
873 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
874 // Remove thread from current queue.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
875 queue = get_current_queue();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
876 // if indeed we are on a queue
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
877 if ( NULL != queue ) {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
878 CYG_CHECK_DATA_PTR(queue, "Bad queue pointer");
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
879 remove();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
880 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
881 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
882
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
883 Cyg_Scheduler::scheduler.deregister_thread(this);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
884
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
885 #if CYG_SCHED_UNIQUE_PRIORITIES
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
886
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
887 // Check that there are no other threads at this priority.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
888 // If so, leave is as it is.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
889
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
890 CYG_ASSERT( Cyg_Scheduler::scheduler.unique(new_priority), "Priority not unique");
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
891
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
892 if( Cyg_Scheduler::scheduler.unique(new_priority) )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
893 priority = new_priority;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
894
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
895 #else // !CYG_SCHED_UNIQUE_PRIORITIES
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
896
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
897 #ifdef CYGSEM_KERNEL_SYNCH_MUTEX_PRIORITY_INHERITANCE_SIMPLE
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
898
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
899 // When we have priority inheritance, we must update the original
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
900 // priority and not the inherited one. If the new priority is
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
901 // better than the current inherited one, then use that
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
902 // immediately. We remain in inherited state to avoid problems
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
903 // with multiple mutex inheritances.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
904
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
905 if( priority_inherited )
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 original_priority = new_priority;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
908 if( priority > new_priority ) priority = new_priority;
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 else priority = new_priority;
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 #else
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
913
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
914 priority = new_priority;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
915
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
916 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
917
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
918 #endif // CYG_SCHED_UNIQUE_PRIORITIES
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
919
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
920 Cyg_Scheduler::scheduler.register_thread(this);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
921
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
922 // Return thread to scheduler if runnable
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
923 if( state == RUNNING )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
924 Cyg_Scheduler::scheduler.add_thread(this);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
925 else if ( state & SLEEPING )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
926 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
927 // return to current queue
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
928 // if indeed we are on a queue
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
929 if ( NULL != queue ) {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
930 CYG_CHECK_DATA_PTR(queue, "Bad queue pointer");
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
931 queue->enqueue(this);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
932 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
933 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
934
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
935 // If the current thread is being reprioritized, set the
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
936 // reschedule flag to ensure that it gets rescheduled if
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
937 // necessary. (Strictly we only need to do this if the new
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
938 // priority is less than that of some other runnable thread, in
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
939 // practice checking that is as expensive as what the scheduler
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
940 // will do anyway).
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
941
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
942 if( this == Cyg_Scheduler::get_current_thread() )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
943 Cyg_Scheduler::need_reschedule = true;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
944
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
945 // Unlock the scheduler and maybe switch threads
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
946 Cyg_Scheduler::unlock();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
947 CYG_REPORT_RETURN();
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
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
950 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
951
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
952
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 // Thread delay function
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
955
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
956 void
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
957 Cyg_Thread::delay( cyg_tick_count delay)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
958 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
959 CYG_REPORT_FUNCTION();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
960
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
961 #if defined(CYGFUN_KERNEL_THREADS_TIMER) && defined(CYGVAR_KERNEL_COUNTERS_CLOCK)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
962
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
963 CYG_INSTRUMENT_THREAD(DELAY,this,delay);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
964
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
965 // Prevent preemption
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
966 Cyg_Scheduler::lock();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
967
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
968 sleep();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
969
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
970 set_timer( Cyg_Clock::real_time_clock->current_value()+delay, DELAY );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
971
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
972 // Unlock the scheduler and maybe switch threads
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
973 Cyg_Scheduler::unlock();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
974
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
975 // Clear the timeout. It is irrelevant whether the alarm has
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
976 // actually gone off or not.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
977 clear_timer();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
978
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
979 // and deal with anything else we must do when we return
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
980 switch( wake_reason ) {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
981 case DESTRUCT:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
982 case EXIT:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
983 exit();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
984 break;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
985
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
986 default:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
987 break;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
988 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
989 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
990 CYG_REPORT_RETURN();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
991 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
992
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
993 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
994 //
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
995
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
996 #ifdef CYGPKG_KERNEL_EXCEPTIONS
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
997
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
998 void
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
999 Cyg_Thread::deliver_exception(
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1000 cyg_code exception_number, // exception being raised
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1001 CYG_ADDRWORD exception_info // exception specific info
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1002 )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1003 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1004 if( this == Cyg_Scheduler::get_current_thread() )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1005 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1006 // Delivering to current thread, probably as a result
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1007 // of a real hardware exception. Simply invoke the appropriate
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1008 // handler.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1009
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1010 exception_control.deliver_exception( exception_number, exception_info );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1011 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1012 #ifdef CYGIMP_EXCEPTION_ASYNC
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1013 else
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1014 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1015 // Delivering to another thread, probably as a result of one thread
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1016 // invoking this function on another thread. Adjust the other thread's
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1017 // state to make it execute the exception routine when it next runs.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1018
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1019 // At present there is an unresolved problem here. We do not know what
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1020 // state the destination thread is in. It may not be a suitable point at
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1021 // which to invoke an exception routine. In most cases the exception
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1022 // routine will be run in the scheduler thread switch code, where the world is
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1023 // in an inconsistent state. We really need to run the routine at the
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1024 // end of unlock_inner(). However this would add extra code to the scheduler,
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1025 // and require a way of storing pending exceptions. So for now this option is
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1026 // disabled and not yet implemented, it may never be.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1027
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1028 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1029 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1030 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1031
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1032 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1033
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1034 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1035 // Per-thread data support
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1036
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1037 #ifdef CYGVAR_KERNEL_THREADS_DATA
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1038
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1039 // Set the data map bits for each free slot in the data array.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1040 cyg_ucount32 Cyg_Thread::thread_data_map = (~CYGNUM_KERNEL_THREADS_DATA_ALL) &
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1041 ((1<<CYGNUM_KERNEL_THREADS_DATA_MAX)-1);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1042
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1043 cyg_ucount32
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1044 Cyg_Thread::new_data_index()
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1045 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1046 Cyg_Scheduler::lock();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1047
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1048 cyg_ucount32 index;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1049
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1050 CYG_ASSERT( thread_data_map != 0 , "No more thread data indexes");
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1051
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1052 // find ls set bit
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1053 HAL_LSBIT_INDEX( index, thread_data_map );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1054
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1055 // clear the bit
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1056 thread_data_map &= ~(1<<index);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1057
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1058 Cyg_Scheduler::unlock();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1059
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1060 return index;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1061 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1062
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1063 void Cyg_Thread::free_data_index( cyg_ucount32 index )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1064 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1065 Cyg_Scheduler::lock();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1066
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1067 thread_data_map |= (1<<index);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1068
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1069 Cyg_Scheduler::unlock();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1070 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1071
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1072
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1073 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1074
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1075 // =========================================================================
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1076 // Cyg_ThreadTimer member functions
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1077
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1078 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1079 // Timer alarm function. Inspect the sleep_reason and if necessary wake
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1080 // up the thread with an appropriate wake_reason.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1081
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1082 #ifdef CYGFUN_KERNEL_THREADS_TIMER
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1083
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1084 void
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1085 Cyg_ThreadTimer::alarm(
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1086 Cyg_Alarm *alarm,
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1087 CYG_ADDRWORD data
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1088 )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1089 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1090 CYG_REPORT_FUNCTION();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1091
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1092 Cyg_ThreadTimer *self = (Cyg_ThreadTimer *)data;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1093 Cyg_Thread *thread = self->thread;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1094
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1095 CYG_INSTRUMENT_THREAD(ALARM, 0, 0);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1096
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1097 Cyg_Scheduler::lock();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1098
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1099 Cyg_Thread::cyg_reason sleep_reason = thread->get_sleep_reason();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1100
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1101 switch( sleep_reason ) {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1102
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1103 case Cyg_Thread::DESTRUCT:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1104 case Cyg_Thread::BREAK:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1105 case Cyg_Thread::EXIT:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1106 case Cyg_Thread::NONE:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1107 case Cyg_Thread::WAIT:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1108 case Cyg_Thread::DONE:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1109 // Do nothing in any of these cases. Most are here to
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1110 // keep the compiler happy.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1111 Cyg_Scheduler::unlock();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1112 CYG_REPORT_RETURN();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1113 return;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1114
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1115 case Cyg_Thread::DELAY:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1116 // The thread was simply delaying, unless it has been
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1117 // woken up for some other reason, wake it now.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1118 thread->set_wake_reason(Cyg_Thread::DONE);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1119 break;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1120
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1121 case Cyg_Thread::TIMEOUT:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1122 // The thread has timed out, set the wake reason to
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1123 // TIMEOUT and restart.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1124 thread->set_wake_reason(Cyg_Thread::TIMEOUT);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1125 break;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1126 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1127
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1128 thread->wake();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1129
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1130 Cyg_Scheduler::unlock();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1131 CYG_REPORT_RETURN();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1132 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1133
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1134 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1135
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1136 // =========================================================================
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1137 // The Idle thread
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1138 // The idle thread is implemented as a single instance of the
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1139 // Cyg_IdleThread class. This is so that it can be initialized before
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1140 // main in a static constructor.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1141
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1142 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1143 // Data definitions
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1144
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1145 // stack
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1146
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1147 #ifdef CYG_HAL_MIPS
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1148 extern char idle_thread_stack[CYGNUM_KERNEL_THREADS_IDLE_STACK_SIZE];
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1149 #else
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1150 char idle_thread_stack[CYGNUM_KERNEL_THREADS_IDLE_STACK_SIZE];
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1151 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1152
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1153 // Loop counter for debugging/housekeeping
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1154 cyg_uint32 idle_thread_loops = 1;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1155
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1156 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1157 // Idle thread code.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1158
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1159 void
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1160 idle_thread_main( CYG_ADDRESS data )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1161 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1162 CYG_REPORT_FUNCTION();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1163
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1164 for(;;)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1165 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1166 idle_thread_loops++;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1167
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1168 HAL_IDLE_THREAD_ACTION(idle_thread_loops);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1169
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1170 #if 0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1171 // For testing, it is useful to be able to fake
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1172 // clock interrupts in the idle thread.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1173
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1174 Cyg_Clock::real_time_clock->tick();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1175 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1176 #ifdef CYGIMP_IDLE_THREAD_YIELD
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1177 // In single priority and non-preemptive systems,
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1178 // the idle thread should yield repeatedly to
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1179 // other threads.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1180 Cyg_Thread::yield();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1181 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1182 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1183 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1184
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1185 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1186 // Idle thread class
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1187
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1188 class Cyg_IdleThread : public Cyg_Thread
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1189 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1190 public:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1191 Cyg_IdleThread(
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1192 cyg_thread_entry *entry, // entry point function
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1193 CYG_ADDRWORD entry_data, // entry data
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1194 cyg_ucount32 stack_size = 0, // stack size, 0 = use default
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1195 CYG_ADDRESS stack_base = 0 // stack base, NULL = allocate
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1196 );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1197
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1198 };
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1199
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1200 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1201 // Idle threads constructor
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1202
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1203 Cyg_IdleThread::Cyg_IdleThread(
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1204 cyg_thread_entry *entry, // entry point function
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1205 CYG_ADDRWORD entry_data, // entry data
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1206 cyg_ucount32 stack_size, // stack size, 0 = use default
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1207 CYG_ADDRESS stack_base // stack base, NULL = allocate
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1208 )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1209 : Cyg_Thread( CYG_THREAD_MIN_PRIORITY,
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1210 entry,
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1211 entry_data,
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1212 "Idle Thread",
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1213 stack_base,
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1214 stack_size)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1215 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1216 CYG_REPORT_FUNCTION();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1217
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1218 resume();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1219 CYG_REPORT_RETURN();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1220 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1221
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1222 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1223 // Instantiate the idle thread
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1224
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1225 Cyg_IdleThread idle_thread CYG_INIT_PRIORITY( IDLE_THREAD ) =
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1226 Cyg_IdleThread( idle_thread_main,
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1227 0,
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1228 CYGNUM_KERNEL_THREADS_IDLE_STACK_SIZE,
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1229 CYG_ADDRESS(idle_thread_stack)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1230 );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1231
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1232
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1233 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1234 // EOF common/thread.cxx