1 //===========================================================================
5 // uITRON "C" test program one
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 /* the end of the large #if statement */ \
82 // ============================ END ============================
86 #include <cyg/compat/uitron/uit_func.h> // uITRON
89 cyg_package_start( void )
92 CYG_TEST_INFO( "Calling cyg_uitron_start()" );
96 volatile int intercom = 0;
97 volatile int intercount = 0;
100 #ifndef CYGSEM_KERNEL_SCHED_TIMESLICE
101 #define TIMESLICEMSG "Assuming no kernel timeslicing"
103 #define TSRELEASE() CYG_EMPTY_STATEMENT
104 #define TSSTOP() CYG_EMPTY_STATEMENT
105 #define TSLOCK() CYG_EMPTY_STATEMENT
106 #define TSUNLOCK() CYG_EMPTY_STATEMENT
107 #define ICWAIT( _i_ ) CYG_EMPTY_STATEMENT
110 // Now follow some nasty bodges to control the scheduling when basically it
111 // isn't controlled ie. timeslicing is on. It's bodgy because we're
112 // testing normal synchronization methods, so we shouldn't rely on them for
113 // comms between threads here. Instead there's a mixture of communicating
114 // via a flag (ts_interlock) which stops the "controlled" thread running
115 // away, and waiting for the controlled thread to run enough for us.
117 // Tasks 3 and 4 are waited for by the control task: task 3 locks the
118 // scheduler so is immediately descheduled when it unlocks it, task 4 does
119 // waiting-type operations, so we must give it chance to run by yielding a
120 // few times ourselves. Note the plain constant in ICWAIT() below.
122 #define TIMESLICEMSG "Assuming kernel timeslicing ENABLED"
123 volatile int ts_interlock = 0;
124 #define TSGO() (ts_interlock)
125 #define TSRELEASE() ts_interlock = 1
126 #define TSSTOP() ts_interlock = 0
128 #define TSLOCK() CYG_MACRO_START \
129 ER ercd2 = dis_dsp(); \
130 CYG_TEST_CHECK( E_OK == ercd2, "dis_dsp (TSLOCK) bad ercd2" ); \
133 #define TSUNLOCK() CYG_MACRO_START \
134 ER ercd3 = ena_dsp(); \
135 CYG_TEST_CHECK( E_OK == ercd3, "ena_dsp (TSUNLOCK) bad ercd3" ); \
138 #define ICWAIT( _i_ ) CYG_MACRO_START \
140 for ( loops = 3; (0 < loops) || ((_i_) > intercount); loops-- ) { \
141 ER ercd4 = rot_rdq( 0 ); /* yield */ \
142 CYG_TEST_CHECK( E_OK == ercd4, "rot_rdq (ICWAIT) bad ercd4" ); \
145 #endif // CYGSEM_KERNEL_SCHED_TIMESLICE
150 static char *msgs[] = { "ZERO", "ONE", "TWO", "THREE", "FOUR", "LOTS" }; \
151 CYG_TEST_INFO( msgs[ intercount > 5 ? 5 : intercount ] ); \
155 // #define CYG_TEST_UITRON_TEST1_LOOPING 1
157 void task1( unsigned int arg )
162 #ifdef CYG_TEST_UITRON_TEST1_LOOPING
164 #endif // CYG_TEST_UITRON_TEST1_LOOPING
166 CYG_TEST_INFO( "Task 1 running" );
167 CYG_TEST_INFO( TIMESLICEMSG );
172 CYG_TEST_INFO( "Testing get_tid and ref_tsk" );
173 ercd = get_tid( &scratch );
174 CYG_TEST_CHECK( E_OK == ercd, "get_tid bad ercd" );
175 CYG_TEST_CHECK( 1 == scratch, "tid not 1" );
176 #ifdef CYGSEM_UITRON_BAD_PARAMS_RETURN_ERRORS
177 #ifndef CYGSEM_UITRON_PARAMS_NULL_IS_GOOD_PTR
178 ercd = get_tid( NULL );
179 CYG_TEST_CHECK( E_PAR == ercd, "get_tid bad ercd !E_PAR" );
181 ercd = get_tid( NADR );
182 CYG_TEST_CHECK( E_PAR == ercd, "get_tid bad ercd !E_PAR" );
183 ercd = ref_tsk( &ref_tskd, -6 );
184 CYG_TEST_CHECK( E_ID == ercd, "ref_tsk bad ercd !E_ID" );
185 ercd = ref_tsk( &ref_tskd, 99 );
186 CYG_TEST_CHECK( E_ID == ercd, "ref_tsk bad ercd !E_ID" );
187 #ifndef CYGSEM_UITRON_PARAMS_NULL_IS_GOOD_PTR
188 ercd = ref_tsk( NULL, 1 );
189 CYG_TEST_CHECK( E_PAR == ercd, "ref_tsk bad ercd !E_PAR" );
191 ercd = ref_tsk( NADR, 1 );
192 CYG_TEST_CHECK( E_PAR == ercd, "ref_tsk bad ercd !E_PAR" );
193 #endif // we can test bad param error returns
194 ercd = ref_tsk( &ref_tskd, 1 );
195 CYG_TEST_CHECK( E_OK == ercd, "ref_tsk bad ercd" );
196 CYG_TEST_CHECK( TTS_RUN == ref_tskd.tskstat, "Bad task status 1" );
197 ercd = ref_tsk( &ref_tskd, 0 );
198 CYG_TEST_CHECK( E_OK == ercd, "ref_tsk bad ercd" );
199 CYG_TEST_CHECK( TTS_RUN == ref_tskd.tskstat, "Bad task status 0" );
200 ercd = ref_tsk( &ref_tskd, 2 );
201 CYG_TEST_CHECK( E_OK == ercd, "ref_tsk bad ercd" );
202 CYG_TEST_CHECK( TTS_DMT == ref_tskd.tskstat, "Bad task status 2" );
203 CYG_TEST_CHECK( 2 == ref_tskd.tskpri, "Bad task prio 2" );
206 CYG_TEST_CHECK( E_OBJ == ercd, "rsm_tsk DMT bad ercd !E_OBJ" );
207 ercd = frsm_tsk( 2 );
208 CYG_TEST_CHECK( E_OBJ == ercd, "frsm_tsk DMT bad ercd !E_OBJ" );
210 CYG_TEST_CHECK( E_OBJ == ercd, "rel_wai DMT bad ercd !E_OBJ" );
212 CYG_TEST_CHECK( E_OBJ == ercd, "sus_tsk DMT bad ercd !E_OBJ" );
214 CYG_TEST_CHECK( E_OBJ == ercd, "wup_tsk DMT bad ercd !E_OBJ" );
215 ercd = can_wup( &scratch, 2 );
216 CYG_TEST_CHECK( E_OBJ == ercd, "can_wup DMT bad ercd !E_OBJ" );
218 CYG_TEST_PASS( "get_tid, ref_tsk" );
220 CYG_TEST_INFO( "Testing prio change and start task" );
221 ercd = sta_tsk( 2, 99 );
222 CYG_TEST_CHECK( E_OK == ercd, "sta_tsk bad ercd" );
224 // drop pri of task 2
225 ercd = chg_pri( 2, 4 );
226 CYG_TEST_CHECK( E_OK == ercd, "chg_pri bad ercd" );
227 ercd = ref_tsk( &ref_tskd, 2 );
228 CYG_TEST_CHECK( E_OK == ercd, "ref_tsk bad ercd" );
229 CYG_TEST_CHECK( TTS_RDY == ref_tskd.tskstat, "Bad task status 2" );
230 CYG_TEST_CHECK( 4 == ref_tskd.tskpri, "Bad task prio 2" );
232 // drop our pri below task 2
233 ercd = chg_pri( 0, 5 );
234 CYG_TEST_CHECK( E_OK == ercd, "chg_pri bad ercd" );
236 ercd = ref_tsk( &ref_tskd, 1 );
237 CYG_TEST_CHECK( E_OK == ercd, "ref_tsk bad ercd" );
238 CYG_TEST_CHECK( 5 == ref_tskd.tskpri, "Bad task prio 1" );
239 ercd = ref_tsk( &ref_tskd, 0 );
240 CYG_TEST_CHECK( E_OK == ercd, "ref_tsk bad ercd" );
241 CYG_TEST_CHECK( 5 == ref_tskd.tskpri, "Bad task prio 0" );
242 ercd = ref_tsk( &ref_tskd, 2 );
243 CYG_TEST_CHECK( E_OK == ercd, "ref_tsk bad ercd" );
244 // it will have run to completion and regained its original prio
245 CYG_TEST_CHECK( 2 == ref_tskd.tskpri, "Bad task prio 2" );
246 CYG_TEST_CHECK( TTS_DMT == ref_tskd.tskstat, "Bad task status 2" );
248 // retest these now that the task has executed once
250 CYG_TEST_CHECK( E_OBJ == ercd, "rsm_tsk DMT bad ercd !E_OBJ" );
251 ercd = frsm_tsk( 2 );
252 CYG_TEST_CHECK( E_OBJ == ercd, "frsm_tsk DMT bad ercd !E_OBJ" );
254 CYG_TEST_CHECK( E_OBJ == ercd, "rel_wai DMT bad ercd !E_OBJ" );
256 CYG_TEST_CHECK( E_OBJ == ercd, "sus_tsk DMT bad ercd !E_OBJ" );
258 CYG_TEST_CHECK( E_OBJ == ercd, "wup_tsk DMT bad ercd !E_OBJ" );
259 ercd = can_wup( &scratch, 2 );
260 CYG_TEST_CHECK( E_OBJ == ercd, "can_wup DMT bad ercd !E_OBJ" );
262 #ifdef CYGSEM_UITRON_BAD_PARAMS_RETURN_ERRORS
263 ercd = chg_pri( -6, 9 );
264 CYG_TEST_CHECK( E_ID == ercd, "chg_pri bad ercd !E_ID" );
265 ercd = chg_pri( 99, 9 );
266 CYG_TEST_CHECK( E_ID == ercd, "chg_pri bad ercd !E_ID" );
267 ercd = sta_tsk( -6, 99 );
268 CYG_TEST_CHECK( E_ID == ercd, "sta_tsk bad ercd !E_ID" );
269 ercd = sta_tsk( 99, 99 );
270 CYG_TEST_CHECK( E_ID == ercd, "sta_tsk bad ercd !E_ID" );
271 #endif // we can test bad param error returns
273 CYG_TEST_PASS( "sta_tsk, chg_pri" );
275 CYG_TEST_INFO( "Testing delay and dispatch disabling" );
276 ercd = dly_tsk( 10 );
277 CYG_TEST_CHECK( E_OK == ercd, "dly_tsk bad ercd" );
279 CYG_TEST_CHECK( E_OK == ercd, "ena_dsp bad ercd" );
280 ercd = dly_tsk( 10 );
281 CYG_TEST_CHECK( E_OK == ercd, "dly_tsk bad ercd" );
283 CYG_TEST_CHECK( E_OK == ercd, "dis_dsp bad ercd" );
284 #ifdef CYGSEM_UITRON_BAD_PARAMS_RETURN_ERRORS
285 ercd = dly_tsk( 10 );
286 CYG_TEST_CHECK( E_CTX == ercd, "dly_tsk bad ercd !E_CTX" );
288 CYG_TEST_CHECK( E_OK == ercd, "dis_dsp bad ercd" );
289 ercd = dly_tsk( 10 );
290 CYG_TEST_CHECK( E_CTX == ercd, "dly_tsk bad ercd !E_CTX" );
291 #endif // we can test bad param error returns
293 CYG_TEST_CHECK( E_OK == ercd, "ena_dsp bad ercd" );
294 ercd = dly_tsk( 10 );
295 CYG_TEST_CHECK( E_OK == ercd, "dly_tsk bad ercd" );
297 CYG_TEST_CHECK( E_OK == ercd, "ena_dsp bad ercd" );
298 ercd = dly_tsk( 10 );
299 CYG_TEST_CHECK( E_OK == ercd, "dly_tsk bad ercd" );
301 CYG_TEST_PASS( "dly_tsk, ena_dsp, dis_dsp" );
303 CYG_TEST_INFO( "Testing ready queue manipulation" );
305 CYG_TEST_CHECK( E_OK == ercd, "rot_rdq bad ercd" );
307 CYG_TEST_CHECK( E_OK == ercd, "rot_rdq bad ercd" );
309 CYG_TEST_CHECK( E_OK == ercd, "rot_rdq bad ercd" );
310 #ifdef CYGSEM_UITRON_BAD_PARAMS_RETURN_ERRORS
311 ercd = rot_rdq( -6 );
312 CYG_TEST_CHECK( E_PAR == ercd, "rot_rdq bad ercd !E_PAR" );
313 ercd = rot_rdq( 99 );
314 CYG_TEST_CHECK( E_PAR == ercd, "rot_rdq bad ercd !E_PAR" );
315 #endif // we can test bad param error returns
317 CYG_TEST_PASS( "rot_rdq" );
319 CYG_TEST_INFO( "Testing suspend/resume" );
320 #ifdef CYGSEM_UITRON_BAD_PARAMS_RETURN_ERRORS
321 ercd = sus_tsk( -6 );
322 CYG_TEST_CHECK( E_ID == ercd, "sus_tsk bad ercd !E_ID" );
323 ercd = sus_tsk( 99 );
324 CYG_TEST_CHECK( E_ID == ercd, "sus_tsk bad ercd !E_ID" );
325 ercd = rsm_tsk( -6 );
326 CYG_TEST_CHECK( E_ID == ercd, "rsm_tsk bad ercd !E_ID" );
327 ercd = rsm_tsk( 99 );
328 CYG_TEST_CHECK( E_ID == ercd, "rsm_tsk bad ercd !E_ID" );
329 ercd = frsm_tsk( -6 );
330 CYG_TEST_CHECK( E_ID == ercd, "frsm_tsk bad ercd !E_ID" );
331 ercd = frsm_tsk( 99 );
332 CYG_TEST_CHECK( E_ID == ercd, "frsm_tsk bad ercd !E_ID" );
333 #endif // we can test bad param error returns
334 // drop task 3 pri to same as us
335 CYG_TEST_CHECK( 0 == intercount, "intercount != 0" );
337 intercom = 3; // tell T3 to loop
340 CYG_TEST_CHECK( E_OK == ercd, "dis_dsp bad ercd" );
341 ercd = sta_tsk( 3, 66 );
342 CYG_TEST_CHECK( E_OK == ercd, "sta_tsk bad ercd" );
343 ercd = chg_pri( 3, 5 );
344 CYG_TEST_CHECK( E_OK == ercd, "chg_pri bad ercd" );
346 CYG_TEST_CHECK( E_OK == ercd, "ena_dsp bad ercd" );
349 CYG_TEST_CHECK( E_OK == ercd, "rot_rdq bad ercd" );
351 CYG_TEST_CHECK( 1 == intercount, "intercount != 1" );
354 CYG_TEST_CHECK( E_OK == ercd, "sus_tsk bad ercd" );
355 intercom = 0; // bad data to T3
357 CYG_TEST_CHECK( E_OK == ercd, "rot_rdq bad ercd" );
358 CYG_TEST_CHECK( 1 == intercount, "intercount != 1" );
359 intercom = 3; // tell T3 to loop
362 CYG_TEST_CHECK( E_OK == ercd, "rsm_tsk bad ercd" );
364 CYG_TEST_CHECK( E_OK == ercd, "rot_rdq bad ercd" );
366 CYG_TEST_CHECK( 2 == intercount, "intercount != 2" );
368 CYG_TEST_INFO( "Command task 3 inner loop stop" );
372 CYG_TEST_CHECK( E_OK == ercd, "rot_rdq bad ercd" );
373 CYG_TEST_CHECK( 2 == intercount, "intercount != 2" );
376 CYG_TEST_CHECK( E_OK == ercd, "sus_tsk bad ercd" );
377 intercom = 0; // bad data to T3
380 CYG_TEST_CHECK( E_OK == ercd, "rot_rdq bad ercd" );
381 ercd = sus_tsk( 3 ); // suspend AGAIN
382 CYG_TEST_CHECK( E_OK == ercd, "sus_tsk bad ercd" );
383 ercd = sus_tsk( 3 ); // AND AGAIN
384 CYG_TEST_CHECK( E_OK == ercd, "sus_tsk bad ercd" );
387 CYG_TEST_CHECK( E_OK == ercd, "rot_rdq bad ercd" );
388 CYG_TEST_CHECK( 2 == intercount, "intercount != 2" );
390 CYG_TEST_CHECK( E_OK == ercd, "rsm_tsk bad ercd" );
392 CYG_TEST_CHECK( E_OK == ercd, "rsm_tsk bad ercd" );
395 CYG_TEST_CHECK( E_OK == ercd, "rot_rdq bad ercd" );
396 CYG_TEST_CHECK( 2 == intercount, "intercount != 2" );
397 intercom = 3; // tell T3 to loop
399 ercd = rsm_tsk( 3 ); // expect restart this time
400 CYG_TEST_CHECK( E_OK == ercd, "rsm_tsk bad ercd" );
402 CYG_TEST_CHECK( E_OK == ercd, "rot_rdq bad ercd" );
404 CYG_TEST_CHECK( 3 == intercount, "intercount != 3" );
406 CYG_TEST_INFO( "Command task 3 inner loop stop 2" );
410 CYG_TEST_CHECK( E_OK == ercd, "rot_rdq bad ercd" );
411 CYG_TEST_CHECK( 3 == intercount, "intercount != 3" );
414 CYG_TEST_CHECK( E_OK == ercd, "sus_tsk bad ercd" );
415 intercom = 0; // bad data to T3
418 CYG_TEST_CHECK( E_OK == ercd, "rot_rdq bad ercd" );
419 CYG_TEST_CHECK( 3 == intercount, "intercount != 3" );
420 ercd = sus_tsk( 3 ); // suspend AGAIN
421 CYG_TEST_CHECK( E_OK == ercd, "sus_tsk bad ercd" );
422 ercd = sus_tsk( 3 ); // AND AGAIN
423 CYG_TEST_CHECK( E_OK == ercd, "sus_tsk bad ercd" );
426 CYG_TEST_CHECK( E_OK == ercd, "rot_rdq bad ercd" );
427 CYG_TEST_CHECK( 3 == intercount, "intercount != 3" );
428 intercom = 3; // tell T3 to loop
430 ercd = frsm_tsk( 3 ); // expect restart this time
431 CYG_TEST_CHECK( E_OK == ercd, "frsm_tsk bad ercd" );
433 CYG_TEST_CHECK( E_OK == ercd, "rot_rdq bad ercd" );
435 CYG_TEST_CHECK( 4 == intercount, "intercount != 4" );
438 ercd = rsm_tsk( 3 ); // try it again
439 CYG_TEST_CHECK( E_OBJ == ercd, "rsm_tsk bad ercd !E_OBJ" );
441 CYG_TEST_CHECK( E_OK == ercd, "rot_rdq bad ercd" );
443 CYG_TEST_CHECK( 5 == intercount, "intercount != 5" );
446 ercd = frsm_tsk( 3 ); // try it again
447 CYG_TEST_CHECK( E_OBJ == ercd, "frsm_tsk bad ercd !E_OBJ" );
449 CYG_TEST_CHECK( E_OK == ercd, "rot_rdq bad ercd" );
451 CYG_TEST_CHECK( 6 == intercount, "intercount != 6" );
453 CYG_TEST_INFO( "Command task 3 all loops stop" );
457 CYG_TEST_CHECK( E_OK == ercd, "rot_rdq bad ercd" );
460 CYG_TEST_CHECK( E_OK == ercd, "rot_rdq bad ercd" );
461 CYG_TEST_CHECK( 6 == intercount, "intercount != 6" );
463 intercom = intercount = 0;
465 CYG_TEST_PASS( "sus_tsk, rsm_tsk, frsm_tsk" );
467 CYG_TEST_INFO( "Testing sleep/wakeup stuff" );
468 #ifdef CYGSEM_UITRON_BAD_PARAMS_RETURN_ERRORS
469 ercd = wup_tsk( -6 );
470 CYG_TEST_CHECK( E_ID == ercd, "wup_tsk bad ercd !E_ID" );
471 ercd = wup_tsk( 99 );
472 CYG_TEST_CHECK( E_ID == ercd, "wup_tsk bad ercd !E_ID" );
473 ercd = can_wup( &scratch, -6 );
474 CYG_TEST_CHECK( E_ID == ercd, "can_wup bad ercd !E_ID" );
475 ercd = can_wup( &scratch, 99 );
476 CYG_TEST_CHECK( E_ID == ercd, "can_wup bad ercd !E_ID" );
477 #ifndef CYGSEM_UITRON_PARAMS_NULL_IS_GOOD_PTR
478 ercd = can_wup( NULL, 2 );
479 CYG_TEST_CHECK( E_PAR == ercd, "can_wup bad ercd !E_PAR" );
481 ercd = can_wup( NADR, 2 );
482 CYG_TEST_CHECK( E_PAR == ercd, "can_wup bad ercd !E_PAR" );
484 ercd = wup_tsk( 0 ); // not ourself
485 CYG_TEST_CHECK( E_ID == ercd, "wup_tsk bad ercd !E_ID" );
486 ercd = wup_tsk( 1 ); // ourself
487 CYG_TEST_CHECK( E_OBJ == ercd, "wup_tsk bad ercd !E_OBJ" );
488 #endif // we can test bad param error returns
490 #ifdef CYGSEM_UITRON_BAD_PARAMS_RETURN_ERRORS
491 ercd = tslp_tsk( -6 );
492 CYG_TEST_CHECK( E_PAR == ercd, "tslp_tsk bad ercd !E_PAR" );
493 #endif // we can test bad param error returns
494 ercd = tslp_tsk( TMO_POL );
495 CYG_TEST_CHECK( E_TMOUT == ercd, "tslp_tsk bad ercd !E_TMOUT" );
496 ercd = tslp_tsk( 5 );
497 CYG_TEST_CHECK( E_TMOUT == ercd, "tslp_tsk bad ercd !E_TMOUT" );
498 #ifdef CYGSEM_UITRON_BAD_PARAMS_RETURN_ERRORS
500 CYG_TEST_CHECK( E_OK == ercd, "dis_dsp bad ercd" );
501 ercd = tslp_tsk( TMO_FEVR );
502 CYG_TEST_CHECK( E_CTX == ercd, "tslp_tsk bad ercd !E_CTX" );
503 ercd = tslp_tsk( TMO_POL );
504 CYG_TEST_CHECK( E_CTX == ercd, "tslp_tsk bad ercd !E_CTX" );
505 ercd = tslp_tsk( 5 );
506 CYG_TEST_CHECK( E_CTX == ercd, "tslp_tsk bad ercd !E_CTX" );
508 CYG_TEST_CHECK( E_OK == ercd, "ena_dsp bad ercd" );
509 ercd = tslp_tsk( -6 );
510 CYG_TEST_CHECK( E_PAR == ercd, "tslp_tsk bad ercd !E_PAR" );
511 #endif // we can test bad param error returns
512 ercd = tslp_tsk( TMO_POL );
513 CYG_TEST_CHECK( E_TMOUT == ercd, "tslp_tsk bad ercd !E_TMOUT" );
514 ercd = tslp_tsk( 5 );
515 CYG_TEST_CHECK( E_TMOUT == ercd, "tslp_tsk bad ercd !E_TMOUT" );
517 // drop task 4 pri to same as us
519 intercom = 1; // test plain slp_tsk
521 ercd = chg_pri( 4, 5 );
522 CYG_TEST_CHECK( E_OBJ == ercd, "chg_pri bad ercd" );
525 CYG_TEST_CHECK( E_OK == ercd, "dis_dsp bad ercd" );
526 ercd = sta_tsk( 4, 77 );
527 CYG_TEST_CHECK( E_OK == ercd, "sta_tsk bad ercd" );
528 ercd = chg_pri( 4, 5 );
529 CYG_TEST_CHECK( E_OK == ercd, "chg_pri bad ercd" );
531 CYG_TEST_CHECK( E_OK == ercd, "ena_dsp bad ercd" );
534 CYG_TEST_CHECK( E_OK == ercd, "wup_tsk bad ercd" );
536 CYG_TEST_CHECK( E_OK == ercd, "rot_rdq bad ercd" );
538 CYG_TEST_CHECK( 1 == intercount, "intercount != 1" );
539 intercom = 2; // test tslp_tsk
542 CYG_TEST_CHECK( E_OK == ercd, "wup_tsk bad ercd" );
544 CYG_TEST_CHECK( E_OK == ercd, "rot_rdq bad ercd" );
546 CYG_TEST_CHECK( 2 == intercount, "intercount != 2" );
547 intercom = 3; // test tslp_tsk
550 CYG_TEST_CHECK( E_OK == ercd, "rot_rdq bad ercd" );
551 CYG_TEST_CHECK( 2 == intercount, "intercount != 2" );
552 intercom = 1; // test slp_tsk next...
553 ercd = dly_tsk( 20 ); // without a wup
554 CYG_TEST_CHECK( E_OK == ercd, "dly_tsk bad ercd" );
556 CYG_TEST_CHECK( 3 == intercount, "intercount != 3" );
558 intercom = 1; // ...test slp_tsk
560 ercd = dly_tsk( 20 ); // without a wup (yet)
561 CYG_TEST_CHECK( E_OK == ercd, "dly_tsk bad ercd" );
562 CYG_TEST_CHECK( 3 == intercount, "intercount != 3" );
564 ercd = tslp_tsk( 20 ); // yield again
565 CYG_TEST_CHECK( E_TMOUT == ercd, "tslp_tsk bad ercd !E_TMOUT" );
566 CYG_TEST_CHECK( 3 == intercount, "intercount != 3" );
568 ercd = rot_rdq( 0 ); // and again
569 CYG_TEST_CHECK( E_OK == ercd, "rot_rdq bad ercd" );
570 CYG_TEST_CHECK( 3 == intercount, "intercount != 3" );
572 ercd = wup_tsk( 4 ); // now issue a wup
573 CYG_TEST_CHECK( E_OK == ercd, "wup_tsk bad ercd" );
574 ercd = rot_rdq( 0 ); // and yield
575 CYG_TEST_CHECK( E_OK == ercd, "rot_rdq bad ercd" );
577 CYG_TEST_CHECK( 4 == intercount, "intercount != 4" );
579 intercom = 1; // test slp_tsk
581 ercd = dly_tsk( 20 ); // without a wup (yet)
582 CYG_TEST_CHECK( E_OK == ercd, "dly_tsk bad ercd" );
583 CYG_TEST_CHECK( 4 == intercount, "intercount != 4" );
585 // this wup will restart it when we yield:
587 ercd = wup_tsk( 4 ); // now issue a wup
588 CYG_TEST_CHECK( E_OK == ercd, "wup_tsk bad ercd" );
589 // these will count up:
590 ercd = wup_tsk( 4 ); // now issue a wup
591 CYG_TEST_CHECK( E_OK == ercd, "wup_tsk bad ercd" );
592 ercd = wup_tsk( 4 ); // now issue a wup
593 CYG_TEST_CHECK( E_OK == ercd, "wup_tsk bad ercd" );
595 ercd = can_wup( &scratch, 4 );
596 CYG_TEST_CHECK( E_OK == ercd, "can_wup bad ercd" );
597 CYG_TEST_CHECK( 2 == scratch, "Cancelled wups not 2" );
598 CYG_TEST_CHECK( 4 == intercount, "intercount != 4" );
601 intercom = 4; // do nothing
603 ercd = rot_rdq( 0 ); // and yield
604 CYG_TEST_CHECK( E_OK == ercd, "rot_rdq bad ercd" );
606 CYG_TEST_CHECK( 5 == intercount, "intercount != 5" );
608 ercd = dly_tsk( 20 ); // let it do nothing
609 CYG_TEST_CHECK( E_OK == ercd, "dly_tsk bad ercd" );
612 ercd = wup_tsk( 4 ); // now issue a wup
613 CYG_TEST_CHECK( E_OK == ercd, "wup_tsk bad ercd" );
615 ercd = wup_tsk( 4 ); // now issue a wup
616 CYG_TEST_CHECK( E_OK == ercd, "wup_tsk bad ercd" );
618 ercd = wup_tsk( 4 ); // now issue a wup
619 CYG_TEST_CHECK( E_OK == ercd, "wup_tsk bad ercd" );
621 ercd = dly_tsk( 20 ); // lots of wups but no sleep
622 CYG_TEST_CHECK( E_OK == ercd, "dly_tsk bad ercd" );
623 CYG_TEST_CHECK( 5 == intercount, "intercount != 5" );
625 ercd = can_wup( &scratch, 4 );
626 CYG_TEST_CHECK( E_OK == ercd, "can_wup bad ercd" );
627 CYG_TEST_CHECK( 3 == scratch, "Cancelled wups not 3" );
628 // now check that they are cancelled by doing a wait again
629 intercom = 1; // test slp_tsk
631 ercd = rot_rdq( 0 ); // still without a wup
632 CYG_TEST_CHECK( E_OK == ercd, "rot_rdq bad ercd" );
634 ercd = rot_rdq( 0 ); // still without a wup
635 CYG_TEST_CHECK( E_OK == ercd, "rot_rdq bad ercd" );
636 intercom = 4; // do nothing next
639 CYG_TEST_CHECK( 6 == intercount, "intercount != 6" );
640 ercd = rot_rdq( 0 ); // still without a wup
641 CYG_TEST_CHECK( E_OK == ercd, "rot_rdq bad ercd" );
642 CYG_TEST_CHECK( 6 == intercount, "intercount != 6" );
644 ercd = wup_tsk( 4 ); // now issue a wup
645 CYG_TEST_CHECK( E_OK == ercd, "wup_tsk bad ercd" );
646 ercd = rot_rdq( 0 ); // it will run now
647 CYG_TEST_CHECK( E_OK == ercd, "wup_tsk bad ercd" );
649 ercd = rot_rdq( 0 ); // it will run now
650 CYG_TEST_CHECK( E_OK == ercd, "rot_rdq bad ercd" );
652 CYG_TEST_CHECK( 7 == intercount, "intercount != 7" );
655 intercom = 99; // exit, all done
656 ercd = rot_rdq( 0 ); // let it run
657 CYG_TEST_CHECK( E_OK == ercd, "rot_rdq bad ercd" );
659 CYG_TEST_CHECK( 8 == intercount, "intercount != 8" );
662 ercd = rot_rdq( 0 ); // let it run
663 CYG_TEST_CHECK( E_OK == ercd, "rot_rdq bad ercd" );
664 CYG_TEST_CHECK( 8 == intercount, "intercount != 8" );
666 CYG_TEST_PASS( "wup_tsk, can_wup, slp_tsk, tslp_tsk" );
668 #ifdef CYG_TEST_UITRON_TEST1_LOOPING
678 #endif // CYG_TEST_UITRON_TEST1_LOOPING
680 CYG_TEST_EXIT( "All done" );
686 void task2( unsigned int arg )
689 CYG_TEST_PASS( "Task 2 running" );
690 ercd = get_tid( &scratch );
691 CYG_TEST_CHECK( E_OK == ercd, "get_tid bad ercd" );
692 CYG_TEST_CHECK( 2 == scratch, "tid not 2" );
694 CYG_TEST_FAIL( "Task 2 arg not 99" );
696 CYG_TEST_FAIL( "Task 2 failed to exit" );
699 void task3( unsigned int arg )
703 CYG_TEST_PASS("Task3 running");
704 ercd = get_tid( &scratch );
705 CYG_TEST_CHECK( E_OK == ercd, "get_tid bad ercd" );
706 CYG_TEST_CHECK( 3 == scratch, "tid not 3" );
708 CYG_TEST_FAIL( "Task 3 arg not 66" );
710 while ( 2 & intercom ) {
711 while ( 1 & intercom ) {
716 ercd = rot_rdq( 0 ); // yield()
718 CYG_TEST_CHECK( E_OK == ercd, "rot_rdq 1 (task3) bad ercd" );
721 CYG_TEST_CHECK( 4 & intercom, "should not have got here yet 1" );
725 ercd = rot_rdq( 0 ); // yield()
727 CYG_TEST_CHECK( E_OK == ercd, "rot_rdq 2 (task3) bad ercd" );
730 CYG_TEST_CHECK( 8 & intercom, "should not have got here yet 2" );
734 CYG_TEST_FAIL( "Task 3 failed to exit" );
737 void task4( unsigned int arg )
740 CYG_TEST_PASS("Task4 running");
741 ercd = get_tid( &scratch );
742 CYG_TEST_CHECK( E_OK == ercd, "get_tid bad ercd" );
743 CYG_TEST_CHECK( 4 == scratch, "tid not 4" );
745 CYG_TEST_FAIL( "Task 4 arg not 77" );
747 switch ( intercom ) {
750 CYG_TEST_CHECK( E_OK == ercd, "slp_tsk (task4) bad ercd" );
753 ercd = tslp_tsk( 10 );
754 CYG_TEST_CHECK( E_OK == ercd, "slp_tsk (task4) bad ercd" );
757 ercd = tslp_tsk( 10 );
758 CYG_TEST_CHECK( E_TMOUT == ercd,
759 "slp_tsk (task4) bad ercd !E_TMOUT" );
763 while ( 4 == intercom ) {
765 CYG_TEST_CHECK( E_OK == ercd,
766 "rot_rdq (task4 idle) bad ercd" );
772 CYG_TEST_FAIL( "Task 4 bad intercom" );
778 ercd = rot_rdq( 0 ); // yield()
779 CYG_TEST_CHECK( E_OK == ercd, "rot_rdq (task4) bad ercd" );
784 CYG_TEST_FAIL( "Task 4 failed to exit" );
787 #else // not enough (or too many) uITRON objects configured in
788 #define N_A_MSG "not enough uITRON objects to run test"
789 #endif // not enough (or too many) uITRON objects configured in
790 #else // not C++ and some C++ specific options enabled
791 #define N_A_MSG "C++ specific options selected but this is C"
792 #endif // not C++ and some C++ specific options enabled
793 #else // ! CYGVAR_KERNEL_COUNTERS_CLOCK - can't test without it
794 #define N_A_MSG "no CYGVAR_KERNEL_COUNTERS_CLOCK"
795 #endif // ! CYGVAR_KERNEL_COUNTERS_CLOCK - can't test without it
796 #else // ! CYGFUN_KERNEL_THREADS_TIMER - can't test without it
797 #define N_A_MSG "no CYGFUN_KERNEL_THREADS_TIMER"
798 #endif // ! CYGFUN_KERNEL_THREADS_TIMER - can't test without it
799 #else // ! CYGIMP_THREAD_PRIORITY - can't test without it
800 #define N_A_MSG "no CYGSEM_KERNEL_SCHED_MLQUEUE"
801 #endif // ! CYGSEM_KERNEL_SCHED_MLQUEUE - can't test without it
802 #else // ! CYGPKG_UITRON
803 #define N_A_MSG "uITRON Compatibility layer disabled"
804 #endif // CYGPKG_UITRON
811 CYG_TEST_NA( N_A_MSG );
813 #endif // N_A_MSG defined ie. we are N/A.