|
0
|
1 //=========================================================================== |
|
|
2 // |
|
|
3 // testcx3.cxx |
|
|
4 // |
|
|
5 // uITRON "C++" test program three |
|
|
6 // |
|
|
7 //=========================================================================== |
|
|
8 //####COPYRIGHTBEGIN#### |
|
|
9 // |
|
|
10 // ------------------------------------------- |
|
|
11 // The contents of this file are subject to the Cygnus eCos Public License |
|
|
12 // Version 1.0 (the "License"); you may not use this file except in |
|
|
13 // compliance with the License. You may obtain a copy of the License at |
|
|
14 // http://sourceware.cygnus.com/ecos |
|
|
15 // |
|
|
16 // Software distributed under the License is distributed on an "AS IS" |
|
|
17 // basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the |
|
|
18 // License for the specific language governing rights and limitations under |
|
|
19 // the License. |
|
|
20 // |
|
|
21 // The Original Code is eCos - Embedded Cygnus Operating System, released |
|
|
22 // September 30, 1998. |
|
|
23 // |
|
|
24 // The Initial Developer of the Original Code is Cygnus. Portions created |
|
|
25 // by Cygnus are Copyright (C) 1998 Cygnus Solutions. All Rights Reserved. |
|
|
26 // ------------------------------------------- |
|
|
27 // |
|
|
28 //####COPYRIGHTEND#### |
|
|
29 //=========================================================================== |
|
|
30 //#####DESCRIPTIONBEGIN#### |
|
|
31 // |
|
|
32 // Author(s): hmt |
|
|
33 // Contributors: hmt |
|
|
34 // Date: 1998-03-13 |
|
|
35 // Purpose: uITRON API testing |
|
|
36 // Description: |
|
|
37 // |
|
|
38 //####DESCRIPTIONEND#### |
|
|
39 // |
|
|
40 //=========================================================================== |
|
|
41 |
|
|
42 #include <pkgconf/uitron.h> // uITRON setup CYGNUM_UITRON_SEMAS |
|
|
43 // CYGPKG_UITRON et al |
|
|
44 #include <cyg/infra/testcase.h> // testing infrastructure |
|
|
45 |
|
|
46 #ifdef CYGPKG_UITRON // we DO want the uITRON package |
|
|
47 |
|
|
48 #ifdef CYGSEM_KERNEL_SCHED_MLQUEUE // we DO want prioritized threads |
|
|
49 |
|
|
50 #ifdef CYGFUN_KERNEL_THREADS_TIMER // we DO want timout-able calls |
|
|
51 |
|
|
52 #ifdef CYGVAR_KERNEL_COUNTERS_CLOCK // we DO want the realtime clock |
|
|
53 |
|
|
54 // we're OK if it's C++ or neither of those two is defined: |
|
|
55 #if defined( __cplusplus ) || \ |
|
|
56 (!defined( CYGIMP_UITRON_INLINE_FUNCS ) && \ |
|
|
57 !defined( CYGIMP_UITRON_CPP_OUTLINE_FUNCS) ) |
|
|
58 |
|
|
59 // =================== TEST CONFIGURATION =================== |
|
|
60 #if \ |
|
|
61 /* test configuration for enough tasks */ \ |
|
|
62 (CYGNUM_UITRON_TASKS >= 4) && \ |
|
|
63 (CYGNUM_UITRON_TASKS < 90) && \ |
|
|
64 (CYGNUM_UITRON_START_TASKS == 1) && \ |
|
|
65 ( !defined(CYGPKG_UITRON_TASKS_CREATE_DELETE) || \ |
|
|
66 CYGNUM_UITRON_TASKS_INITIALLY >= 4 ) && \ |
|
|
67 \ |
|
|
68 /* test configuration for enough semaphores */ \ |
|
|
69 defined( CYGPKG_UITRON_SEMAS ) && \ |
|
|
70 (CYGNUM_UITRON_SEMAS >= 3) && \ |
|
|
71 (CYGNUM_UITRON_SEMAS < 90) && \ |
|
|
72 ( !defined(CYGPKG_UITRON_SEMAS_CREATE_DELETE) || \ |
|
|
73 CYGNUM_UITRON_SEMAS_INITIALLY >= 3 ) && \ |
|
|
74 \ |
|
|
75 /* the end of the large #if statement */ \ |
|
|
76 1 |
|
|
77 |
|
|
78 // ============================ END ============================ |
|
|
79 |
|
|
80 |
|
|
81 |
|
|
82 #include <cyg/compat/uitron/uit_func.h> // uITRON |
|
|
83 |
|
|
84 int t2done = 0; |
|
|
85 int t3done = 0; |
|
|
86 int t4done = 0; |
|
|
87 |
|
|
88 externC void |
|
|
89 cyg_package_start( void ) |
|
|
90 { |
|
|
91 CYG_TEST_INIT(); |
|
|
92 CYG_TEST_INFO( "Calling cyg_uitron_start()" ); |
|
|
93 cyg_uitron_start(); |
|
|
94 } |
|
|
95 |
|
|
96 extern "C" { |
|
|
97 void task1( unsigned int arg ); |
|
|
98 void task2( unsigned int arg ); |
|
|
99 void task3( unsigned int arg ); |
|
|
100 void task4( unsigned int arg ); |
|
|
101 } |
|
|
102 |
|
|
103 void task1( unsigned int arg ) |
|
|
104 { |
|
|
105 ER ercd; |
|
|
106 INT scratch; |
|
|
107 |
|
|
108 CYG_TEST_INFO( "Task 1 running" ); |
|
|
109 ercd = get_tid( &scratch ); |
|
|
110 CYG_TEST_CHECK( E_OK == ercd, "get_tid bad ercd" ); |
|
|
111 CYG_TEST_CHECK( 1 == scratch, "tid not 1" ); |
|
|
112 |
|
|
113 // start lower prio tasks to interact with |
|
|
114 ercd = sta_tsk( 2, 222 ); |
|
|
115 CYG_TEST_CHECK( E_OK == ercd, "sta_tsk bad ercd" ); |
|
|
116 ercd = sta_tsk( 3, 333 ); |
|
|
117 CYG_TEST_CHECK( E_OK == ercd, "sta_tsk bad ercd" ); |
|
|
118 ercd = sta_tsk( 4, 444 ); |
|
|
119 CYG_TEST_CHECK( E_OK == ercd, "sta_tsk bad ercd" ); |
|
|
120 |
|
|
121 // now start the test |
|
|
122 ercd = slp_tsk(); |
|
|
123 CYG_TEST_CHECK( E_OK == ercd, "slp_tsk bad ercd" ); |
|
|
124 CYG_TEST_INFO( "T1 awoken" ); |
|
|
125 ercd = wai_sem( 1 ); |
|
|
126 CYG_TEST_CHECK( E_OK == ercd, "wai_sem bad ercd" ); |
|
|
127 CYG_TEST_INFO( "T1 signalled" ); |
|
|
128 |
|
|
129 // let the others complete, so we get the status back |
|
|
130 ercd = dly_tsk( 50 ); |
|
|
131 CYG_TEST_CHECK( E_OK == ercd, "dly_tsk bad ercd" ); |
|
|
132 |
|
|
133 CYG_TEST_CHECK( t2done, "t2 not done" ); |
|
|
134 CYG_TEST_CHECK( t3done, "t3 not done" ); |
|
|
135 CYG_TEST_CHECK( t4done, "t4 not done" ); |
|
|
136 |
|
|
137 CYG_TEST_PASS( "Immediate-dispatch producer/consumer test OK" ); |
|
|
138 |
|
|
139 // all done |
|
|
140 CYG_TEST_EXIT( "All done" ); |
|
|
141 ext_tsk(); |
|
|
142 } |
|
|
143 |
|
|
144 |
|
|
145 |
|
|
146 void task2( unsigned int arg ) |
|
|
147 { |
|
|
148 ER ercd; |
|
|
149 INT scratch; |
|
|
150 |
|
|
151 CYG_TEST_INFO( "Task 2 running" ); |
|
|
152 ercd = get_tid( &scratch ); |
|
|
153 CYG_TEST_CHECK( E_OK == ercd, "get_tid bad ercd" ); |
|
|
154 CYG_TEST_CHECK( 2 == scratch, "tid not 2" ); |
|
|
155 if ( 222 != arg ) |
|
|
156 CYG_TEST_FAIL( "Task 2 arg not 222" ); |
|
|
157 |
|
|
158 // now start the test |
|
|
159 ercd = slp_tsk(); |
|
|
160 CYG_TEST_CHECK( E_OK == ercd, "slp_tsk bad ercd" ); |
|
|
161 CYG_TEST_INFO( "T2 awoken" ); |
|
|
162 ercd = sig_sem( 1 ); |
|
|
163 CYG_TEST_CHECK( E_OK == ercd, "sig_sem bad ercd" ); |
|
|
164 ercd = wup_tsk( 1 ); |
|
|
165 CYG_TEST_CHECK( E_OK == ercd, "wup_tsk bad ercd" ); |
|
|
166 |
|
|
167 CYG_TEST_INFO( "T2 completing" ); |
|
|
168 t2done++; |
|
|
169 |
|
|
170 ercd = slp_tsk(); |
|
|
171 CYG_TEST_FAIL( "Task 2 sleep came back" ); |
|
|
172 } |
|
|
173 |
|
|
174 void task3( unsigned int arg ) |
|
|
175 { |
|
|
176 ER ercd; |
|
|
177 INT scratch; |
|
|
178 |
|
|
179 CYG_TEST_INFO( "Task 3 running" ); |
|
|
180 ercd = get_tid( &scratch ); |
|
|
181 CYG_TEST_CHECK( E_OK == ercd, "get_tid bad ercd" ); |
|
|
182 CYG_TEST_CHECK( 3 == scratch, "tid not 3" ); |
|
|
183 if ( 333 != arg ) |
|
|
184 CYG_TEST_FAIL( "Task 3 arg not 333" ); |
|
|
185 |
|
|
186 // now start the test |
|
|
187 ercd = wai_sem( 1 ); |
|
|
188 CYG_TEST_CHECK( E_OK == ercd, "wai_sem bad ercd" ); |
|
|
189 CYG_TEST_INFO( "T3 awoken" ); |
|
|
190 ercd = sig_sem( 1 ); |
|
|
191 CYG_TEST_CHECK( E_OK == ercd, "sig_sem bad ercd" ); |
|
|
192 |
|
|
193 CYG_TEST_INFO( "T3 completing" ); |
|
|
194 t3done++; |
|
|
195 |
|
|
196 ercd = slp_tsk(); |
|
|
197 CYG_TEST_FAIL( "Task 3 sleep came back" ); |
|
|
198 } |
|
|
199 |
|
|
200 void task4( unsigned int arg ) |
|
|
201 { |
|
|
202 ER ercd; |
|
|
203 INT scratch; |
|
|
204 |
|
|
205 CYG_TEST_INFO( "Task 4 running" ); |
|
|
206 ercd = get_tid( &scratch ); |
|
|
207 CYG_TEST_CHECK( E_OK == ercd, "get_tid bad ercd" ); |
|
|
208 CYG_TEST_CHECK( 4 == scratch, "tid not 4" ); |
|
|
209 if ( 444 != arg ) |
|
|
210 CYG_TEST_FAIL( "Task 4 arg not 444" ); |
|
|
211 |
|
|
212 // now start the test |
|
|
213 ercd = wup_tsk( 2 ); |
|
|
214 CYG_TEST_CHECK( E_OK == ercd, "wup_tsk bad ercd" ); |
|
|
215 |
|
|
216 CYG_TEST_INFO( "T4 completing" ); |
|
|
217 t4done++; |
|
|
218 |
|
|
219 ercd = slp_tsk(); |
|
|
220 CYG_TEST_FAIL( "Task 4 sleep came back" ); |
|
|
221 } |
|
|
222 |
|
|
223 #else // not enough (or too many) uITRON objects configured in |
|
|
224 #define N_A_MSG "not enough uITRON objects to run test" |
|
|
225 #endif // not enough (or too many) uITRON objects configured in |
|
|
226 #else // not C++ and some C++ specific options enabled |
|
|
227 #define N_A_MSG "C++ specific options selected but this is C" |
|
|
228 #endif // not C++ and some C++ specific options enabled |
|
|
229 #else // ! CYGVAR_KERNEL_COUNTERS_CLOCK - can't test without it |
|
|
230 #define N_A_MSG "no CYGVAR_KERNEL_COUNTERS_CLOCK" |
|
|
231 #endif // ! CYGVAR_KERNEL_COUNTERS_CLOCK - can't test without it |
|
|
232 #else // ! CYGFUN_KERNEL_THREADS_TIMER - can't test without it |
|
|
233 #define N_A_MSG "no CYGFUN_KERNEL_THREADS_TIMER" |
|
|
234 #endif // ! CYGFUN_KERNEL_THREADS_TIMER - can't test without it |
|
|
235 #else // ! CYGIMP_THREAD_PRIORITY - can't test without it |
|
|
236 #define N_A_MSG "no CYGSEM_KERNEL_SCHED_MLQUEUE" |
|
|
237 #endif // ! CYGSEM_KERNEL_SCHED_MLQUEUE - can't test without it |
|
|
238 #else // ! CYGPKG_UITRON |
|
|
239 #define N_A_MSG "uITRON Compatibility layer disabled" |
|
|
240 #endif // CYGPKG_UITRON |
|
|
241 |
|
|
242 #ifdef N_A_MSG |
|
|
243 externC void |
|
|
244 cyg_start( void ) |
|
|
245 { |
|
|
246 CYG_TEST_INIT(); |
|
|
247 CYG_TEST_PASS( "N/A: " N_A_MSG ); |
|
|
248 CYG_TEST_EXIT( "N/A" ); |
|
|
249 } |
|
|
250 #endif // N_A_MSG defined ie. we are N/A. |
|
|
251 |
|
|
252 // EOF testcx3.cxx |