1 //===========================================================================
5 // uITRON "C" test program five
7 //===========================================================================
8 //####ECOSGPLCOPYRIGHTBEGIN####
9 // -------------------------------------------
10 // This file is part of eCos, the Embedded Configurable Operating System.
11 // Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
13 // eCos is free software; you can redistribute it and/or modify it under
14 // the terms of the GNU General Public License as published by the Free
15 // Software Foundation; either version 2 or (at your option) any later version.
17 // eCos is distributed in the hope that it will be useful, but WITHOUT ANY
18 // WARRANTY; without even the implied warranty of MERCHANTABILITY or
19 // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
22 // You should have received a copy of the GNU General Public License along
23 // with eCos; if not, write to the Free Software Foundation, Inc.,
24 // 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
26 // As a special exception, if other files instantiate templates or use macros
27 // or inline functions from this file, or you compile this file and link it
28 // with other works to produce a work based on this file, this file does not
29 // by itself cause the resulting work to be covered by the GNU General Public
30 // License. However the source code for this file must still be made available
31 // in accordance with section (3) of the GNU General Public License.
33 // This exception does not invalidate any other reasons why a work based on
34 // this file might be covered by the GNU General Public License.
36 // Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
37 // at http://sources.redhat.com/ecos/ecos-license/
38 // -------------------------------------------
39 //####ECOSGPLCOPYRIGHTEND####
40 //===========================================================================
41 //#####DESCRIPTIONBEGIN####
46 // Purpose: uITRON API testing
49 //####DESCRIPTIONEND####
51 //===========================================================================
53 #include <pkgconf/uitron.h> // uITRON setup CYGNUM_UITRON_SEMAS
54 // CYGPKG_UITRON et al
55 #include <cyg/infra/testcase.h> // testing infrastructure
57 #ifdef CYGPKG_UITRON // we DO want the uITRON package
59 #ifdef CYGSEM_KERNEL_SCHED_MLQUEUE // we DO want prioritized threads
61 #ifdef CYGFUN_KERNEL_THREADS_TIMER // we DO want timout-able calls
63 #ifdef CYGVAR_KERNEL_COUNTERS_CLOCK // we DO want the realtime clock
65 // we're OK if it's C++ or neither of those two is defined:
66 #if defined( __cplusplus ) || \
67 (!defined( CYGIMP_UITRON_INLINE_FUNCS ) && \
68 !defined( CYGIMP_UITRON_CPP_OUTLINE_FUNCS) )
70 // =================== TEST CONFIGURATION ===================
72 /* test configuration for enough tasks */ \
73 (CYGNUM_UITRON_TASKS >= 4) && \
74 (CYGNUM_UITRON_TASKS < 90) && \
75 (CYGNUM_UITRON_START_TASKS == 1) && \
76 ( !defined(CYGPKG_UITRON_TASKS_CREATE_DELETE) || \
77 CYGNUM_UITRON_TASKS_INITIALLY >= 4 ) && \
79 /* test configuration for enough semaphores */ \
80 defined( CYGPKG_UITRON_SEMAS ) && \
81 (CYGNUM_UITRON_SEMAS >= 3) && \
82 (CYGNUM_UITRON_SEMAS < 90) && \
83 ( !defined(CYGPKG_UITRON_SEMAS_CREATE_DELETE) || \
84 CYGNUM_UITRON_SEMAS_INITIALLY >= 3 ) && \
86 /* test configuration for enough flag objects */ \
87 defined( CYGPKG_UITRON_FLAGS ) && \
88 (CYGNUM_UITRON_FLAGS >= 3) && \
89 (CYGNUM_UITRON_FLAGS < 90) && \
90 ( !defined(CYGPKG_UITRON_FLAGS_CREATE_DELETE) || \
91 CYGNUM_UITRON_FLAGS_INITIALLY >= 3 ) && \
93 /* test configuration for enough message boxes */ \
94 defined( CYGPKG_UITRON_MBOXES ) && \
95 (CYGNUM_UITRON_MBOXES >= 3) && \
96 (CYGNUM_UITRON_MBOXES < 90) && \
97 ( !defined(CYGPKG_UITRON_MBOXES_CREATE_DELETE) || \
98 CYGNUM_UITRON_MBOXES_INITIALLY >= 3 ) && \
100 /* test configuration for enough fixed memory pools */ \
101 defined( CYGPKG_UITRON_MEMPOOLFIXED ) && \
102 (CYGNUM_UITRON_MEMPOOLFIXED >= 3) && \
103 (CYGNUM_UITRON_MEMPOOLFIXED < 90) && \
104 ( !defined(CYGPKG_UITRON_MEMPOOLFIXED_CREATE_DELETE) || \
105 CYGNUM_UITRON_MEMPOOLFIXED_INITIALLY >= 3 ) && \
107 /* test configuration for enough variable mempools */ \
108 defined( CYGPKG_UITRON_MEMPOOLVAR ) && \
109 (CYGNUM_UITRON_MEMPOOLVAR >= 3) && \
110 (CYGNUM_UITRON_MEMPOOLVAR < 90) && \
111 ( !defined(CYGPKG_UITRON_MEMPOOLVAR_CREATE_DELETE) || \
112 CYGNUM_UITRON_MEMPOOLVAR_INITIALLY >= 3 ) && \
114 /* the end of the large #if statement */ \
117 // ============================ END ============================
121 #include <cyg/compat/uitron/uit_func.h> // uITRON
124 cyg_package_start( void )
127 CYG_TEST_INFO( "Calling cyg_uitron_start()" );
131 volatile int intercount = 0;
136 void task1( unsigned int arg )
142 CYG_TEST_INFO( "Task 1 running" );
144 // check initial state
145 ercd = ref_sys( &rsys );
146 CYG_TEST_CHECK( E_OK == ercd, "ref_sys bad ercd" );
147 CYG_TEST_CHECK( TSS_TSK == rsys.sysstat, "system state not TSS_TSK" );
148 // disable intrs and check state
150 CYG_TEST_CHECK( E_OK == ercd, "loc_cpu bad ercd" );
151 ercd = ref_sys( &rsys );
152 CYG_TEST_CHECK( E_OK == ercd, "ref_sys bad ercd" );
153 CYG_TEST_CHECK( TSS_LOC == rsys.sysstat, "system state not TSS_LOC" );
154 #ifdef CYGSEM_UITRON_BAD_PARAMS_RETURN_ERRORS
156 ercd = dly_tsk( 10 );
157 CYG_TEST_CHECK( E_CTX == ercd, "dly_tsk bad ercd !E_CTX" );
158 #endif // CYGSEM_UITRON_BAD_PARAMS_RETURN_ERRORS
159 // enable intrs and check state and a legal sleep
161 CYG_TEST_CHECK( E_OK == ercd, "unl_cpu bad ercd" );
162 ercd = ref_sys( &rsys );
163 CYG_TEST_CHECK( E_OK == ercd, "ref_sys bad ercd" );
164 CYG_TEST_CHECK( TSS_TSK == rsys.sysstat, "system state not TSS_TSK" );
166 CYG_TEST_CHECK( E_OK == ercd, "dly_tsk bad ercd" );
167 // disable intrs and try scheduler illegal ops
169 CYG_TEST_CHECK( E_OK == ercd, "loc_cpu bad ercd" );
170 ercd = ref_sys( &rsys );
171 CYG_TEST_CHECK( E_OK == ercd, "ref_sys bad ercd" );
172 CYG_TEST_CHECK( TSS_LOC == rsys.sysstat, "system state not TSS_LOC" );
173 #ifdef CYGSEM_UITRON_BAD_PARAMS_RETURN_ERRORS
175 CYG_TEST_CHECK( E_CTX == ercd, "dis_dsp bad ercd !E_CTX" );
177 CYG_TEST_CHECK( E_CTX == ercd, "ena_dsp bad ercd !E_CTX" );
178 #endif // CYGSEM_UITRON_BAD_PARAMS_RETURN_ERRORS
179 // enable again and check state
181 CYG_TEST_CHECK( E_OK == ercd, "unl_cpu bad ercd" );
182 ercd = ref_sys( &rsys );
183 CYG_TEST_CHECK( E_OK == ercd, "ref_sys bad ercd" );
184 CYG_TEST_CHECK( TSS_TSK == rsys.sysstat, "system state not TSS_TSK" );
185 // disable the scheduler and check state
187 CYG_TEST_CHECK( E_OK == ercd, "dis_dsp bad ercd" );
188 ercd = ref_sys( &rsys );
189 CYG_TEST_CHECK( E_OK == ercd, "ref_sys bad ercd" );
190 CYG_TEST_CHECK( TSS_DDSP == rsys.sysstat, "system state not TSS_DDSP" );
191 // disable intrs and check state
193 CYG_TEST_CHECK( E_OK == ercd, "loc_cpu bad ercd" );
194 ercd = ref_sys( &rsys );
195 CYG_TEST_CHECK( E_OK == ercd, "ref_sys bad ercd" );
196 CYG_TEST_CHECK( TSS_LOC == rsys.sysstat, "system state not TSS_LOC" );
197 // then unlock and check state
199 CYG_TEST_CHECK( E_OK == ercd, "unl_cpu bad ercd" );
200 ercd = ref_sys( &rsys );
201 CYG_TEST_CHECK( E_OK == ercd, "ref_sys bad ercd" );
202 CYG_TEST_CHECK( TSS_TSK == rsys.sysstat, "system state not TSS_TSK" );
204 CYG_TEST_PASS( "Interrupt dis/enabling and interactions" );
206 // and now we can do the rest of the test
208 #ifdef CYGSEM_UITRON_BAD_PARAMS_RETURN_ERRORS
210 CYG_TEST_CHECK( E_OBJ == ercd, "rel_wai bad ercd !E_OBJ" );
212 CYG_TEST_CHECK( E_OBJ == ercd, "rel_wai(me) bad ercd !E_OBJ" );
213 ercd = rel_wai( -6 );
214 CYG_TEST_CHECK( E_ID == ercd, "rel_wai bad ercd !E_ID" );
215 ercd = rel_wai( 99 );
216 CYG_TEST_CHECK( E_ID == ercd, "rel_wai bad ercd !E_ID" );
217 #endif // we can test bad param error returns
220 CYG_TEST_CHECK( E_OK == ercd, "dis_dsp bad ercd" );
221 ercd = sta_tsk( 2, 22222 );
222 CYG_TEST_CHECK( E_OK == ercd, "sta_tsk bad ercd" );
223 ercd = chg_pri( 2, 5 );
224 CYG_TEST_CHECK( E_OK == ercd, "chg_pri bad ercd" );
226 CYG_TEST_CHECK( E_OK == ercd, "ena_dsp bad ercd" );
228 #ifdef CYGSEM_UITRON_BAD_PARAMS_RETURN_ERRORS
230 CYG_TEST_CHECK( E_OBJ == ercd, "rel_wai bad ercd !E_OBJ" );
232 CYG_TEST_CHECK( E_OBJ == ercd, "rel_wai(me) bad ercd !E_OBJ" );
233 #endif // we can test bad param error returns
236 CYG_TEST_CHECK( E_RLWAI == ercd, "wai_sem bad ercd !E_RLWAI" );
238 ercd = twai_sem( 1, 20 );
239 CYG_TEST_CHECK( E_RLWAI == ercd, "twai_sem bad ercd !E_RLWAI" );
241 ercd = wai_flg( &scratch, 1, 9999, 0 );
242 CYG_TEST_CHECK( E_RLWAI == ercd, "wai_flg bad ercd !E_RLWAI" );
244 ercd = twai_flg( &scratch, 1, 9999, 0, 10 );
245 CYG_TEST_CHECK( E_RLWAI == ercd, "twai_flg bad ercd !E_RLWAI" );
247 ercd = rcv_msg( &t_msg, 1 );
248 CYG_TEST_CHECK( E_RLWAI == ercd, "rcv_msg bad ercd !E_RLWAI" );
250 ercd = trcv_msg( &t_msg, 1, 10 );
251 CYG_TEST_CHECK( E_RLWAI == ercd, "trcv_msg bad ercd !E_RLWAI" );
253 // these are loops so as to consume the whole of the mempool
254 // in order to wait at the end
255 for ( i = 0; i < 10; i++ )
256 if ( E_OK != (ercd = get_blf( &vp, 3 ) ) )
258 CYG_TEST_CHECK( E_RLWAI == ercd, "get_blf bad ercd !E_RLWAI" );
260 for ( i = 0; i < 10; i++ )
261 if ( E_OK != (ercd = tget_blf( &vp, 3, 10 ) ) )
263 CYG_TEST_CHECK( E_RLWAI == ercd, "tget_blf bad ercd !E_RLWAI" );
265 for ( i = 0; i < 10; i++ )
266 if ( E_OK != (ercd = get_blk( &vp, 1, 1000 ) ) )
268 CYG_TEST_CHECK( E_RLWAI == ercd, "get_blk bad ercd !E_RLWAI" );
270 for ( i = 0; i < 10; i++ )
271 if ( E_OK != (ercd = tget_blk( &vp, 1, 1000, 10 ) ) )
273 CYG_TEST_CHECK( E_RLWAI == ercd, "tget_blk bad ercd !E_RLWAI" );
275 ercd = dly_tsk( 10 );
276 CYG_TEST_CHECK( E_RLWAI == ercd, "dly_tsk bad ercd !E_RLWAI" );
278 ercd = tslp_tsk( 10 );
279 CYG_TEST_CHECK( E_RLWAI == ercd, "tslp_tsk bad ercd !E_RLWAI" );
282 CYG_TEST_CHECK( E_RLWAI == ercd, "slp_tsk bad ercd !E_RLWAI" );
285 CYG_TEST_CHECK( E_OK == ercd, "ter_tsk bad ercd" );
286 ercd = dly_tsk( 10 );
287 CYG_TEST_CHECK( E_OK == ercd, "dly_tsk bad ercd" );
289 CYG_TEST_PASS("release wait: various waiting calls");
292 CYG_TEST_EXIT( "All done" );
298 void task2( unsigned int arg )
302 CYG_TEST_INFO( "Task 2 running" );
303 ercd = get_tid( &i );
304 CYG_TEST_CHECK( E_OK == ercd, "get_tid bad ercd" );
305 CYG_TEST_CHECK( 2 == i, "tid not 2" );
307 CYG_TEST_FAIL( "Task 2 arg not 22222" );
309 for ( i = 0 ; i < 100; i++ ) {
311 CYG_TEST_CHECK( E_OK == ercd, "rel_wai bad ercd" );
313 // we expect task2 to be killed here
314 CYG_TEST_FAIL( "Task 2 ran to completion!" );
317 void task3( unsigned int arg )
321 void task4( unsigned int arg )
325 #else // not enough (or too many) uITRON objects configured in
326 #define N_A_MSG "not enough uITRON objects to run test"
327 #endif // not enough (or too many) uITRON objects configured in
328 #else // not C++ and some C++ specific options enabled
329 #define N_A_MSG "C++ specific options selected but this is C"
330 #endif // not C++ and some C++ specific options enabled
331 #else // ! CYGVAR_KERNEL_COUNTERS_CLOCK - can't test without it
332 #define N_A_MSG "no CYGVAR_KERNEL_COUNTERS_CLOCK"
333 #endif // ! CYGVAR_KERNEL_COUNTERS_CLOCK - can't test without it
334 #else // ! CYGFUN_KERNEL_THREADS_TIMER - can't test without it
335 #define N_A_MSG "no CYGFUN_KERNEL_THREADS_TIMER"
336 #endif // ! CYGFUN_KERNEL_THREADS_TIMER - can't test without it
337 #else // ! CYGIMP_THREAD_PRIORITY - can't test without it
338 #define N_A_MSG "no CYGSEM_KERNEL_SCHED_MLQUEUE"
339 #endif // ! CYGSEM_KERNEL_SCHED_MLQUEUE - can't test without it
340 #else // ! CYGPKG_UITRON
341 #define N_A_MSG "uITRON Compatibility layer disabled"
342 #endif // CYGPKG_UITRON
349 CYG_TEST_NA( N_A_MSG );
351 #endif // N_A_MSG defined ie. we are N/A.