annotate packages/compat/uitron/current/include/uit_func.inl @ 2:443894e2e912 ecos-v1_2_1-release

Block commit of eCos version 1.2.1
author jlarmour
date Tue, 11 May 1999 12:24:34 +0000
parents 3111d98ba7b3
children ece80412419a
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 #ifndef CYGONCE_COMPAT_UITRON_UIT_FUNC_INL
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
2 #define CYGONCE_COMPAT_UITRON_UIT_FUNC_INL
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
3 //===========================================================================
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
4 //
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
5 // uit_func.inl
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
6 //
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
7 // uITRON compatibility functions
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
8 //
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 //####COPYRIGHTBEGIN####
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
11 //
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
12 // -------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
13 // 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
14 // 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
15 // 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
16 // http://sourceware.cygnus.com/ecos
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
17 //
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
18 // Software distributed under the License is distributed on an "AS IS"
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
19 // basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
20 // License for the specific language governing rights and limitations under
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
21 // the License.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
22 //
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
23 // The Original Code is eCos - Embedded Cygnus Operating System, released
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
24 // September 30, 1998.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
25 //
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
26 // The Initial Developer of the Original Code is Cygnus. Portions created
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
27 // by Cygnus are Copyright (C) 1998,1999 Cygnus Solutions. All Rights Reserved.
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
28 // -------------------------------------------
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 //####COPYRIGHTEND####
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
31 //===========================================================================
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
32 //#####DESCRIPTIONBEGIN####
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
33 //
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
34 // Author(s): hmt
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
35 // Contributors: hmt
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
36 // Date: 1998-03-13
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
37 // Purpose: uITRON compatibility functions
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
38 // Description:
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
39 //
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
40 //####DESCRIPTIONEND####
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
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
44 #ifdef CYGPKG_UITRON
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
45
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
46 #ifdef CYGPRI_UITRON_FUNCS_HERE_AND_NOW
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
47
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
48 #include <cyg/compat/uitron/uit_objs.hxx> // uITRON setup CYGNUM_UITRON_SEMAS
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 // kernel facilities only needed here
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
51 #include <cyg/kernel/intr.hxx>
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
52 #include <cyg/kernel/sched.hxx>
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 // and the implementations of other kernel facilities
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
55 #include <cyg/kernel/thread.inl>
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
56 #include <cyg/kernel/sched.inl>
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
57 #include <cyg/kernel/clock.inl>
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
58
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
59
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
60 // ------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
61 // The variable where dis_dsp/ena_dsp state is held:
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
62 extern cyg_uint32 cyg_uitron_dis_dsp_old_priority;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
63
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
64 // ------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
65 // Parameter checking; either check the expression and return an error code
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
66 // if not true, or assert the truth with a made-up message.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
67
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
68 #ifdef CYGSEM_UITRON_BAD_PARAMS_RETURN_ERRORS
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
69 // default: uitron error codes are returned
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
70 #define CYG_UIT_PARAMCHECK( _true_, _error_ ) CYG_MACRO_START \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
71 if ( ! (_true_) ) return (_error_); \
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
72 CYG_MACRO_END
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
73 #else
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
74 // ...but they are asserted if asserts are on
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
75 #define CYG_UIT_PARAMCHECK( _true_, _error_ ) CYG_MACRO_START \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
76 CYG_ASSERT( (_true_), "CYG_UIT_PARAMCHECK fail: " #_true_ ); \
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
77 CYG_MACRO_END
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
78 #endif // else !CYGSEM_UITRON_BAD_PARAMS_RETURN_ERRORS
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
79
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
80 // ------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
81 // CYG_UITRON_CHECK_AND_GETP
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 // Macro to rangecheck and do the addressing of a static uitron system
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
84 // object; _which_ sort of object is given, and token pasting is used
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
85 // horribly to get the static array, limits and the like.
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 // Usage:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
88 // INT snd_msg( ID mbxid, ... ) {
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
89 // Cyg_Mbox *p;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
90 // CYG_UITRON_CHECK_AND_GETP_MBOXES( mbxid, p );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
91 // p->...(...);
0
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 // internal: plain assignment to the object pointer, from static array
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
94 #define CYG_UIT_SPTR( _which_, _idx_, _ptr_ ) CYG_MACRO_START \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
95 (_ptr_) = CYG_UITRON_OBJS( _which_ ) + ((_idx_) - 1); \
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
96 CYG_MACRO_END
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 // internal: plain assignment to the object pointer, from pointer array
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
99 // with error checking.
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
100 #define CYG_UIT_SPTR_PTR( _which_, _idx_, _ptr_ ) CYG_MACRO_START \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
101 (_ptr_) = CYG_UITRON_PTRS( _which_ )[ ((_idx_) - 1) ]; \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
102 if ( NULL == (_ptr_) ) return E_NOEXS; \
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
103 CYG_MACRO_END
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
104
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
105 #define CYG_UITRON_CHECK_AND_GETP_DIRECT( _which_, _idx_, _ptr_ ) \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
106 CYG_MACRO_START \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
107 CYG_UIT_PARAMCHECK( 0 < (_idx_), E_ID ); \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
108 CYG_UIT_PARAMCHECK( CYG_UITRON_NUM( _which_ ) >= (_idx_), E_ID ); \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
109 CYG_UIT_SPTR( _which_, _idx_, _ptr_ ); \
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
110 CYG_MACRO_END
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
111
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
112 #define CYG_UITRON_CHECK_AND_GETP_INDIRECT( _which_, _idx_, _ptr_ ) \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
113 CYG_MACRO_START \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
114 CYG_UIT_PARAMCHECK( 0 < (_idx_), E_ID ); \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
115 CYG_UIT_PARAMCHECK( CYG_UITRON_NUM( _which_ ) >= (_idx_), E_ID ); \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
116 CYG_UIT_SPTR_PTR( _which_, _idx_, _ptr_ ); \
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
117 CYG_MACRO_END
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
118
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
119 // As above but for handler numbers which return E_PAR when out of range
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
120 #define CYG_UITRON_CHECK_AND_GETHDLR( _which_, _num_, _ptr_ ) \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
121 CYG_MACRO_START \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
122 CYG_UIT_PARAMCHECK( 0 < (_num_), E_PAR ); \
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
123 CYG_UIT_PARAMCHECK( CYG_UITRON_NUM( _which_ ) >= (_num_), E_PAR ); \
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
124 CYG_UIT_SPTR( _which_, _num_, _ptr_ ); \
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
125 CYG_MACRO_END
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
126
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
127 // And a macro to check that creation of an object is OK
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
128 #define CYG_UITRON_CHECK_NO_OBJ_LOCK_SCHED( _which_, _idx_ ) \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
129 CYG_MACRO_START \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
130 CYG_UIT_PARAMCHECK( 0 < (_idx_), E_ID ); \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
131 CYG_UIT_PARAMCHECK( CYG_UITRON_NUM( _which_ ) >= (_idx_), E_ID ); \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
132 Cyg_Scheduler::lock(); \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
133 if ( NULL != CYG_UITRON_PTRS( _which_ )[ ((_idx_) - 1) ] ) { \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
134 Cyg_Scheduler::unlock(); \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
135 return E_OBJ; \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
136 } \
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
137 CYG_MACRO_END
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
138
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
139 // define a magic new operator in order to call constructors
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
140 #define CYG_UITRON_NEWFUNCTION( _class_ ) \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
141 inline void *operator new(size_t size, _class_ *ptr) \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
142 { \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
143 CYG_CHECK_DATA_PTR( ptr, "Bad pointer" ); \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
144 return ptr; \
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
145 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
146
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
147 // now configury to support selectable create/delete support ie. an
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
148 // array of pointers to the objects themselves.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
149 #ifdef CYGPKG_UITRON_TASKS_CREATE_DELETE
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
150 #define CYG_UITRON_CHECK_AND_GETP_TASKS( _idx_, _ptr_ ) \
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
151 CYG_UITRON_CHECK_AND_GETP_INDIRECT( TASKS, _idx_, _ptr_ )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
152 #else
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
153 #define CYG_UITRON_CHECK_AND_GETP_TASKS( _idx_, _ptr_ ) \
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
154 CYG_UITRON_CHECK_AND_GETP_DIRECT( TASKS, _idx_, _ptr_ )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
155 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
156
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
157 #ifdef CYGPKG_UITRON_SEMAS_CREATE_DELETE
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
158 #define CYG_UITRON_CHECK_AND_GETP_SEMAS( _idx_, _ptr_ ) \
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
159 CYG_UITRON_CHECK_AND_GETP_INDIRECT( SEMAS, _idx_, _ptr_ )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
160 #else
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
161 #define CYG_UITRON_CHECK_AND_GETP_SEMAS( _idx_, _ptr_ ) \
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
162 CYG_UITRON_CHECK_AND_GETP_DIRECT( SEMAS, _idx_, _ptr_ )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
163 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
164
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
165 #ifdef CYGPKG_UITRON_MBOXES_CREATE_DELETE
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
166 #define CYG_UITRON_CHECK_AND_GETP_MBOXES( _idx_, _ptr_ ) \
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
167 CYG_UITRON_CHECK_AND_GETP_INDIRECT( MBOXES, _idx_, _ptr_ )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
168 #else
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
169 #define CYG_UITRON_CHECK_AND_GETP_MBOXES( _idx_, _ptr_ ) \
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
170 CYG_UITRON_CHECK_AND_GETP_DIRECT( MBOXES, _idx_, _ptr_ )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
171 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
172
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
173 #ifdef CYGPKG_UITRON_FLAGS_CREATE_DELETE
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
174 #define CYG_UITRON_CHECK_AND_GETP_FLAGS( _idx_, _ptr_ ) \
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
175 CYG_UITRON_CHECK_AND_GETP_INDIRECT( FLAGS, _idx_, _ptr_ )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
176 #else
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
177 #define CYG_UITRON_CHECK_AND_GETP_FLAGS( _idx_, _ptr_ ) \
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
178 CYG_UITRON_CHECK_AND_GETP_DIRECT( FLAGS, _idx_, _ptr_ )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
179 #endif
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 #ifdef CYGPKG_UITRON_MEMPOOLFIXED_CREATE_DELETE
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
182 #define CYG_UITRON_CHECK_AND_GETP_MEMPOOLFIXED( _idx_, _ptr_ ) \
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
183 CYG_UITRON_CHECK_AND_GETP_INDIRECT( MEMPOOLFIXED, _idx_, _ptr_ )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
184 #else
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
185 #define CYG_UITRON_CHECK_AND_GETP_MEMPOOLFIXED( _idx_, _ptr_ ) \
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
186 CYG_UITRON_CHECK_AND_GETP_DIRECT( MEMPOOLFIXED, _idx_, _ptr_ )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
187 #endif
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 #ifdef CYGPKG_UITRON_MEMPOOLVAR_CREATE_DELETE
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
190 #define CYG_UITRON_CHECK_AND_GETP_MEMPOOLVAR( _idx_, _ptr_ ) \
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
191 CYG_UITRON_CHECK_AND_GETP_INDIRECT( MEMPOOLVAR, _idx_, _ptr_ )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
192 #else
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
193 #define CYG_UITRON_CHECK_AND_GETP_MEMPOOLVAR( _idx_, _ptr_ ) \
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
194 CYG_UITRON_CHECK_AND_GETP_DIRECT( MEMPOOLVAR, _idx_, _ptr_ )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
195 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
196
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
197 // ------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
198 // Common error checking macros
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
199
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
200 #if !defined( CYGSEM_UITRON_BAD_PARAMS_RETURN_ERRORS ) && \
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
201 !defined( CYGDBG_USE_ASSERTS )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
202 // if not checking and not asserted, these are removed to avoid usused
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
203 // variable warnings.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
204 #define CYG_UITRON_CHECK_TASK_CONTEXT_SELF( _self_ ) CYG_EMPTY_STATEMENT
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
205 #define CYG_UITRON_CHECK_TASK_CONTEXT() CYG_EMPTY_STATEMENT
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
206 #define CYG_UITRON_CHECK_DISPATCH_ENABLED() CYG_EMPTY_STATEMENT
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
207 #define CYG_UITRON_CHECK_DISPATCH_ENABLED_TMO( _tmout_ ) CYG_EMPTY_STATEMENT
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
208
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
209 #else
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
210 // the default:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
211 // Check a task is actually a uITRON task
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
212 #define CYG_UITRON_CHECK_TASK_CONTEXT_SELF( _self_ ) CYG_MACRO_START \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
213 CYG_UIT_PARAMCHECK( \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
214 (&cyg_uitron_TASKS[0] <= (_self_)) && \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
215 ((_self_) < &cyg_uitron_TASKS[CYGNUM_UITRON_TASKS]), \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
216 E_CTX ); \
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
217 CYG_MACRO_END
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
218
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
219 #define CYG_UITRON_CHECK_TASK_CONTEXT() CYG_MACRO_START \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
220 Cyg_Thread *self = Cyg_Thread::self(); \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
221 CYG_UITRON_CHECK_TASK_CONTEXT_SELF( self ); \
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
222 CYG_MACRO_END
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
223
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
224 // Check dispatching is enabled for calls which might wait
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
225 #define CYG_UITRON_CHECK_DISPATCH_ENABLED() CYG_MACRO_START \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
226 CYG_UIT_PARAMCHECK( 0 == cyg_uitron_dis_dsp_old_priority, E_CTX ); \
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
227 CYG_MACRO_END
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
228
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
229 #define CYG_UITRON_CHECK_DISPATCH_ENABLED_TMO(_tmout_) CYG_MACRO_START \
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
230 CYG_UIT_PARAMCHECK( -1 <= (_tmout_), E_PAR ); \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
231 if ( TMO_POL != (_tmout_) ) \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
232 CYG_UITRON_CHECK_DISPATCH_ENABLED(); \
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
233 CYG_MACRO_END
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
234
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
235 #endif
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 #ifdef CYGSEM_UITRON_PARAMS_NULL_IS_GOOD_PTR
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
238 #define CYG_UIT_PARAMCHECK_PTR( _p_ ) CYG_MACRO_START \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
239 CYG_UIT_PARAMCHECK( NADR != (_p_), E_PAR ); \
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
240 CYG_MACRO_END
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
241 #else // do check for NULL
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
242 #define CYG_UIT_PARAMCHECK_PTR( _p_ ) CYG_MACRO_START \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
243 CYG_UIT_PARAMCHECK( NADR != (_p_), E_PAR ); \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
244 CYG_UIT_PARAMCHECK( NULL != (_p_), E_PAR ); \
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
245 CYG_MACRO_END
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
246 #endif // !CYGSEM_UITRON_PARAMS_NULL_IS_GOOD_PTR
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
247
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
248 // ------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
249 // CYG_UITRON_FAIL_RETURN
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
250 //
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
251 // After a call which waits, it might return with success, or due to a
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
252 // timeout or a release wait (a forced escape from the waiting condition).
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
253 // This macro examines context and finds out which, then executes a return
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
254 // with the correct uITRON condition code.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
255
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
256 #define CYG_UITRON_FAIL_RETURN_SELF( _self_ ) CYG_MACRO_START \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
257 Cyg_Thread::cyg_reason reason = (_self_)->get_wake_reason(); \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
258 if ( Cyg_Thread::TIMEOUT == reason ) \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
259 return E_TMOUT; \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
260 if ( Cyg_Thread::BREAK == reason ) \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
261 return E_RLWAI; \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
262 if ( Cyg_Thread::DESTRUCT == reason ) \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
263 return E_DLT; \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
264 return E_SYS; /* if no plausible reason was found */ \
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
265 CYG_MACRO_END
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
266
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
267 #define CYG_UITRON_FAIL_RETURN() CYG_MACRO_START \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
268 Cyg_Thread *self = Cyg_Thread::self(); \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
269 CYG_UITRON_FAIL_RETURN_SELF( self ); \
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
270 CYG_MACRO_END
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
271
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 // Interrupts disabled?
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
274 #define CYG_UITRON_CHECK_CPU_UNLOC() \
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
275 CYG_UIT_PARAMCHECK( (Cyg_Interrupt::interrupts_enabled()), E_CTX )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
276
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
277 // ------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
278 // the function definitions themselves:
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 // ******************************************************
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
281 // *** 6.5 C Language Interfaces ***
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
282 // ******************************************************
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
283
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
284 // - Task Management Functions
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 #ifdef CYGPKG_UITRON_TASKS_CREATE_DELETE
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
287 CYG_UITRON_NEWFUNCTION( Cyg_Thread )
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_UIT_FUNC_INLINE
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
290 ER
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
291 cre_tsk ( ID tskid, T_CTSK *pk_ctsk )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
292 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
293 ER ret = E_OK;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
294 CYG_UIT_PARAMCHECK_PTR( pk_ctsk );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
295 CYG_UITRON_CHECK_NO_OBJ_LOCK_SCHED( TASKS, tskid );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
296
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
297 Cyg_Thread *p = &(CYG_UITRON_OBJS( TASKS )[ tskid - 1 ]);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
298 cyg_uint32 state = p->get_state();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
299 if ( 0 == (state & Cyg_Thread::EXITED) )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
300 ret = E_OBJ; // how did it get to be running?
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
301 else if ( ((INT)p->get_stack_size()) < pk_ctsk->stksz )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
302 ret = E_NOMEM; // more stack requested than available
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
303 else {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
304 CYG_UITRON_PTRS( TASKS )[ tskid - 1 ] =
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
305 new( p ) Cyg_Thread(
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
306 (CYG_ADDRWORD) pk_ctsk->itskpri,
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
307 (cyg_thread_entry *)pk_ctsk->task,
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
308 (CYG_ADDRWORD) 0,
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
309 // preserve the original name and stack:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
310 #ifdef CYGVAR_KERNEL_THREADS_NAME
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
311 p->get_name(),
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
312 #else
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
313 NULL,
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
314 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
315 p->get_stack_base(),
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
316 p->get_stack_size() );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
317 // but ensure the task state is dormant:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
318 // (it is not constructed dormant, but suspended)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
319 p->kill();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
320 // and record the initial priority outside the task too.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
321 CYG_UITRON_TASK_INITIAL_PRIORITY( tskid ) = pk_ctsk->itskpri;
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 Cyg_Scheduler::unlock();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
324 return ret;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
325 }
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 CYG_UIT_FUNC_INLINE
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
328 ER
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
329 del_tsk ( ID tskid )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
330 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
331 Cyg_Thread *p;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
332 ER ret = E_OK;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
333 CYG_UITRON_CHECK_AND_GETP_TASKS( tskid, p );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
334
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
335 Cyg_Scheduler::lock();
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
336 // deal with the race condition here
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
337 if ( p != CYG_UITRON_PTRS( TASKS )[ tskid - 1 ] ) {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
338 Cyg_Scheduler::unlock();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
339 return E_NOEXS;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
340 }
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
341 cyg_uint32 state = p->get_state();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
342 if ( state & Cyg_Thread::EXITED )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
343 // just disconnect the pointer from its object
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
344 CYG_UITRON_PTRS( TASKS )[ tskid - 1 ] = NULL;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
345 else
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
346 ret = E_OBJ;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
347 Cyg_Scheduler::unlock();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
348 return ret;
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 #endif // CYGPKG_UITRON_TASKS_CREATE_DELETE
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 CYG_UIT_FUNC_INLINE
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
353 ER
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
354 sta_tsk ( ID tskid, INT stacd )
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 Cyg_Thread *p;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
357 ER ret = E_OK;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
358 CYG_UITRON_CHECK_AND_GETP_TASKS( tskid, p );
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 Cyg_Scheduler::lock();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
361 cyg_uint32 state = p->get_state();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
362 #ifdef CYGPKG_UITRON_TASKS_CREATE_DELETE
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
363 // there is a race condition with deleting the task
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
364 // so test it now that we have the scheduler locked
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
365 if ( p != CYG_UITRON_PTRS( TASKS )[ tskid - 1 ] )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
366 ret = E_NOEXS;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
367 else // NOTE dangling else to the next line:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
368 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
369 if ( state & Cyg_Thread::EXITED ) {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
370 p->reinitialize();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
371 #ifdef CYGIMP_THREAD_PRIORITY
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
372 p->set_priority( CYG_UITRON_TASK_INITIAL_PRIORITY( tskid ) );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
373 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
374 p->set_entry_data( (CYG_ADDRWORD)stacd );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
375 p->force_resume();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
376 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
377 else
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
378 ret = E_OBJ;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
379 Cyg_Scheduler::unlock();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
380 return ret;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
381 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
382
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
383 CYG_UIT_FUNC_INLINE
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
384 void
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
385 ext_tsk ( void )
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 Cyg_Thread::exit();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
388 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
389
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
390 CYG_UIT_FUNC_INLINE
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
391 void
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
392 exd_tsk ( void )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
393 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
394 #ifdef CYGPKG_UITRON_TASKS_CREATE_DELETE
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
395 Cyg_Thread *p;
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 Cyg_Scheduler::lock();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
398 p = Cyg_Thread::self();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
399 ID tskid = (p - (&cyg_uitron_TASKS[0])) + 1;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
400 // just disconnect the pointer from its object
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
401 CYG_UITRON_PTRS( TASKS )[ tskid - 1 ] = NULL;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
402 // Any associated storage management, and possibly calling the task
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
403 // destructor, is for future versions.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
404 #else
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
405 // do nothing - deletion not supported so just exit...
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
406 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
407 Cyg_Thread::exit();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
408 // does not return, does unlock the scheduler for us
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
409 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
410
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
411 CYG_UIT_FUNC_INLINE
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
412 ER
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
413 ter_tsk ( ID tskid )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
414 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
415 Cyg_Thread *p;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
416 ER ret = E_OK;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
417 CYG_UITRON_CHECK_AND_GETP_TASKS( tskid, p );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
418 CYG_UIT_PARAMCHECK( Cyg_Thread::self() != p, E_OBJ );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
419 Cyg_Scheduler::lock();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
420 if ( (0 != (Cyg_Thread::EXITED & p->get_state())) ||
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
421 (Cyg_Thread::EXIT == p->get_wake_reason()) )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
422 // already dormant
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
423 ret = E_OBJ;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
424 else {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
425 p->force_resume(); // let it run
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
426 p->kill(); // and set prio high so it runs RIGHT NOW!!
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
427 #ifdef CYGIMP_THREAD_PRIORITY
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
428 p->set_priority( (cyg_priority) 0 );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
429 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
430 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
431 Cyg_Scheduler::unlock();
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
432 #ifdef CYGIMP_THREAD_PRIORITY
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
433 if ( (E_OK == ret) && (0 != cyg_uitron_dis_dsp_old_priority) ) {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
434 // then dispatching is disabled, so our prio is 0 too
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
435 Cyg_Thread::yield(); // so let the dying thread run;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
436 Cyg_Thread::yield(); // no cost here of making sure.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
437 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
438 #endif
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
439 return ret;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
440 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
441
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
442 CYG_UIT_FUNC_INLINE
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
443 ER
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
444 dis_dsp ( void )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
445 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
446 CYG_UITRON_CHECK_TASK_CONTEXT();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
447 CYG_UITRON_CHECK_CPU_UNLOC();
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
448 Cyg_Scheduler::lock();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
449 // Prevent preemption by going up to prio 0
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
450 if ( 0 == cyg_uitron_dis_dsp_old_priority ) {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
451 #ifdef CYGIMP_THREAD_PRIORITY
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
452 Cyg_Thread *p = Cyg_Thread::self();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
453 cyg_uitron_dis_dsp_old_priority = p->get_priority();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
454 p->set_priority( 0 );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
455 #else
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
456 cyg_uitron_dis_dsp_old_priority = 1;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
457 #endif
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
458 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
459 Cyg_Scheduler::unlock();
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
460 return E_OK;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
461 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
462
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
463 CYG_UIT_FUNC_INLINE
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
464 ER
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
465 ena_dsp ( void )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
466 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
467 CYG_UITRON_CHECK_TASK_CONTEXT();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
468 CYG_UITRON_CHECK_CPU_UNLOC();
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
469 Cyg_Scheduler::lock();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
470 // Enable dispatching (if disabled) and maybe switch threads
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
471 if ( 0 != cyg_uitron_dis_dsp_old_priority ) {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
472 // We had prevented preemption by going up to prio 0
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
473 #ifdef CYGIMP_THREAD_PRIORITY
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
474 Cyg_Thread *p = Cyg_Thread::self();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
475 p->set_priority( cyg_uitron_dis_dsp_old_priority );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
476 p->to_queue_head(); // to ensure we continue to run
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
477 // if nobody higher pri
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
478 #endif
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
479 cyg_uitron_dis_dsp_old_priority = 0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
480 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
481 Cyg_Scheduler::unlock();
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
482 CYG_UITRON_CHECK_DISPATCH_ENABLED(); // NB: afterwards!
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
483 return E_OK;
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
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 CYG_UIT_FUNC_INLINE
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
488 ER
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
489 chg_pri ( ID tskid, PRI tskpri )
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 Cyg_Thread *p;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
492 ER ret = E_OK;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
493 if ( 0 == tskid ) {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
494 p = Cyg_Thread::self();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
495 CYG_UITRON_CHECK_TASK_CONTEXT_SELF( p );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
496 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
497 else
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
498 CYG_UITRON_CHECK_AND_GETP_TASKS( tskid, p );
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
499
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
500 CYG_UIT_PARAMCHECK( 0 < tskpri, E_PAR );
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
501 #ifdef CYGIMP_THREAD_PRIORITY
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
502 #if CYG_THREAD_MAX_PRIORITY < CYG_THREAD_MIN_PRIORITY
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
503 CYG_UIT_PARAMCHECK( CYG_THREAD_MAX_PRIORITY <= tskpri &&
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
504 tskpri <= CYG_THREAD_MIN_PRIORITY, E_PAR );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
505 #else
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
506 CYG_UIT_PARAMCHECK( CYG_THREAD_MAX_PRIORITY >= tskpri &&
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
507 tskpri >= CYG_THREAD_MIN_PRIORITY, E_PAR );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
508 #endif
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
509 // Handle changing our own prio specially, if dispatch disabled:
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
510 if ( 0 != cyg_uitron_dis_dsp_old_priority ) {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
511 // our actual prio is 0 now and must remain so:
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
512 if ( Cyg_Thread::self() == p ) { // by whichever route p was set
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
513 // set the priority we will return to when dispatch is enabled:
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
514 cyg_uitron_dis_dsp_old_priority = (cyg_uint32)tskpri;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
515 return E_OK;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
516 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
517 }
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
518 Cyg_Scheduler::lock();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
519 if ( (p->get_state() & (Cyg_Thread::EXITED | Cyg_Thread::CREATING)) ||
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
520 (Cyg_Thread::EXIT == p->get_wake_reason()) )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
521 ret = E_OBJ; // task is dormant
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
522 else
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
523 p->set_priority( (cyg_priority)tskpri );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
524 Cyg_Scheduler::unlock();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
525 #endif // CYGIMP_THREAD_PRIORITY got priorities at all?
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
526 return ret;
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
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
529 CYG_UIT_FUNC_INLINE
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
530 ER
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
531 rot_rdq ( PRI tskpri )
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 // zero means our level; easiet way is to yield() the CPU.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
534 if ( 0 == tskpri ) {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
535 Cyg_Thread::yield();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
536 return E_OK;
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 #ifdef CYGIMP_THREAD_PRIORITY
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
539 #if CYG_THREAD_MAX_PRIORITY < CYG_THREAD_MIN_PRIORITY
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
540 CYG_UIT_PARAMCHECK( CYG_THREAD_MAX_PRIORITY <= tskpri &&
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
541 tskpri <= CYG_THREAD_MIN_PRIORITY, E_PAR );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
542 #else
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
543 CYG_UIT_PARAMCHECK( CYG_THREAD_MAX_PRIORITY >= tskpri &&
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
544 tskpri >= CYG_THREAD_MIN_PRIORITY, E_PAR );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
545 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
546 Cyg_Thread::rotate_queue( tskpri );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
547 #endif // CYGIMP_THREAD_PRIORITY got priorities at all?
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
548 return E_OK;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
549 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
550
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
551 CYG_UIT_FUNC_INLINE
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
552 ER
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
553 rel_wai ( ID tskid )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
554 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
555 Cyg_Thread *p;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
556 ER ret = E_OK;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
557 CYG_UITRON_CHECK_AND_GETP_TASKS( tskid, p );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
558 CYG_UIT_PARAMCHECK( Cyg_Thread::self() != p, E_OBJ );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
559 Cyg_Scheduler::lock(); // get an atomic view of the task
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
560 if ( (p->get_state() & (Cyg_Thread::EXITED | Cyg_Thread::CREATING)) ||
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
561 (Cyg_Thread::EXIT == p->get_wake_reason()) )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
562 ret = E_OBJ; // task is dormant
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
563 else {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
564 p->release();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
565 // return E_OBJ if the thread was not sleeping
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
566 if ( Cyg_Thread::BREAK != p->get_wake_reason() )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
567 ret = E_OBJ;
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_Scheduler::unlock();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
570 return ret;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
571 }
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 CYG_UIT_FUNC_INLINE
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
574 ER
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
575 get_tid ( ID *p_tskid )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
576 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
577 Cyg_Thread *self = Cyg_Thread::self();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
578 CYG_UIT_PARAMCHECK_PTR( p_tskid );
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
579 if ( (&cyg_uitron_TASKS[0] <= (self)) &&
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
580 ((self) < &cyg_uitron_TASKS[CYGNUM_UITRON_TASKS]) )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
581 // then I am a uITRON task
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
582 *p_tskid = (self - (&cyg_uitron_TASKS[0])) + 1;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
583 else
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
584 *p_tskid = 0; // Otherwise, non-task portion
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
585 return E_OK;
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
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
588 CYG_UIT_FUNC_INLINE
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
589 ER
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
590 ref_tsk ( T_RTSK *pk_rtsk, ID tskid )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
591 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
592 Cyg_Thread *p;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
593 if ( 0 == tskid ) {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
594 p = Cyg_Thread::self();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
595 CYG_UITRON_CHECK_TASK_CONTEXT_SELF( p );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
596 tskid = (p - (&cyg_uitron_TASKS[0])) + 1; // it gets used below
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
597 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
598 else
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
599 CYG_UITRON_CHECK_AND_GETP_TASKS( tskid, p );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
600
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
601 CYG_UIT_PARAMCHECK_PTR( pk_rtsk );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
602 pk_rtsk->exinf = NADR;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
603 Cyg_Scheduler::lock(); // get an atomic view of the task
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
604 cyg_uint32 state = p->get_state();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
605 if ( (state & (Cyg_Thread::EXITED | Cyg_Thread::CREATING)) ||
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
606 (Cyg_Thread::EXIT == p->get_wake_reason()) )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
607 pk_rtsk->tskstat = TTS_DMT;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
608 else if ( state == Cyg_Thread::RUNNING )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
609 // If it's us, it's running, else it's ready
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
610 pk_rtsk->tskstat = (Cyg_Thread::self() == p)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
611 ? TTS_RUN // RUN state (we are it)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
612 : TTS_RDY; // READY state
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
613 else if ( state & Cyg_Thread::SUSPENDED )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
614 pk_rtsk->tskstat =
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
615 (state & (Cyg_Thread::COUNTSLEEP | Cyg_Thread::SLEEPING))
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
616 ? TTS_WAS // WAIT-SUSPEND state
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
617 : TTS_SUS; // SUSPEND state
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
618 else
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
619 pk_rtsk->tskstat =
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
620 (state & (Cyg_Thread::COUNTSLEEP | Cyg_Thread::SLEEPING))
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
621 ? TTS_WAI // WAIT state
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
622 : 0; // Not sure what's happening here!
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
623 #ifdef CYGIMP_THREAD_PRIORITY
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
624 if ( TTS_DMT == pk_rtsk->tskstat )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
625 pk_rtsk->tskpri = CYG_UITRON_TASK_INITIAL_PRIORITY( tskid );
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
626 else if ( (TTS_RUN == pk_rtsk->tskstat) &&
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
627 (0 != cyg_uitron_dis_dsp_old_priority) )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
628 // then we are it and dispatching is disabled, so
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
629 // report our "real" priority - it is 0 in the kernel at the moment
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
630 pk_rtsk->tskpri = cyg_uitron_dis_dsp_old_priority;
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
631 else
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
632 pk_rtsk->tskpri = p->get_priority();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
633 #else
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
634 pk_rtsk->tskpri = -1; // Not applicable
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
635 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
636 Cyg_Scheduler::unlock();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
637 return E_OK;
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
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
640 // - Task-Dependent Synchronization Functions
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
641
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
642 CYG_UIT_FUNC_INLINE
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
643 ER
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
644 sus_tsk ( ID tskid )
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 Cyg_Thread *p;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
647 ER ret = E_OK;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
648 CYG_UITRON_CHECK_AND_GETP_TASKS( tskid, p );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
649 CYG_UIT_PARAMCHECK( Cyg_Thread::self() != p, E_OBJ );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
650 Cyg_Scheduler::lock(); // get an atomic view of the task
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
651 if ( (p->get_state() & (Cyg_Thread::EXITED | Cyg_Thread::CREATING)) ||
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
652 (Cyg_Thread::EXIT == p->get_wake_reason()) )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
653 ret = E_OBJ; // task is dormant
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
654 else
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
655 p->suspend();
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 return ret;
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 CYG_UIT_FUNC_INLINE
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
661 ER
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
662 rsm_tsk ( ID tskid )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
663 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
664 Cyg_Thread *p;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
665 ER ret = E_OK;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
666 CYG_UITRON_CHECK_AND_GETP_TASKS( tskid, p );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
667 CYG_UIT_PARAMCHECK( Cyg_Thread::self() != p, E_OBJ );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
668 Cyg_Scheduler::lock(); // get an atomic view of the task
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
669 cyg_uint32 state = p->get_state();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
670 if ( 0 == (Cyg_Thread::SUSPENDED & state) )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
671 ret = E_OBJ; // thread is not suspended
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
672 else
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
673 p->resume();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
674 Cyg_Scheduler::unlock();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
675 return ret;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
676 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
677
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
678 CYG_UIT_FUNC_INLINE
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
679 ER
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
680 frsm_tsk ( ID tskid )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
681 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
682 Cyg_Thread *p;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
683 ER ret = E_OK;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
684 CYG_UITRON_CHECK_AND_GETP_TASKS( tskid, p );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
685 CYG_UIT_PARAMCHECK( Cyg_Thread::self() != p, E_OBJ );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
686 Cyg_Scheduler::lock(); // get an atomic view of the task
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
687 cyg_uint32 state = p->get_state();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
688 if ( 0 == (Cyg_Thread::SUSPENDED & state) )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
689 ret = E_OBJ; // thread is not suspended
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
690 else
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
691 p->force_resume();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
692 Cyg_Scheduler::unlock();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
693 return ret;
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
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
696 CYG_UIT_FUNC_INLINE
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
697 ER
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
698 slp_tsk ( void )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
699 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
700 Cyg_Thread *self = Cyg_Thread::self();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
701 CYG_UITRON_CHECK_TASK_CONTEXT_SELF( self );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
702 CYG_UITRON_CHECK_DISPATCH_ENABLED();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
703 // do this now for the case when no sleeping actually occurs
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
704 self->set_wake_reason( Cyg_Thread::DONE );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
705 Cyg_Thread::counted_sleep();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
706 if ( Cyg_Thread::DONE != self->get_wake_reason() )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
707 CYG_UITRON_FAIL_RETURN_SELF( self );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
708 return E_OK;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
709 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
710
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
711 #ifdef CYGFUN_KERNEL_THREADS_TIMER
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
712 CYG_UIT_FUNC_INLINE
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
713 ER
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
714 tslp_tsk ( TMO tmout )
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 Cyg_Thread *self = Cyg_Thread::self();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
717 CYG_UITRON_CHECK_TASK_CONTEXT_SELF( self );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
718 CYG_UIT_PARAMCHECK( -1 <= tmout, E_PAR );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
719 CYG_UITRON_CHECK_DISPATCH_ENABLED();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
720 // do this now for the case when no sleeping actually occurs
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
721 self->set_wake_reason( Cyg_Thread::DONE );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
722 // note that TMO_POL is not treated specially, though it
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
723 // happens to work almost as a poll (some sleeping may occur)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
724 if ( TMO_FEVR == tmout )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
725 Cyg_Thread::counted_sleep();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
726 else
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
727 Cyg_Thread::counted_sleep( (cyg_tick_count)tmout );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
728 if ( Cyg_Thread::DONE != self->get_wake_reason() )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
729 CYG_UITRON_FAIL_RETURN_SELF( self );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
730 return E_OK;
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 #endif // CYGFUN_KERNEL_THREADS_TIMER
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
733
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
734 CYG_UIT_FUNC_INLINE
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
735 ER
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
736 wup_tsk ( ID tskid )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
737 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
738 Cyg_Thread *p;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
739 ER ret = E_OK;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
740 CYG_UITRON_CHECK_AND_GETP_TASKS( tskid, p );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
741 CYG_UIT_PARAMCHECK( Cyg_Thread::self() != p, E_OBJ );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
742 Cyg_Scheduler::lock(); // get an atomic view of the task
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
743 if ( (p->get_state() & (Cyg_Thread::EXITED | Cyg_Thread::CREATING)) ||
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
744 (Cyg_Thread::EXIT == p->get_wake_reason()) )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
745 ret = E_OBJ; // task is dormant
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
746 else
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
747 p->counted_wake();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
748 Cyg_Scheduler::unlock();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
749 return ret;
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 CYG_UIT_FUNC_INLINE
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
753 ER
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
754 can_wup ( INT *p_wupcnt, ID tskid )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
755 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
756 Cyg_Thread *p;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
757 ER ret = E_OK;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
758 if ( 0 == tskid ) {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
759 p = Cyg_Thread::self();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
760 CYG_UITRON_CHECK_TASK_CONTEXT_SELF( p );
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 else
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
763 CYG_UITRON_CHECK_AND_GETP_TASKS( tskid, p );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
764 CYG_UIT_PARAMCHECK_PTR( p_wupcnt );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
765 Cyg_Scheduler::lock(); // get an atomic view of the task
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
766 if ( (p->get_state() & (Cyg_Thread::EXITED | Cyg_Thread::CREATING)) ||
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
767 (Cyg_Thread::EXIT == p->get_wake_reason()) )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
768 ret = E_OBJ; // task is dormant
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
769 else {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
770 cyg_uint32 result = p->cancel_counted_wake();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
771 *p_wupcnt = result;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
772 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
773 Cyg_Scheduler::unlock();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
774 return ret;
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 // - Synchronization and Communication Functions
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
778
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
779 #ifdef CYGPKG_UITRON_SEMAS
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
780 #if 0 < CYG_UITRON_NUM( SEMAS )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
781
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
782 #ifdef CYGPKG_UITRON_SEMAS_CREATE_DELETE
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
783
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
784 CYG_UITRON_NEWFUNCTION( Cyg_Counting_Semaphore2 )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
785
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
786 CYG_UIT_FUNC_INLINE
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
787 ER
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
788 cre_sem ( ID semid, T_CSEM *pk_csem )
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 ER ret = E_OK;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
791 CYG_UIT_PARAMCHECK_PTR( pk_csem );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
792 CYG_UITRON_CHECK_NO_OBJ_LOCK_SCHED( SEMAS, semid );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
793 if ( TA_TFIFO != pk_csem->sematr )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
794 ret = E_RSATR;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
795 else
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
796 CYG_UITRON_PTRS( SEMAS )[ semid - 1 ] =
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
797 new( &(CYG_UITRON_OBJS( SEMAS )[ semid - 1 ]) )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
798 Cyg_Counting_Semaphore2( (cyg_count32)pk_csem->isemcnt );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
799 Cyg_Scheduler::unlock();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
800 return ret;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
801 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
802
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
803 CYG_UIT_FUNC_INLINE
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
804 ER
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
805 del_sem ( ID semid )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
806 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
807 Cyg_Counting_Semaphore2 *p;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
808 CYG_UITRON_CHECK_AND_GETP_SEMAS( semid, p );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
809 Cyg_Scheduler::lock();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
810 // deal with the race condition here
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
811 if ( p != CYG_UITRON_PTRS( SEMAS )[ semid - 1 ] ) {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
812 Cyg_Scheduler::unlock();
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
813 return E_NOEXS;
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
814 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
815 CYG_UITRON_PTRS( SEMAS )[ semid - 1 ] = NULL;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
816 p->~Cyg_Counting_Semaphore2();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
817 Cyg_Scheduler::unlock();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
818 return E_OK;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
819 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
820 #endif // CYGPKG_UITRON_SEMAS_CREATE_DELETE
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
821
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
822 CYG_UIT_FUNC_INLINE
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
823 ER
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
824 sig_sem( ID semid )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
825 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
826 Cyg_Counting_Semaphore2 *p;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
827 CYG_UITRON_CHECK_AND_GETP_SEMAS( semid, p );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
828 p->post();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
829 return E_OK;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
830 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
831
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
832 CYG_UIT_FUNC_INLINE
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
833 ER
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
834 wai_sem( ID semid )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
835 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
836 Cyg_Counting_Semaphore2 *p;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
837 CYG_UITRON_CHECK_AND_GETP_SEMAS( semid, p );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
838 CYG_UITRON_CHECK_DISPATCH_ENABLED();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
839 cyg_bool result = p->wait();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
840 if ( !result )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
841 CYG_UITRON_FAIL_RETURN();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
842 return E_OK;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
843 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
844
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
845 CYG_UIT_FUNC_INLINE
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
846 ER
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
847 preq_sem ( ID semid )
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 Cyg_Counting_Semaphore2 *p;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
850 CYG_UITRON_CHECK_AND_GETP_SEMAS( semid, p );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
851 cyg_bool result = p->trywait();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
852 if ( !result )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
853 return E_TMOUT;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
854 return E_OK;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
855 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
856
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
857 #ifdef CYGFUN_KERNEL_THREADS_TIMER
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
858 CYG_UIT_FUNC_INLINE
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
859 ER
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
860 twai_sem ( ID semid, TMO tmout )
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_Counting_Semaphore2 *p;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
863 CYG_UITRON_CHECK_AND_GETP_SEMAS( semid, p );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
864 CYG_UITRON_CHECK_DISPATCH_ENABLED_TMO( tmout );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
865 // do this now for the case when no sleeping actually occurs
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
866 Cyg_Thread *self = Cyg_Thread::self();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
867 self->set_wake_reason( Cyg_Thread::TIMEOUT );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
868 cyg_bool result;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
869 if ( TMO_FEVR == tmout )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
870 result = p->wait();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
871 else if ( TMO_POL == tmout )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
872 result = p->trywait();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
873 else
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
874 result = p->wait(
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
875 Cyg_Clock::real_time_clock->current_value() +
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
876 (cyg_tick_count)tmout );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
877 if ( ! result )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
878 CYG_UITRON_FAIL_RETURN_SELF( self );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
879 return E_OK;
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 #endif // CYGFUN_KERNEL_THREADS_TIMER
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
883
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
884 CYG_UIT_FUNC_INLINE
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
885 ER
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
886 ref_sem ( T_RSEM *pk_rsem, ID semid )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
887 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
888 Cyg_Counting_Semaphore2 *p;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
889 CYG_UITRON_CHECK_AND_GETP_SEMAS( semid, p );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
890 CYG_UIT_PARAMCHECK_PTR( pk_rsem );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
891 pk_rsem->exinf = NADR;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
892 pk_rsem->wtsk = p->waiting();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
893 pk_rsem->semcnt = p->peek();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
894 return E_OK;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
895 }
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 #endif // 0 < CYG_UITRON_NUM( SEMAS )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
898 #endif // CYGPKG_UITRON_SEMAS
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
899
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
900 #ifdef CYGPKG_UITRON_FLAGS
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
901 #if 0 < CYG_UITRON_NUM( FLAGS )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
902
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
903 #ifdef CYGPKG_UITRON_FLAGS_CREATE_DELETE
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 CYG_UITRON_NEWFUNCTION( Cyg_Flag )
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 CYG_UIT_FUNC_INLINE
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
908 ER
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
909 cre_flg ( ID flgid, T_CFLG *pk_cflg )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
910 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
911 ER ret = E_OK;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
912 CYG_UIT_PARAMCHECK_PTR( pk_cflg );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
913 CYG_UITRON_CHECK_NO_OBJ_LOCK_SCHED( FLAGS, flgid );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
914 if ( 0 != ((~(TA_WMUL | TA_WSGL)) & pk_cflg->flgatr) )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
915 ret = E_RSATR;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
916 else
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
917 CYG_UITRON_PTRS( FLAGS )[ flgid - 1 ] =
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
918 new( &(CYG_UITRON_OBJS( FLAGS )[ flgid - 1 ]) )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
919 Cyg_Flag( (Cyg_FlagValue) pk_cflg->iflgptn );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
920 Cyg_Scheduler::unlock();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
921 return ret;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
922 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
923
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
924 CYG_UIT_FUNC_INLINE
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
925 ER
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
926 del_flg ( ID flgid )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
927 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
928 Cyg_Flag *p;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
929 CYG_UITRON_CHECK_AND_GETP_FLAGS( flgid, p );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
930 Cyg_Scheduler::lock();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
931 // deal with the race condition here
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
932 if ( p != CYG_UITRON_PTRS( FLAGS )[ flgid - 1 ] ) {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
933 Cyg_Scheduler::unlock();
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
934 return E_NOEXS;
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
935 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
936 CYG_UITRON_PTRS( FLAGS )[ flgid - 1 ] = NULL;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
937 p->~Cyg_Flag();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
938 Cyg_Scheduler::unlock();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
939 return E_OK;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
940 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
941 #endif // CYGPKG_UITRON_FLAGS_CREATE_DELETE
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
942
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
943 CYG_UIT_FUNC_INLINE
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
944 ER
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
945 set_flg ( ID flgid, UINT setptn )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
946 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
947 Cyg_Flag *p;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
948 CYG_UITRON_CHECK_AND_GETP_FLAGS( flgid, p );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
949 p->setbits( setptn );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
950 return E_OK;
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 CYG_UIT_FUNC_INLINE
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
954 ER
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
955 clr_flg ( ID flgid, UINT clrptn )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
956 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
957 Cyg_Flag *p;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
958 CYG_UITRON_CHECK_AND_GETP_FLAGS( flgid, p );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
959 p->maskbits( clrptn );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
960 return E_OK;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
961 }
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_UIT_FUNC_INLINE
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
964 ER
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
965 wai_flg ( UINT *p_flgptn, ID flgid, UINT waiptn, UINT wfmode )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
966 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
967 Cyg_Flag *p;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
968 CYG_UITRON_CHECK_AND_GETP_FLAGS( flgid, p );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
969 CYG_UIT_PARAMCHECK_PTR( p_flgptn );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
970 CYG_UIT_PARAMCHECK( 0 == (wfmode & ~Cyg_Flag::MASK), E_PAR );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
971 CYG_UIT_PARAMCHECK( 0 != waiptn, E_PAR );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
972 CYG_UITRON_CHECK_DISPATCH_ENABLED();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
973 // check we can use the wfmode value unchanged
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
974 CYG_ASSERT( Cyg_Flag::AND == TWF_ANDW, "Flag AND value bad" );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
975 CYG_ASSERT( Cyg_Flag::OR == TWF_ORW, "Flag OR value bad" );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
976 CYG_ASSERT( Cyg_Flag::CLR == TWF_CLR, "Flag CLR value bad" );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
977
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
978 UINT result = p->wait( waiptn, wfmode );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
979 if ( ! result )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
980 CYG_UITRON_FAIL_RETURN();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
981 *p_flgptn = result;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
982 return E_OK;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
983 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
984
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
985 CYG_UIT_FUNC_INLINE
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
986 ER
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
987 pol_flg ( UINT *p_flgptn, ID flgid, UINT waiptn, UINT wfmode )
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 Cyg_Flag *p;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
990 CYG_UITRON_CHECK_AND_GETP_FLAGS( flgid, p );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
991 CYG_UIT_PARAMCHECK_PTR( p_flgptn );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
992 CYG_UIT_PARAMCHECK( 0 == (wfmode & ~Cyg_Flag::MASK), E_PAR );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
993 CYG_UIT_PARAMCHECK( 0 != waiptn, E_PAR );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
994 // check we can use the wfmode value unchanged
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
995 CYG_ASSERT( Cyg_Flag::AND == TWF_ANDW, "Flag AND value bad" );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
996 CYG_ASSERT( Cyg_Flag::OR == TWF_ORW, "Flag OR value bad" );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
997 CYG_ASSERT( Cyg_Flag::CLR == TWF_CLR, "Flag CLR value bad" );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
998
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
999 UINT result = p->poll( waiptn, wfmode );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1000 if ( ! result )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1001 return E_TMOUT;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1002 *p_flgptn = result;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1003 return E_OK;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1004 }
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 #ifdef CYGFUN_KERNEL_THREADS_TIMER
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1007 CYG_UIT_FUNC_INLINE
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1008 ER
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1009 twai_flg ( UINT *p_flgptn, ID flgid, UINT waiptn, UINT wfmode,
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1010 TMO tmout )
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 Cyg_Flag *p;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1013 CYG_UITRON_CHECK_AND_GETP_FLAGS( flgid, p );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1014 CYG_UIT_PARAMCHECK_PTR( p_flgptn );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1015 CYG_UIT_PARAMCHECK( 0 == (wfmode & ~Cyg_Flag::MASK), E_PAR );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1016 CYG_UIT_PARAMCHECK( 0 != waiptn, E_PAR );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1017 CYG_UITRON_CHECK_DISPATCH_ENABLED_TMO( tmout );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1018 // check we can use the wfmode value unchanged
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1019 CYG_ASSERT( Cyg_Flag::AND == TWF_ANDW, "Flag AND value bad" );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1020 CYG_ASSERT( Cyg_Flag::OR == TWF_ORW, "Flag OR value bad" );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1021 CYG_ASSERT( Cyg_Flag::CLR == TWF_CLR, "Flag CLR value bad" );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1022
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1023 // do this now for the case when no sleeping actually occurs
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1024 Cyg_Thread *self = Cyg_Thread::self();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1025 self->set_wake_reason( Cyg_Thread::TIMEOUT );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1026 UINT result;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1027 if ( TMO_FEVR == tmout )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1028 result = p->wait( waiptn, wfmode );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1029 else if ( TMO_POL == tmout )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1030 result = p->poll( waiptn, wfmode );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1031 else
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1032 result = p->wait( waiptn, wfmode,
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1033 Cyg_Clock::real_time_clock->current_value() +
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1034 (cyg_tick_count)tmout );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1035 if ( ! result )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1036 CYG_UITRON_FAIL_RETURN_SELF( self );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1037 *p_flgptn = result;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1038 return E_OK;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1039 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1040 #endif // CYGFUN_KERNEL_THREADS_TIMER
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1041
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1042 CYG_UIT_FUNC_INLINE
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1043 ER
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1044 ref_flg ( T_RFLG *pk_rflg, ID flgid )
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_Flag *p;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1047 CYG_UITRON_CHECK_AND_GETP_FLAGS( flgid, p );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1048 CYG_UIT_PARAMCHECK_PTR( pk_rflg );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1049 pk_rflg->exinf = NADR;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1050 pk_rflg->wtsk = p->waiting();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1051 pk_rflg->flgptn = p->peek();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1052 return E_OK;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1053 }
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 #endif // 0 < CYG_UITRON_NUM( FLAGS )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1056 #endif // CYGPKG_UITRON_FLAGS
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 #ifdef CYGPKG_UITRON_MBOXES
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1059 #if 0 < CYG_UITRON_NUM( MBOXES )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1060
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1061 #ifdef CYGPKG_UITRON_MBOXES_CREATE_DELETE
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1062 CYG_UITRON_NEWFUNCTION( Cyg_Mbox )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1063
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1064 CYG_UIT_FUNC_INLINE
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1065 ER
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1066 cre_mbx ( ID mbxid, T_CMBX* pk_cmbx )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1067 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1068 ER ret = E_OK;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1069 CYG_UIT_PARAMCHECK_PTR( pk_cmbx );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1070 CYG_UITRON_CHECK_NO_OBJ_LOCK_SCHED( MBOXES, mbxid );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1071 if ( ((ATR)(TA_TFIFO + TA_MFIFO)) != pk_cmbx->mbxatr )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1072 ret = E_RSATR;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1073 else
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1074 CYG_UITRON_PTRS( MBOXES )[ mbxid - 1 ] =
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1075 new( &(CYG_UITRON_OBJS( MBOXES )[ mbxid - 1 ]) )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1076 Cyg_Mbox();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1077 Cyg_Scheduler::unlock();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1078 return ret;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1079 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1080
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1081 CYG_UIT_FUNC_INLINE
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1082 ER
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1083 del_mbx ( ID mbxid )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1084 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1085 Cyg_Mbox *p;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1086 CYG_UITRON_CHECK_AND_GETP_MBOXES( mbxid, p );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1087 Cyg_Scheduler::lock();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1088 // deal with the race condition here
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1089 if ( p != CYG_UITRON_PTRS( MBOXES )[ mbxid - 1 ] ) {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1090 Cyg_Scheduler::unlock();
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1091 return E_NOEXS;
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1092 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1093 CYG_UITRON_PTRS( MBOXES )[ mbxid - 1 ] = NULL;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1094 p->~Cyg_Mbox();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1095 Cyg_Scheduler::unlock();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1096 return E_OK;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1097 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1098 #endif // CYGPKG_UITRON_MBOXES_CREATE_DELETE
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1099
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1100 // This bit of unpleasantness is to allow uITRON programs to send a NULL
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1101 // message - if permitted by the parameter checking.
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 // NULL is used internally to mean no message; but -1 is fine. So we send
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1104 // a NULL as a NADR and if we see a NULL coming back, change it to a NADR.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1105 //
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1106 // One hopes that often this will be optimized out, since the one or both
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1107 // of these being true has been detected and errored out just above.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1108
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1109 #ifdef CYGSEM_UITRON_PARAMS_NULL_IS_GOOD_PTR
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1110 // represent a NULL as NADR internally
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1111 #define CYG_UIT_TMSG_FIXUP_IN( _p_ ) CYG_MACRO_START \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1112 if ( NULL == (_p_) ) \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1113 (_p_) = (T_MSG *)NADR; \
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1114 CYG_MACRO_END
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1115
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1116 // we get a NADR back sometimes, meaning NULL
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1117 #define CYG_UIT_TMSG_FIXUP_OUT( _p_ ) CYG_MACRO_START \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1118 if ( NADR == (_p_) ) \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1119 (_p_) = (T_MSG *)NULL; \
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1120 CYG_MACRO_END
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1121
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1122 #else
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1123 // NULL is checked for and makes an error
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1124 #define CYG_UIT_TMSG_FIXUP_IN( _p_ ) CYG_EMPTY_STATEMENT
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1125 #define CYG_UIT_TMSG_FIXUP_OUT( _p_ ) CYG_EMPTY_STATEMENT
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1126 #endif
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 // and sometimes either in status enquiries
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1129 #define CYG_UIT_TMSG_FIXUP_ALL( _p_ ) CYG_MACRO_START \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1130 if ( NULL == (_p_) ) \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1131 (_p_) = (T_MSG *)NADR; \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1132 else if ( NADR == (_p_) ) \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1133 (_p_) = (T_MSG *)NULL; \
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1134 CYG_MACRO_END
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 CYG_UIT_FUNC_INLINE
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1137 ER
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1138 snd_msg ( ID mbxid, T_MSG *pk_msg )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1139 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1140 Cyg_Mbox *p;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1141 CYG_UITRON_CHECK_AND_GETP_MBOXES( mbxid, p );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1142 CYG_UIT_PARAMCHECK_PTR( pk_msg );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1143 CYG_UIT_TMSG_FIXUP_IN( pk_msg );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1144 cyg_bool result = p->tryput( (void *)pk_msg );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1145 if ( ! result )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1146 return E_QOVR;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1147 return E_OK;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1148 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1149
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1150
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1151 CYG_UIT_FUNC_INLINE
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1152 ER
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1153 rcv_msg ( T_MSG **ppk_msg, ID mbxid )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1154 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1155 Cyg_Mbox *p;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1156 CYG_UITRON_CHECK_AND_GETP_MBOXES( mbxid, p );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1157 CYG_UIT_PARAMCHECK_PTR( ppk_msg );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1158 CYG_UITRON_CHECK_DISPATCH_ENABLED();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1159 T_MSG *result = (T_MSG *)p->get();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1160 if ( ! result )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1161 CYG_UITRON_FAIL_RETURN();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1162 CYG_UIT_TMSG_FIXUP_OUT( result );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1163 *ppk_msg = result;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1164 return E_OK;
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
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1167 CYG_UIT_FUNC_INLINE
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1168 ER
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1169 prcv_msg ( T_MSG **ppk_msg, ID mbxid )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1170 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1171 Cyg_Mbox *p;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1172 CYG_UITRON_CHECK_AND_GETP_MBOXES( mbxid, p );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1173 CYG_UIT_PARAMCHECK_PTR( ppk_msg );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1174 T_MSG *result = (T_MSG *)p->tryget();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1175 if ( ! result )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1176 return E_TMOUT;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1177 CYG_UIT_TMSG_FIXUP_OUT( result );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1178 *ppk_msg = result;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1179 return E_OK;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1180 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1181
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1182 #ifdef CYGFUN_KERNEL_THREADS_TIMER
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1183 CYG_UIT_FUNC_INLINE
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1184 ER
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1185 trcv_msg ( T_MSG **ppk_msg, ID mbxid, TMO tmout )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1186 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1187 Cyg_Mbox *p;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1188 CYG_UITRON_CHECK_AND_GETP_MBOXES( mbxid, p );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1189 CYG_UIT_PARAMCHECK_PTR( ppk_msg );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1190 CYG_UITRON_CHECK_DISPATCH_ENABLED_TMO( tmout );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1191 // do this now for the case when no sleeping actually occurs
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1192 Cyg_Thread *self = Cyg_Thread::self();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1193 self->set_wake_reason( Cyg_Thread::TIMEOUT );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1194 T_MSG *result;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1195 if ( TMO_FEVR == tmout )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1196 result = (T_MSG *)p->get();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1197 else if ( TMO_POL == tmout )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1198 result = (T_MSG *)p->tryget();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1199 else
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1200 result = (T_MSG *)p->get(
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1201 Cyg_Clock::real_time_clock->current_value() +
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1202 (cyg_tick_count)tmout );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1203 if ( ! result )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1204 CYG_UITRON_FAIL_RETURN_SELF( self );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1205 CYG_UIT_TMSG_FIXUP_OUT( result );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1206 *ppk_msg = result;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1207 return E_OK;
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 #endif // CYGFUN_KERNEL_THREADS_TIMER
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1210
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1211 CYG_UIT_FUNC_INLINE
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1212 ER
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1213 ref_mbx ( T_RMBX *pk_rmbx, ID mbxid )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1214 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1215 Cyg_Mbox *p;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1216 CYG_UITRON_CHECK_AND_GETP_MBOXES( mbxid, p );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1217 CYG_UIT_PARAMCHECK_PTR( pk_rmbx );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1218 pk_rmbx->exinf = NADR;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1219 pk_rmbx->wtsk = p->waiting_to_get();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1220 pk_rmbx->pk_msg = (T_MSG *)p->peek_item();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1221 CYG_UIT_TMSG_FIXUP_ALL( pk_rmbx->pk_msg );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1222 return E_OK;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1223 }
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 #undef CYG_UIT_TMSG_FIXUP_IN
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1226 #undef CYG_UIT_TMSG_FIXUP_OUT
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1227 #undef CYG_UIT_TMSG_FIXUP_ALL
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1228
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1229 #endif // 0 < CYG_UITRON_NUM( MBOXES )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1230 #endif // CYGPKG_UITRON_MBOXES
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 // - Extended Synchronization and Communication Functions
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 #if 0 // NOT SUPPORTED
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1235 ER cre_mbf ( ID mbfid, T_CMBF *pk_cmbf );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1236 ER del_mbf ( ID mbfid );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1237 ER snd_mbf ( ID mbfid, VP msg, INT msgsz );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1238 ER psnd_mbf ( ID mbfid, VP msg, INT msgsz );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1239 ER tsnd_mbf ( ID mbfid, VP msg, INT msgsz, TMO tmout );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1240 ER rcv_mbf ( VP msg, INT *p_msgsz, ID mbfid );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1241 ER prcv_mbf ( VP msg, INT *p_msgsz, ID mbfid );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1242 ER trcv_mbf ( VP msg, INT *p_msgsz, ID mbfid, TMO tmout );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1243 ER ref_mbf ( T_RMBF *pk_rmbf, ID mbfid );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1244 ER cre_por ( ID porid, T_CPOR *pk_cpor );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1245 ER del_por ( ID porid );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1246 ER cal_por ( VP msg, INT *p_rmsgsz, ID porid, UINT calptn, INT
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1247 cmsgsz );
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1248 ER pcal_por ( VP msg, INT *p_rmsgsz, ID porid, UINT calptn, INT
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1249 cmsgsz );
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1250 ER tcal_por ( VP msg, INT *p_rmsgsz, ID porid, UINT calptn, INT
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1251 cmsgsz, TMO tmout );
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1252 ER acp_por ( RNO *p_rdvno, VP msg, INT *p_cmsgsz, ID porid, UINT
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1253 acpptn );
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1254 ER pacp_por ( RNO *p_rdvno, VP msg, INT *p_cmsgsz, ID porid, UINT
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1255 acpptn );
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1256 ER tacp_por ( RNO *p_rdvno, VP msg, INT *p_cmsgsz, ID porid, UINT
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1257 acpptn, TMO tmout );
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1258 ER fwd_por ( ID porid, UINT calptn, RNO rdvno, VP msg, INT cmsgsz
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1259 );
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1260 ER rpl_rdv ( RNO rdvno, VP msg, INT rmsgsz );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1261 ER ref_por ( T_RPOR *pk_rpor, ID porid );
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1262 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1263
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1264 // - Interrupt Management Functions
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1265
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1266 #if 0 // NOT SUPPORTED
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1267 ER def_int ( UINT dintno, T_DINT *pk_dint );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1268 void ret_wup ( ID tskid );
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1269 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1270
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1271 CYG_UIT_FUNC_INLINE
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1272 ER
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1273 loc_cpu ( void )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1274 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1275 CYG_UITRON_CHECK_TASK_CONTEXT();
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1276 Cyg_Scheduler::lock();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1277 // Prevent preemption by going up to prio 0
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1278 if ( 0 == cyg_uitron_dis_dsp_old_priority ) {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1279 #ifdef CYGIMP_THREAD_PRIORITY
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1280 Cyg_Thread *p = Cyg_Thread::self();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1281 cyg_uitron_dis_dsp_old_priority = p->get_priority();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1282 p->set_priority( 0 );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1283 #else
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1284 cyg_uitron_dis_dsp_old_priority = 1;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1285 #endif
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1286 }
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1287 Cyg_Interrupt::disable_interrupts();
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1288 Cyg_Scheduler::unlock();
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1289 return E_OK;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1290 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1291
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1292 CYG_UIT_FUNC_INLINE
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1293 ER
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1294 unl_cpu ( void )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1295 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1296 CYG_UITRON_CHECK_TASK_CONTEXT();
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1297 Cyg_Scheduler::lock();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1298 // Enable dispatching (if disabled) and maybe switch threads
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1299 if ( 0 != cyg_uitron_dis_dsp_old_priority ) {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1300 // We had prevented preemption by going up to prio 0
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1301 #ifdef CYGIMP_THREAD_PRIORITY
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1302 Cyg_Thread *p = Cyg_Thread::self();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1303 p->set_priority( cyg_uitron_dis_dsp_old_priority );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1304 #endif
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1305 cyg_uitron_dis_dsp_old_priority = 0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1306 }
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1307 Cyg_Interrupt::enable_interrupts();
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1308 Cyg_Scheduler::unlock();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1309 CYG_UITRON_CHECK_DISPATCH_ENABLED(); // NB: afterwards!
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1310 return E_OK;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1311 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1312
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1313 #if 0 // NOT SUPPORTED
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1314 ER dis_int ( UINT eintno );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1315 ER ena_int ( UINT eintno );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1316 ER chg_iXX ( UINT iXXXX );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1317 ER ref_iXX ( UINT *p_iXXXX );
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1318 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1319
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1320 // - Memorypool Management Functions
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1321 #ifdef CYGPKG_UITRON_MEMPOOLVAR
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1322 #if 0 < CYG_UITRON_NUM( MEMPOOLVAR )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1323
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1324 #ifdef CYGPKG_UITRON_MEMPOOLVAR_CREATE_DELETE
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1325
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1326 CYG_UITRON_NEWFUNCTION( Cyg_Mempool_Variable )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1327
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1328 CYG_UIT_FUNC_INLINE
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1329 ER
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1330 cre_mpl ( ID mplid, T_CMPL *pk_cmpl )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1331 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1332 ER ret = E_OK;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1333 CYG_UIT_PARAMCHECK_PTR( pk_cmpl );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1334 CYG_UITRON_CHECK_NO_OBJ_LOCK_SCHED( MEMPOOLVAR, mplid );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1335 Cyg_Mempool_Variable *p = &(CYG_UITRON_OBJS( MEMPOOLVAR )[ mplid - 1 ]);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1336 cyg_uint8 *base;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1337 cyg_int32 size;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1338 CYG_ADDRWORD scratch;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1339 // preserve the original memory area to use
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1340 p->get_arena( base, size, scratch );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1341
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1342 if ( size < pk_cmpl->mplsz )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1343 ret = E_NOMEM;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1344 else if ( TA_TFIFO != pk_cmpl->mplatr )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1345 ret = E_RSATR;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1346 else
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1347 CYG_UITRON_PTRS( MEMPOOLVAR )[ mplid - 1 ] =
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1348 new( p ) Cyg_Mempool_Variable( base, size );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1349 Cyg_Scheduler::unlock();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1350 return ret;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1351 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1352
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1353 CYG_UIT_FUNC_INLINE
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1354 ER
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1355 del_mpl ( ID mplid )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1356 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1357 Cyg_Mempool_Variable *p;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1358 CYG_UITRON_CHECK_AND_GETP_MEMPOOLVAR( mplid, p );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1359 Cyg_Scheduler::lock();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1360 // deal with the race condition here
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1361 if ( p != CYG_UITRON_PTRS( MEMPOOLVAR )[ mplid - 1 ] ) {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1362 Cyg_Scheduler::unlock();
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1363 return E_NOEXS;
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1364 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1365 CYG_UITRON_PTRS( MEMPOOLVAR )[ mplid - 1 ] = NULL;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1366 p->~Cyg_Mempool_Variable();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1367 Cyg_Scheduler::unlock();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1368 return E_OK;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1369 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1370 #endif // CYGPKG_UITRON_MEMPOOLVAR_CREATE_DELETE
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1371
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1372 CYG_UIT_FUNC_INLINE
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1373 ER
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1374 get_blk ( VP *p_blk, ID mplid, INT blksz )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1375 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1376 Cyg_Mempool_Variable *p;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1377 CYG_UITRON_CHECK_AND_GETP_MEMPOOLVAR( mplid, p );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1378 CYG_UIT_PARAMCHECK_PTR( p_blk );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1379 CYG_UIT_PARAMCHECK( blksz > 0, E_PAR );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1380 CYG_UITRON_CHECK_DISPATCH_ENABLED();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1381 VP result = (VP)p->alloc(blksz);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1382 if ( ! result )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1383 CYG_UITRON_FAIL_RETURN();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1384 *p_blk = result;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1385 return E_OK;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1386 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1387
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1388
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1389 CYG_UIT_FUNC_INLINE
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1390 ER
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1391 pget_blk ( VP *p_blk, ID mplid, INT blksz )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1392 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1393 Cyg_Mempool_Variable *p;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1394 CYG_UITRON_CHECK_AND_GETP_MEMPOOLVAR( mplid, p );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1395 CYG_UIT_PARAMCHECK_PTR( p_blk );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1396 CYG_UIT_PARAMCHECK( blksz > 0, E_PAR );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1397 VP result = (VP)p->try_alloc(blksz);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1398 if ( ! result )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1399 return E_TMOUT;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1400 *p_blk = result;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1401 return E_OK;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1402 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1403
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1404 #ifdef CYGFUN_KERNEL_THREADS_TIMER
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1405 CYG_UIT_FUNC_INLINE
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1406 ER
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1407 tget_blk ( VP *p_blk, ID mplid, INT blksz, TMO tmout )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1408 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1409 Cyg_Mempool_Variable *p;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1410 CYG_UITRON_CHECK_AND_GETP_MEMPOOLVAR( mplid, p );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1411 CYG_UIT_PARAMCHECK_PTR( p_blk );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1412 CYG_UIT_PARAMCHECK( blksz > 0, E_PAR );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1413 CYG_UITRON_CHECK_DISPATCH_ENABLED_TMO( tmout );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1414 // do this now for the case when no sleeping actually occurs
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1415 Cyg_Thread *self = Cyg_Thread::self();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1416 self->set_wake_reason( Cyg_Thread::TIMEOUT );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1417 VP result;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1418 if ( TMO_FEVR == tmout )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1419 result = p->alloc(blksz);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1420 else if ( TMO_POL == tmout )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1421 result = p->try_alloc(blksz);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1422 else
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1423 result = p->alloc( blksz,
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1424 Cyg_Clock::real_time_clock->current_value() +
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1425 (cyg_tick_count)tmout );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1426 if ( ! result )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1427 CYG_UITRON_FAIL_RETURN_SELF( self );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1428 *p_blk = result;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1429 return E_OK;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1430 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1431 #endif // CYGFUN_KERNEL_THREADS_TIMER
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1432
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1433 CYG_UIT_FUNC_INLINE
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1434 ER
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1435 rel_blk ( ID mplid, VP blk )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1436 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1437 Cyg_Mempool_Variable *p;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1438 CYG_UITRON_CHECK_AND_GETP_MEMPOOLVAR( mplid, p );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1439 CYG_UIT_PARAMCHECK_PTR( blk );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1440 cyg_bool result = p->free( (cyg_uint8 *)blk, 0 );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1441 if ( ! result )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1442 return E_PAR;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1443 return E_OK;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1444 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1445
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1446 CYG_UIT_FUNC_INLINE
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1447 ER
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1448 ref_mpl ( T_RMPL *pk_rmpl, ID mplid )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1449 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1450 Cyg_Mempool_Variable *p;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1451 CYG_UITRON_CHECK_AND_GETP_MEMPOOLVAR( mplid, p );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1452 CYG_UIT_PARAMCHECK_PTR( pk_rmpl );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1453 pk_rmpl->exinf = NADR;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1454 pk_rmpl->wtsk = p->waiting();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1455 pk_rmpl->frsz = p->get_freemem();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1456
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1457 cyg_uint8 *base;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1458 cyg_int32 size;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1459 CYG_ADDRWORD maxfree;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1460 p->get_arena(base, size, maxfree);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1461 pk_rmpl->maxsz = maxfree;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1462
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1463 return E_OK;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1464 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1465
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1466 #endif // 0 < CYG_UITRON_NUM( MEMPOOLVAR )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1467 #endif // CYGPKG_UITRON_MEMPOOLVAR
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1468
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1469 #ifdef CYGPKG_UITRON_MEMPOOLFIXED
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1470 #if 0 < CYG_UITRON_NUM( MEMPOOLFIXED )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1471
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1472 #ifdef CYGPKG_UITRON_MEMPOOLFIXED_CREATE_DELETE
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1473
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1474 CYG_UITRON_NEWFUNCTION( Cyg_Mempool_Fixed )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1475
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1476 CYG_UIT_FUNC_INLINE
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1477 ER
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1478 cre_mpf ( ID mpfid, T_CMPF *pk_cmpf )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1479 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1480 ER ret = E_OK;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1481 CYG_UIT_PARAMCHECK_PTR( pk_cmpf );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1482 CYG_UITRON_CHECK_NO_OBJ_LOCK_SCHED( MEMPOOLFIXED, mpfid );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1483 Cyg_Mempool_Fixed *p = &(CYG_UITRON_OBJS( MEMPOOLFIXED )[ mpfid - 1 ]);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1484 cyg_uint8 *base;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1485 cyg_int32 size;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1486 CYG_ADDRWORD scratch;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1487 // preserve the original memory area to use
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1488 p->get_arena( base, size, scratch );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1489
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1490 if ( size < (pk_cmpf->blfsz * (pk_cmpf->mpfcnt + 1)) )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1491 ret = E_NOMEM;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1492 else if ( TA_TFIFO != pk_cmpf->mpfatr )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1493 ret = E_RSATR;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1494 else
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1495 CYG_UITRON_PTRS( MEMPOOLFIXED )[ mpfid - 1 ] =
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1496 new( p )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1497 Cyg_Mempool_Fixed( base, size,
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1498 (CYG_ADDRWORD)pk_cmpf->blfsz );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1499 Cyg_Scheduler::unlock();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1500 return ret;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1501 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1502
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1503 CYG_UIT_FUNC_INLINE
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1504 ER
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1505 del_mpf ( ID mpfid )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1506 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1507 Cyg_Mempool_Fixed *p;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1508 CYG_UITRON_CHECK_AND_GETP_MEMPOOLFIXED( mpfid, p );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1509 Cyg_Scheduler::lock();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1510 // deal with the race condition here
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1511 if ( p != CYG_UITRON_PTRS( MEMPOOLFIXED )[ mpfid - 1 ] ) {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1512 Cyg_Scheduler::unlock();
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1513 return E_NOEXS;
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1514 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1515 CYG_UITRON_PTRS( MEMPOOLFIXED )[ mpfid - 1 ] = NULL;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1516 p->~Cyg_Mempool_Fixed();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1517 Cyg_Scheduler::unlock();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1518 return E_OK;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1519 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1520 #endif // CYGPKG_UITRON_MEMPOOLFIXED_CREATE_DELETE
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1521
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1522 CYG_UIT_FUNC_INLINE
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1523 ER
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1524 get_blf ( VP *p_blf, ID mpfid )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1525 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1526 Cyg_Mempool_Fixed *p;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1527 CYG_UITRON_CHECK_AND_GETP_MEMPOOLFIXED( mpfid, p );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1528 CYG_UIT_PARAMCHECK_PTR( p_blf );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1529 CYG_UITRON_CHECK_DISPATCH_ENABLED();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1530 VP result = (VP)p->alloc();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1531 if ( ! result )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1532 CYG_UITRON_FAIL_RETURN();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1533 *p_blf = result;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1534 return E_OK;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1535 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1536
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1537 CYG_UIT_FUNC_INLINE
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1538 ER
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1539 pget_blf ( VP *p_blf, ID mpfid )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1540 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1541 Cyg_Mempool_Fixed *p;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1542 CYG_UITRON_CHECK_AND_GETP_MEMPOOLFIXED( mpfid, p );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1543 CYG_UIT_PARAMCHECK_PTR( p_blf );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1544 VP result = (VP)p->try_alloc();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1545 if ( ! result )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1546 return E_TMOUT;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1547 *p_blf = result;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1548 return E_OK;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1549 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1550
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1551 #ifdef CYGFUN_KERNEL_THREADS_TIMER
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1552 CYG_UIT_FUNC_INLINE
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1553 ER
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1554 tget_blf ( VP *p_blf, ID mpfid, TMO tmout )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1555 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1556 Cyg_Mempool_Fixed *p;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1557 CYG_UITRON_CHECK_AND_GETP_MEMPOOLFIXED( mpfid, p );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1558 CYG_UIT_PARAMCHECK_PTR( p_blf );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1559 CYG_UITRON_CHECK_DISPATCH_ENABLED_TMO( tmout );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1560 // do this now for the case when no sleeping actually occurs
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1561 Cyg_Thread *self = Cyg_Thread::self();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1562 self->set_wake_reason( Cyg_Thread::TIMEOUT );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1563 VP result;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1564 if ( TMO_FEVR == tmout )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1565 result = p->alloc();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1566 else if ( TMO_POL == tmout )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1567 result = p->try_alloc();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1568 else
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1569 result = p->alloc(
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1570 Cyg_Clock::real_time_clock->current_value() +
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1571 (cyg_tick_count)tmout );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1572 if ( ! result )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1573 CYG_UITRON_FAIL_RETURN_SELF( self );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1574 *p_blf = result;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1575 return E_OK;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1576 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1577 #endif // CYGFUN_KERNEL_THREADS_TIMER
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1578
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1579 CYG_UIT_FUNC_INLINE
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1580 ER
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1581 rel_blf ( ID mpfid, VP blf )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1582 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1583 Cyg_Mempool_Fixed *p;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1584 CYG_UITRON_CHECK_AND_GETP_MEMPOOLFIXED( mpfid, p );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1585 CYG_UIT_PARAMCHECK_PTR( blf );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1586 cyg_bool result = p->free( (cyg_uint8 *)blf );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1587 if ( ! result )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1588 return E_PAR;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1589 return E_OK;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1590 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1591
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1592 CYG_UIT_FUNC_INLINE
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1593 ER
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1594 ref_mpf ( T_RMPF *pk_rmpf, ID mpfid )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1595 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1596 Cyg_Mempool_Fixed *p;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1597 CYG_UITRON_CHECK_AND_GETP_MEMPOOLFIXED( mpfid, p );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1598 CYG_UIT_PARAMCHECK_PTR( pk_rmpf );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1599 pk_rmpf->exinf = NADR;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1600 pk_rmpf->wtsk = p->waiting();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1601
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1602 cyg_int32 blocksize = p->get_blocksize();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1603 pk_rmpf->frbcnt = p->get_freemem() / blocksize;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1604 // these two are "implementation dependent" ie. eCos only
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1605 pk_rmpf->numbcnt = p->get_totalmem() / blocksize;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1606 pk_rmpf->bsize = blocksize;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1607
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1608 return E_OK;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1609 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1610
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1611 #endif // 0 < CYG_UITRON_NUM( MEMPOOLFIXED )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1612 #endif // CYGPKG_UITRON_MEMPOOLFIXED
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1613
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1614 // - Time Management Functions
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1615
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1616 #ifdef CYGVAR_KERNEL_COUNTERS_CLOCK
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1617 CYG_UIT_FUNC_INLINE
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1618 ER
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1619 set_tim ( SYSTIME *pk_tim )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1620 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1621 CYG_UIT_PARAMCHECK_PTR( pk_tim );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1622 Cyg_Clock::real_time_clock->set_value( *pk_tim );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1623 return E_OK;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1624 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1625
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1626 CYG_UIT_FUNC_INLINE
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1627 ER
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1628 get_tim ( SYSTIME *pk_tim )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1629 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1630 CYG_UIT_PARAMCHECK_PTR( pk_tim );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1631 *pk_tim = Cyg_Clock::real_time_clock->current_value();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1632 return E_OK;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1633 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1634 #endif // CYGVAR_KERNEL_COUNTERS_CLOCK
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1635
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1636
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1637 #ifdef CYGFUN_KERNEL_THREADS_TIMER
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1638 CYG_UIT_FUNC_INLINE
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1639 ER
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1640 dly_tsk ( DLYTIME dlytim )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1641 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1642 CYG_UIT_PARAMCHECK( 0 <= dlytim, E_PAR );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1643 CYG_UITRON_CHECK_DISPATCH_ENABLED();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1644 if ( 0 >= dlytim )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1645 return E_OK;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1646 Cyg_Thread *self = Cyg_Thread::self();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1647 CYG_UITRON_CHECK_TASK_CONTEXT_SELF( self );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1648 self->delay( dlytim );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1649 if ( Cyg_Thread::DONE != self->get_wake_reason() )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1650 CYG_UITRON_FAIL_RETURN_SELF( self );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1651 return E_OK;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1652 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1653 #endif // CYGFUN_KERNEL_THREADS_TIMER
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1654
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1655 #ifdef CYGVAR_KERNEL_COUNTERS_CLOCK
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1656 #ifdef CYGPKG_UITRON_CYCLICS
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1657 #if 0 < CYG_UITRON_NUM( CYCLICS )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1658 CYG_UIT_FUNC_INLINE
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1659 ER
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1660 def_cyc ( HNO cycno, T_DCYC *pk_dcyc )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1661 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1662 // pk_dcyc->cycatr is ignored
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1663 // The only relevant attribute is TA_HLNG/TA_ASM.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1664 // This can be ignored as assembler routines are defined to be
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1665 // more conservative with registers than the procedure call standard.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1666
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1667 Cyg_Timer *p;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1668 CYG_UITRON_CHECK_AND_GETHDLR( CYCLICS, cycno, p );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1669 #ifndef CYGSEM_UITRON_PARAMS_NULL_IS_GOOD_PTR
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1670 CYG_UIT_PARAMCHECK( NULL != pk_dcyc, E_PAR );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1671 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1672 if( NADR == pk_dcyc ) {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1673 p->~Cyg_Timer();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1674 return E_OK;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1675 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1676 CYG_UIT_PARAMCHECK( 0 == (pk_dcyc->cycact & ~TCY_ON), E_PAR );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1677 CYG_UIT_PARAMCHECK( 0 < pk_dcyc->cyctim, E_PAR );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1678 p->initialize(
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1679 Cyg_Clock::real_time_clock,
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1680 (cyg_alarm_fn *)pk_dcyc->cychdr,
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1681 (CYG_ADDRWORD)pk_dcyc->exinf,
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1682 Cyg_Clock::real_time_clock->current_value() + pk_dcyc->cyctim,
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1683 pk_dcyc->cyctim,
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1684 pk_dcyc->cycact);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1685 return E_OK;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1686 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1687
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1688 CYG_UIT_FUNC_INLINE
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1689 ER
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1690 act_cyc ( HNO cycno, UINT cycact )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1691 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1692 Cyg_Timer *p;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1693 CYG_UITRON_CHECK_AND_GETHDLR( CYCLICS, cycno, p );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1694 CYG_UIT_PARAMCHECK( p->is_initialized(), E_NOEXS);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1695 CYG_UIT_PARAMCHECK( 0 == (cycact & ~(TCY_ON | TCY_INI)), E_PAR );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1696 p->activate(cycact);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1697 return E_OK;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1698 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1699
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1700
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1701 CYG_UIT_FUNC_INLINE
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1702 ER
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1703 ref_cyc ( T_RCYC *pk_rcyc, HNO cycno )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1704 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1705 Cyg_Timer *p;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1706 cyg_tick_count t;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1707 CYG_UITRON_CHECK_AND_GETHDLR( CYCLICS, cycno, p );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1708 CYG_UIT_PARAMCHECK( p->is_initialized(), E_NOEXS);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1709 CYG_UIT_PARAMCHECK_PTR( pk_rcyc );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1710
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1711 pk_rcyc->exinf = (VP)p->get_data();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1712 Cyg_Scheduler::lock();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1713 t = p->get_trigger() - Cyg_Clock::real_time_clock->current_value();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1714 Cyg_Scheduler::unlock();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1715 pk_rcyc->lfttim = t;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1716 pk_rcyc->cycact = (UINT)p->is_enabled();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1717 return E_OK;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1718 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1719 #endif // 0 < CYG_UITRON_NUM( CYCLICS )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1720 #endif // CYGPKG_UITRON_CYCLICS
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1721
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1722 #ifdef CYGPKG_UITRON_ALARMS
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1723 #if 0 < CYG_UITRON_NUM( ALARMS )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1724 CYG_UIT_FUNC_INLINE
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1725 ER
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1726 def_alm ( HNO almno, T_DALM *pk_dalm )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1727 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1728 Cyg_Timer *p;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1729 cyg_tick_count t, now;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1730 CYG_UITRON_CHECK_AND_GETHDLR( ALARMS, almno, p );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1731 #ifndef CYGSEM_UITRON_PARAMS_NULL_IS_GOOD_PTR
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1732 CYG_UIT_PARAMCHECK( NULL != pk_dalm, E_PAR );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1733 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1734 if( NADR == pk_dalm ) {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1735 p->~Cyg_Timer();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1736 return E_OK;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1737 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1738
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1739 CYG_UIT_PARAMCHECK( 0 == (pk_dalm->tmmode & ~TTM_REL), E_PAR );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1740
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1741 // make the time arithmetic safe without locking
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1742 now = Cyg_Clock::real_time_clock->current_value();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1743 t = pk_dalm->almtim;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1744 if( TTM_REL & pk_dalm->tmmode )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1745 t += now;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1746
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1747 CYG_UIT_PARAMCHECK( now < t, E_PAR );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1748
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1749 p->initialize(Cyg_Clock::real_time_clock,
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1750 (cyg_alarm_fn *)pk_dalm->almhdr,
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1751 (CYG_ADDRWORD)pk_dalm->exinf,
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1752 t, 0, Cyg_Timer::ENABLE);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1753
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1754 return E_OK;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1755 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1756
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1757 CYG_UIT_FUNC_INLINE
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1758 ER
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1759 ref_alm ( T_RALM *pk_ralm, HNO almno )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1760 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1761 Cyg_Timer *p;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1762 cyg_tick_count t;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1763
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1764 CYG_UITRON_CHECK_AND_GETHDLR( ALARMS, almno, p );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1765 CYG_UIT_PARAMCHECK_PTR( pk_ralm );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1766 CYG_UIT_PARAMCHECK( p->is_initialized(), E_NOEXS);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1767
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1768 Cyg_Scheduler::lock();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1769 t = p->get_trigger() - Cyg_Clock::real_time_clock->current_value();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1770 Cyg_Scheduler::unlock();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1771 pk_ralm->exinf = (VP)p->get_data();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1772 pk_ralm->lfttim = t;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1773 return E_OK;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1774 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1775 #endif // 0 < CYG_UITRON_NUM( ALARMS )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1776 #endif // CYGPKG_UITRON_ALARMS
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1777
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1778 #endif // CYGVAR_KERNEL_COUNTERS_CLOCK
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1779
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1780 // - System Management Functions
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1781
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1782 CYG_UIT_FUNC_INLINE
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1783 ER
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1784 get_ver ( T_VER *pk_ver )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1785 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1786 CYG_UIT_PARAMCHECK_PTR( pk_ver );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1787
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1788 pk_ver->maker = CYGNUM_UITRON_VER_MAKER;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1789 pk_ver->id = CYGNUM_UITRON_VER_ID;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1790 pk_ver->spver = CYGNUM_UITRON_VER_SPVER;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1791 pk_ver->prver = CYGNUM_UITRON_VER_PRVER;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1792 pk_ver->prno[0] = CYGNUM_UITRON_VER_PRNO_0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1793 pk_ver->prno[1] = CYGNUM_UITRON_VER_PRNO_1;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1794 pk_ver->prno[2] = CYGNUM_UITRON_VER_PRNO_2;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1795 pk_ver->prno[3] = CYGNUM_UITRON_VER_PRNO_3;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1796 pk_ver->cpu = CYGNUM_UITRON_VER_CPU;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1797 pk_ver->var = CYGNUM_UITRON_VER_VAR;
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1798
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1799 return E_OK;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1800 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1801
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1802 CYG_UIT_FUNC_INLINE
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1803 ER
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1804 ref_sys ( T_RSYS *pk_rsys )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1805 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1806 CYG_UIT_PARAMCHECK_PTR( pk_rsys );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1807 if ( ! Cyg_Interrupt::interrupts_enabled() )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1808 // CPU is locked
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1809 pk_rsys->sysstat = TSS_LOC;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1810 else
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1811 pk_rsys->sysstat =
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1812 (0 == cyg_uitron_dis_dsp_old_priority) ? TSS_TSK : TSS_DDSP;
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1813 return E_OK;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1814 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1815
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1816 CYG_UIT_FUNC_INLINE
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1817 ER
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1818 ref_cfg ( T_RCFG *pk_rcfg )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1819 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1820 CYG_UIT_PARAMCHECK_PTR( pk_rcfg );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1821 // no details here yet
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1822 return E_OK;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1823 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1824
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1825 #if 0 // NOT SUPPORTED
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1826 ER def_svc ( FN s_fncd, T_DSVC *pk_dsvc );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1827 ER def_exc ( UINT exckind, T_DEXC *pk_dexc );
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1828 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1829
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1830 // - Network Support Functions
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1831
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1832 #if 0 // NOT SUPPORTED
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1833 ER nrea_dat ( INT *p_reasz, VP dstadr, NODE srcnode, VP srcadr,
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1834 INT datsz );
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1835 ER nwri_dat ( INT *p_wrisz, NODE dstnode, VP dstadr, VP srcadr,
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1836 INT datsz );
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1837 ER nget_nod ( NODE *p_node );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1838 ER nget_ver ( T_VER *pk_ver, NODE node );
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1839 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1840
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1841 // ========================================================================
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1842
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1843 #endif // CYGPKG_UITRON
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1844
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1845 #endif // CYGPRI_UITRON_FUNCS_HERE_AND_NOW
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1846
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1847 #endif // CYGONCE_COMPAT_UITRON_UIT_FUNC_INL
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1848 //EOF uit_func.inl