1 //===========================================================================
5 // uITRON "C++" test program
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;
101 void task1( unsigned int arg );
102 void task2( unsigned int arg );
103 void task3( unsigned int arg );
104 void task4( unsigned int arg );
108 #ifndef CYGSEM_KERNEL_SCHED_TIMESLICE
109 #define TIMESLICEMSG "Assuming no kernel timeslicing"
111 #define TSRELEASE() CYG_EMPTY_STATEMENT
112 #define TSSTOP() CYG_EMPTY_STATEMENT
113 #define TSLOCK() CYG_EMPTY_STATEMENT
114 #define TSUNLOCK() CYG_EMPTY_STATEMENT
115 #define ICWAIT( _i_ ) CYG_EMPTY_STATEMENT
118 // Now follow some nasty bodges to control the scheduling when basically it
119 // isn't controlled ie. timeslicing is on. It's bodgy because we're
120 // testing normal synchronization methods, so we shouldn't rely on them for
121 // comms between threads here. Instead there's a mixture of communicating
122 // via a flag (ts_interlock) which stops the "controlled" thread running
123 // away, and waiting for the controlled thread to run enough for us.
125 // Tasks 3 and 4 are waited for by the control task: task 3 locks the
126 // scheduler so is immediately descheduled when it unlocks it, task 4 does
127 // waiting-type operations, so we must give it chance to run by yielding a
128 // few times ourselves. Note the plain constant in ICWAIT() below.
130 #define TIMESLICEMSG "Assuming kernel timeslicing ENABLED"
131 volatile int ts_interlock = 0;
132 #define TSGO() (ts_interlock)
133 #define TSRELEASE() ts_interlock = 1
134 #define TSSTOP() ts_interlock = 0
136 #define TSLOCK() CYG_MACRO_START \
137 ER ercd2 = dis_dsp(); \
138 CYG_TEST_CHECK( E_OK == ercd2, "dis_dsp (TSLOCK) bad ercd2" ); \
141 #define TSUNLOCK() CYG_MACRO_START \
142 ER ercd3 = ena_dsp(); \
143 CYG_TEST_CHECK( E_OK == ercd3, "ena_dsp (TSUNLOCK) bad ercd3" ); \
146 #define ICWAIT( _i_ ) CYG_MACRO_START \
148 for ( loops = 3; (0 < loops) || ((_i_) > intercount); loops-- ) { \
149 ER ercd4 = rot_rdq( 0 ); /* yield */ \
150 CYG_TEST_CHECK( E_OK == ercd4, "rot_rdq (ICWAIT) bad ercd4" ); \
153 #endif // CYGSEM_KERNEL_SCHED_TIMESLICE
158 static char *msgs[] = { "ZERO", "ONE", "TWO", "THREE", "FOUR", "LOTS" }; \
159 CYG_TEST_INFO( msgs[ intercount > 5 ? 5 : intercount ] ); \
163 // #define CYG_TEST_UITRON_TEST1_LOOPING 1
165 void task1( unsigned int arg )
170 #ifdef CYG_TEST_UITRON_TEST1_LOOPING
172 #endif // CYG_TEST_UITRON_TEST1_LOOPING
174 CYG_TEST_INFO( "Task 1 running" );
175 CYG_TEST_INFO( TIMESLICEMSG );
180 CYG_TEST_INFO( "Testing get_tid and ref_tsk" );
181 ercd = get_tid( &scratch );
182 CYG_TEST_CHECK( E_OK == ercd, "get_tid bad ercd" );
183 CYG_TEST_CHECK( 1 == scratch, "tid not 1" );
184 #ifdef CYGSEM_UITRON_BAD_PARAMS_RETURN_ERRORS
185 #ifndef CYGSEM_UITRON_PARAMS_NULL_IS_GOOD_PTR
186 ercd = get_tid( NULL );
187 CYG_TEST_CHECK( E_PAR == ercd, "get_tid bad ercd !E_PAR" );
189 ercd = ref_tsk( &ref_tskd, -6 );
190 CYG_TEST_CHECK( E_ID == ercd, "ref_tsk bad ercd !E_ID" );
191 ercd = ref_tsk( &ref_tskd, 99 );
192 CYG_TEST_CHECK( E_ID == ercd, "ref_tsk bad ercd !E_ID" );
193 #ifndef CYGSEM_UITRON_PARAMS_NULL_IS_GOOD_PTR
194 ercd = ref_tsk( NULL, 1 );
195 CYG_TEST_CHECK( E_PAR == ercd, "ref_tsk bad ercd !E_PAR" );
197 #endif // we can test bad param error returns
198 ercd = ref_tsk( &ref_tskd, 1 );
199 CYG_TEST_CHECK( E_OK == ercd, "ref_tsk bad ercd" );
200 CYG_TEST_CHECK( TTS_RUN == ref_tskd.tskstat, "Bad task status 1" );
201 ercd = ref_tsk( &ref_tskd, 0 );
202 CYG_TEST_CHECK( E_OK == ercd, "ref_tsk bad ercd" );
203 CYG_TEST_CHECK( TTS_RUN == ref_tskd.tskstat, "Bad task status 0" );
204 ercd = ref_tsk( &ref_tskd, 2 );
205 CYG_TEST_CHECK( E_OK == ercd, "ref_tsk bad ercd" );
206 CYG_TEST_CHECK( TTS_DMT == ref_tskd.tskstat, "Bad task status 2" );
207 CYG_TEST_CHECK( 2 == ref_tskd.tskpri, "Bad task prio 2" );
210 CYG_TEST_CHECK( E_OBJ == ercd, "rsm_tsk DMT bad ercd !E_OBJ" );
211 ercd = frsm_tsk( 2 );
212 CYG_TEST_CHECK( E_OBJ == ercd, "frsm_tsk DMT bad ercd !E_OBJ" );
214 CYG_TEST_CHECK( E_OBJ == ercd, "rel_wai DMT bad ercd !E_OBJ" );
216 CYG_TEST_CHECK( E_OBJ == ercd, "sus_tsk DMT bad ercd !E_OBJ" );
218 CYG_TEST_CHECK( E_OBJ == ercd, "wup_tsk DMT bad ercd !E_OBJ" );
219 ercd = can_wup( &scratch, 2 );
220 CYG_TEST_CHECK( E_OBJ == ercd, "can_wup DMT bad ercd !E_OBJ" );
222 CYG_TEST_PASS( "get_tid, ref_tsk" );
224 CYG_TEST_INFO( "Testing prio change and start task" );
225 ercd = sta_tsk( 2, 99 );
226 CYG_TEST_CHECK( E_OK == ercd, "sta_tsk bad ercd" );
228 // drop pri of task 2
229 ercd = chg_pri( 2, 4 );
230 CYG_TEST_CHECK( E_OK == ercd, "chg_pri bad ercd" );
231 ercd = ref_tsk( &ref_tskd, 2 );
232 CYG_TEST_CHECK( E_OK == ercd, "ref_tsk bad ercd" );
233 CYG_TEST_CHECK( TTS_RDY == ref_tskd.tskstat, "Bad task status 2" );
234 CYG_TEST_CHECK( 4 == ref_tskd.tskpri, "Bad task prio 2" );
236 // drop our pri below task 2
237 ercd = chg_pri( 0, 5 );
238 CYG_TEST_CHECK( E_OK == ercd, "chg_pri bad ercd" );
240 ercd = ref_tsk( &ref_tskd, 1 );
241 CYG_TEST_CHECK( E_OK == ercd, "ref_tsk bad ercd" );
242 CYG_TEST_CHECK( 5 == ref_tskd.tskpri, "Bad task prio 1" );
243 ercd = ref_tsk( &ref_tskd, 0 );
244 CYG_TEST_CHECK( E_OK == ercd, "ref_tsk bad ercd" );
245 CYG_TEST_CHECK( 5 == ref_tskd.tskpri, "Bad task prio 0" );
246 ercd = ref_tsk( &ref_tskd, 2 );
247 CYG_TEST_CHECK( E_OK == ercd, "ref_tsk bad ercd" );
248 // it will have run to completion and regained its original prio
249 CYG_TEST_CHECK( 2 == ref_tskd.tskpri, "Bad task prio 2" );
250 CYG_TEST_CHECK( TTS_DMT == ref_tskd.tskstat, "Bad task status 2" );
252 // retest these now that the task has executed once
254 CYG_TEST_CHECK( E_OBJ == ercd, "rsm_tsk DMT bad ercd !E_OBJ" );
255 ercd = frsm_tsk( 2 );
256 CYG_TEST_CHECK( E_OBJ == ercd, "frsm_tsk DMT bad ercd !E_OBJ" );
258 CYG_TEST_CHECK( E_OBJ == ercd, "rel_wai DMT bad ercd !E_OBJ" );
260 CYG_TEST_CHECK( E_OBJ == ercd, "sus_tsk DMT bad ercd !E_OBJ" );
262 CYG_TEST_CHECK( E_OBJ == ercd, "wup_tsk DMT bad ercd !E_OBJ" );
263 ercd = can_wup( &scratch, 2 );
264 CYG_TEST_CHECK( E_OBJ == ercd, "can_wup DMT bad ercd !E_OBJ" );
266 #ifdef CYGSEM_UITRON_BAD_PARAMS_RETURN_ERRORS
267 ercd = chg_pri( -6, 9 );
268 CYG_TEST_CHECK( E_ID == ercd, "chg_pri bad ercd !E_ID" );
269 ercd = chg_pri( 99, 9 );
270 CYG_TEST_CHECK( E_ID == ercd, "chg_pri bad ercd !E_ID" );
271 ercd = sta_tsk( -6, 99 );
272 CYG_TEST_CHECK( E_ID == ercd, "sta_tsk bad ercd !E_ID" );
273 ercd = sta_tsk( 99, 99 );
274 CYG_TEST_CHECK( E_ID == ercd, "sta_tsk bad ercd !E_ID" );
275 #endif // we can test bad param error returns
277 CYG_TEST_PASS( "sta_tsk, chg_pri" );
279 CYG_TEST_INFO( "Testing delay and dispatch disabling" );
280 ercd = dly_tsk( 10 );
281 CYG_TEST_CHECK( E_OK == ercd, "dly_tsk bad ercd" );
283 CYG_TEST_CHECK( E_OK == ercd, "ena_dsp bad ercd" );
284 ercd = dly_tsk( 10 );
285 CYG_TEST_CHECK( E_OK == ercd, "dly_tsk bad ercd" );
287 CYG_TEST_CHECK( E_OK == ercd, "dis_dsp bad ercd" );
288 #ifdef CYGSEM_UITRON_BAD_PARAMS_RETURN_ERRORS
289 ercd = dly_tsk( 10 );
290 CYG_TEST_CHECK( E_CTX == ercd, "dly_tsk bad ercd !E_CTX" );
292 CYG_TEST_CHECK( E_OK == ercd, "dis_dsp bad ercd" );
293 ercd = dly_tsk( 10 );
294 CYG_TEST_CHECK( E_CTX == ercd, "dly_tsk bad ercd !E_CTX" );
295 #endif // we can test bad param error returns
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_CHECK( E_OK == ercd, "ena_dsp bad ercd" );
302 ercd = dly_tsk( 10 );
303 CYG_TEST_CHECK( E_OK == ercd, "dly_tsk bad ercd" );
305 CYG_TEST_PASS( "dly_tsk, ena_dsp, dis_dsp" );
307 CYG_TEST_INFO( "Testing ready queue manipulation" );
309 CYG_TEST_CHECK( E_OK == ercd, "rot_rdq bad ercd" );
311 CYG_TEST_CHECK( E_OK == ercd, "rot_rdq bad ercd" );
313 CYG_TEST_CHECK( E_OK == ercd, "rot_rdq bad ercd" );
314 #ifdef CYGSEM_UITRON_BAD_PARAMS_RETURN_ERRORS
315 ercd = rot_rdq( -6 );
316 CYG_TEST_CHECK( E_PAR == ercd, "rot_rdq bad ercd !E_PAR" );
317 ercd = rot_rdq( 99 );
318 CYG_TEST_CHECK( E_PAR == ercd, "rot_rdq bad ercd !E_PAR" );
319 #endif // we can test bad param error returns
321 CYG_TEST_PASS( "rot_rdq" );
323 CYG_TEST_INFO( "Testing suspend/resume" );
324 #ifdef CYGSEM_UITRON_BAD_PARAMS_RETURN_ERRORS
325 ercd = sus_tsk( -6 );
326 CYG_TEST_CHECK( E_ID == ercd, "sus_tsk bad ercd !E_ID" );
327 ercd = sus_tsk( 99 );
328 CYG_TEST_CHECK( E_ID == ercd, "sus_tsk bad ercd !E_ID" );
329 ercd = rsm_tsk( -6 );
330 CYG_TEST_CHECK( E_ID == ercd, "rsm_tsk bad ercd !E_ID" );
331 ercd = rsm_tsk( 99 );
332 CYG_TEST_CHECK( E_ID == ercd, "rsm_tsk bad ercd !E_ID" );
333 ercd = frsm_tsk( -6 );
334 CYG_TEST_CHECK( E_ID == ercd, "frsm_tsk bad ercd !E_ID" );
335 ercd = frsm_tsk( 99 );
336 CYG_TEST_CHECK( E_ID == ercd, "frsm_tsk bad ercd !E_ID" );
337 #endif // we can test bad param error returns
338 // drop task 3 pri to same as us
339 CYG_TEST_CHECK( 0 == intercount, "intercount != 0" );
341 intercom = 3; // tell T3 to loop
344 CYG_TEST_CHECK( E_OK == ercd, "dis_dsp bad ercd" );
345 ercd = sta_tsk( 3, 66 );
346 CYG_TEST_CHECK( E_OK == ercd, "sta_tsk bad ercd" );
347 ercd = chg_pri( 3, 5 );
348 CYG_TEST_CHECK( E_OK == ercd, "chg_pri bad ercd" );
350 CYG_TEST_CHECK( E_OK == ercd, "ena_dsp bad ercd" );
353 CYG_TEST_CHECK( E_OK == ercd, "rot_rdq bad ercd" );
355 CYG_TEST_CHECK( 1 == intercount, "intercount != 1" );
358 CYG_TEST_CHECK( E_OK == ercd, "sus_tsk bad ercd" );
359 intercom = 0; // bad data to T3
361 CYG_TEST_CHECK( E_OK == ercd, "rot_rdq bad ercd" );
362 CYG_TEST_CHECK( 1 == intercount, "intercount != 1" );
363 intercom = 3; // tell T3 to loop
366 CYG_TEST_CHECK( E_OK == ercd, "rsm_tsk bad ercd" );
368 CYG_TEST_CHECK( E_OK == ercd, "rot_rdq bad ercd" );
370 CYG_TEST_CHECK( 2 == intercount, "intercount != 2" );
372 CYG_TEST_INFO( "Command task 3 inner loop stop" );
376 CYG_TEST_CHECK( E_OK == ercd, "rot_rdq bad ercd" );
377 CYG_TEST_CHECK( 2 == intercount, "intercount != 2" );
380 CYG_TEST_CHECK( E_OK == ercd, "sus_tsk bad ercd" );
381 intercom = 0; // bad data to T3
384 CYG_TEST_CHECK( E_OK == ercd, "rot_rdq bad ercd" );
385 ercd = sus_tsk( 3 ); // suspend AGAIN
386 CYG_TEST_CHECK( E_OK == ercd, "sus_tsk bad ercd" );
387 ercd = sus_tsk( 3 ); // AND AGAIN
388 CYG_TEST_CHECK( E_OK == ercd, "sus_tsk bad ercd" );
391 CYG_TEST_CHECK( E_OK == ercd, "rot_rdq bad ercd" );
392 CYG_TEST_CHECK( 2 == intercount, "intercount != 2" );
394 CYG_TEST_CHECK( E_OK == ercd, "rsm_tsk bad ercd" );
396 CYG_TEST_CHECK( E_OK == ercd, "rsm_tsk bad ercd" );
399 CYG_TEST_CHECK( E_OK == ercd, "rot_rdq bad ercd" );
400 CYG_TEST_CHECK( 2 == intercount, "intercount != 2" );
401 intercom = 3; // tell T3 to loop
403 ercd = rsm_tsk( 3 ); // expect restart this time
404 CYG_TEST_CHECK( E_OK == ercd, "rsm_tsk bad ercd" );
406 CYG_TEST_CHECK( E_OK == ercd, "rot_rdq bad ercd" );
408 CYG_TEST_CHECK( 3 == intercount, "intercount != 3" );
410 CYG_TEST_INFO( "Command task 3 inner loop stop 2" );
414 CYG_TEST_CHECK( E_OK == ercd, "rot_rdq bad ercd" );
415 CYG_TEST_CHECK( 3 == intercount, "intercount != 3" );
418 CYG_TEST_CHECK( E_OK == ercd, "sus_tsk bad ercd" );
419 intercom = 0; // bad data to T3
422 CYG_TEST_CHECK( E_OK == ercd, "rot_rdq bad ercd" );
423 CYG_TEST_CHECK( 3 == intercount, "intercount != 3" );
424 ercd = sus_tsk( 3 ); // suspend AGAIN
425 CYG_TEST_CHECK( E_OK == ercd, "sus_tsk bad ercd" );
426 ercd = sus_tsk( 3 ); // AND AGAIN
427 CYG_TEST_CHECK( E_OK == ercd, "sus_tsk bad ercd" );
430 CYG_TEST_CHECK( E_OK == ercd, "rot_rdq bad ercd" );
431 CYG_TEST_CHECK( 3 == intercount, "intercount != 3" );
432 intercom = 3; // tell T3 to loop
434 ercd = frsm_tsk( 3 ); // expect restart this time
435 CYG_TEST_CHECK( E_OK == ercd, "frsm_tsk bad ercd" );
437 CYG_TEST_CHECK( E_OK == ercd, "rot_rdq bad ercd" );
439 CYG_TEST_CHECK( 4 == intercount, "intercount != 4" );
442 ercd = rsm_tsk( 3 ); // try it again
443 CYG_TEST_CHECK( E_OBJ == ercd, "rsm_tsk bad ercd !E_OBJ" );
445 CYG_TEST_CHECK( E_OK == ercd, "rot_rdq bad ercd" );
447 CYG_TEST_CHECK( 5 == intercount, "intercount != 5" );
450 ercd = frsm_tsk( 3 ); // try it again
451 CYG_TEST_CHECK( E_OBJ == ercd, "frsm_tsk bad ercd !E_OBJ" );
453 CYG_TEST_CHECK( E_OK == ercd, "rot_rdq bad ercd" );
455 CYG_TEST_CHECK( 6 == intercount, "intercount != 6" );
457 CYG_TEST_INFO( "Command task 3 all loops stop" );
461 CYG_TEST_CHECK( E_OK == ercd, "rot_rdq bad ercd" );
464 CYG_TEST_CHECK( E_OK == ercd, "rot_rdq bad ercd" );
465 CYG_TEST_CHECK( 6 == intercount, "intercount != 6" );
467 intercom = intercount = 0;
469 CYG_TEST_PASS( "sus_tsk, rsm_tsk, frsm_tsk" );
471 CYG_TEST_INFO( "Testing sleep/wakeup stuff" );
472 #ifdef CYGSEM_UITRON_BAD_PARAMS_RETURN_ERRORS
473 ercd = wup_tsk( -6 );
474 CYG_TEST_CHECK( E_ID == ercd, "wup_tsk bad ercd !E_ID" );
475 ercd = wup_tsk( 99 );
476 CYG_TEST_CHECK( E_ID == ercd, "wup_tsk bad ercd !E_ID" );
477 ercd = can_wup( &scratch, -6 );
478 CYG_TEST_CHECK( E_ID == ercd, "can_wup bad ercd !E_ID" );
479 ercd = can_wup( &scratch, 99 );
480 CYG_TEST_CHECK( E_ID == ercd, "can_wup bad ercd !E_ID" );
481 #ifndef CYGSEM_UITRON_PARAMS_NULL_IS_GOOD_PTR
482 ercd = can_wup( NULL, 2 );
483 CYG_TEST_CHECK( E_PAR == ercd, "can_wup bad ercd !E_PAR" );
486 ercd = wup_tsk( 0 ); // not ourself
487 CYG_TEST_CHECK( E_ID == ercd, "wup_tsk bad ercd !E_ID" );
488 ercd = wup_tsk( 1 ); // ourself
489 CYG_TEST_CHECK( E_OBJ == ercd, "wup_tsk bad ercd !E_OBJ" );
490 #endif // we can test bad param error returns
492 #ifdef CYGSEM_UITRON_BAD_PARAMS_RETURN_ERRORS
493 ercd = tslp_tsk( -6 );
494 CYG_TEST_CHECK( E_PAR == ercd, "tslp_tsk bad ercd !E_PAR" );
495 #endif // we can test bad param error returns
496 ercd = tslp_tsk( TMO_POL );
497 CYG_TEST_CHECK( E_TMOUT == ercd, "tslp_tsk bad ercd !E_TMOUT" );
498 ercd = tslp_tsk( 5 );
499 CYG_TEST_CHECK( E_TMOUT == ercd, "tslp_tsk bad ercd !E_TMOUT" );
500 #ifdef CYGSEM_UITRON_BAD_PARAMS_RETURN_ERRORS
502 CYG_TEST_CHECK( E_OK == ercd, "dis_dsp bad ercd" );
503 ercd = tslp_tsk( TMO_FEVR );
504 CYG_TEST_CHECK( E_CTX == ercd, "tslp_tsk bad ercd !E_CTX" );
505 ercd = tslp_tsk( TMO_POL );
506 CYG_TEST_CHECK( E_CTX == ercd, "tslp_tsk bad ercd !E_CTX" );
507 ercd = tslp_tsk( 5 );
508 CYG_TEST_CHECK( E_CTX == ercd, "tslp_tsk bad ercd !E_CTX" );
510 CYG_TEST_CHECK( E_OK == ercd, "ena_dsp bad ercd" );
511 ercd = tslp_tsk( -6 );
512 CYG_TEST_CHECK( E_PAR == ercd, "tslp_tsk bad ercd !E_PAR" );
513 #endif // we can test bad param error returns
514 ercd = tslp_tsk( TMO_POL );
515 CYG_TEST_CHECK( E_TMOUT == ercd, "tslp_tsk bad ercd !E_TMOUT" );
516 ercd = tslp_tsk( 5 );
517 CYG_TEST_CHECK( E_TMOUT == ercd, "tslp_tsk bad ercd !E_TMOUT" );
519 // drop task 4 pri to same as us
521 intercom = 1; // test plain slp_tsk
523 ercd = chg_pri( 4, 5 );
524 CYG_TEST_CHECK( E_OBJ == ercd, "chg_pri bad ercd" );
527 CYG_TEST_CHECK( E_OK == ercd, "dis_dsp bad ercd" );
528 ercd = sta_tsk( 4, 77 );
529 CYG_TEST_CHECK( E_OK == ercd, "sta_tsk bad ercd" );
530 ercd = chg_pri( 4, 5 );
531 CYG_TEST_CHECK( E_OK == ercd, "chg_pri bad ercd" );
533 CYG_TEST_CHECK( E_OK == ercd, "ena_dsp bad ercd" );
536 CYG_TEST_CHECK( E_OK == ercd, "wup_tsk bad ercd" );
538 CYG_TEST_CHECK( E_OK == ercd, "rot_rdq bad ercd" );
540 CYG_TEST_CHECK( 1 == intercount, "intercount != 1" );
541 intercom = 2; // test tslp_tsk
544 CYG_TEST_CHECK( E_OK == ercd, "wup_tsk bad ercd" );
546 CYG_TEST_CHECK( E_OK == ercd, "rot_rdq bad ercd" );
548 CYG_TEST_CHECK( 2 == intercount, "intercount != 2" );
549 intercom = 3; // test tslp_tsk
552 CYG_TEST_CHECK( E_OK == ercd, "rot_rdq bad ercd" );
553 CYG_TEST_CHECK( 2 == intercount, "intercount != 2" );
554 intercom = 1; // test slp_tsk next...
555 ercd = dly_tsk( 20 ); // without a wup
556 CYG_TEST_CHECK( E_OK == ercd, "dly_tsk bad ercd" );
558 CYG_TEST_CHECK( 3 == intercount, "intercount != 3" );
560 intercom = 1; // ...test slp_tsk
562 ercd = dly_tsk( 20 ); // without a wup (yet)
563 CYG_TEST_CHECK( E_OK == ercd, "dly_tsk bad ercd" );
564 CYG_TEST_CHECK( 3 == intercount, "intercount != 3" );
566 ercd = tslp_tsk( 20 ); // yield again
567 CYG_TEST_CHECK( E_TMOUT == ercd, "tslp_tsk bad ercd !E_TMOUT" );
568 CYG_TEST_CHECK( 3 == intercount, "intercount != 3" );
570 ercd = rot_rdq( 0 ); // and again
571 CYG_TEST_CHECK( E_OK == ercd, "rot_rdq bad ercd" );
572 CYG_TEST_CHECK( 3 == intercount, "intercount != 3" );
574 ercd = wup_tsk( 4 ); // now issue a wup
575 CYG_TEST_CHECK( E_OK == ercd, "wup_tsk bad ercd" );
576 ercd = rot_rdq( 0 ); // and yield
577 CYG_TEST_CHECK( E_OK == ercd, "rot_rdq bad ercd" );
579 CYG_TEST_CHECK( 4 == intercount, "intercount != 4" );
581 intercom = 1; // test slp_tsk
583 ercd = dly_tsk( 20 ); // without a wup (yet)
584 CYG_TEST_CHECK( E_OK == ercd, "dly_tsk bad ercd" );
585 CYG_TEST_CHECK( 4 == intercount, "intercount != 4" );
587 // this wup will restart it when we yield:
589 ercd = wup_tsk( 4 ); // now issue a wup
590 CYG_TEST_CHECK( E_OK == ercd, "wup_tsk bad ercd" );
591 // these will count up:
592 ercd = wup_tsk( 4 ); // now issue a wup
593 CYG_TEST_CHECK( E_OK == ercd, "wup_tsk bad ercd" );
594 ercd = wup_tsk( 4 ); // now issue a wup
595 CYG_TEST_CHECK( E_OK == ercd, "wup_tsk bad ercd" );
597 ercd = can_wup( &scratch, 4 );
598 CYG_TEST_CHECK( E_OK == ercd, "can_wup bad ercd" );
599 CYG_TEST_CHECK( 2 == scratch, "Cancelled wups not 2" );
600 CYG_TEST_CHECK( 4 == intercount, "intercount != 4" );
603 intercom = 4; // do nothing
605 ercd = rot_rdq( 0 ); // and yield
606 CYG_TEST_CHECK( E_OK == ercd, "rot_rdq bad ercd" );
608 CYG_TEST_CHECK( 5 == intercount, "intercount != 5" );
610 ercd = dly_tsk( 20 ); // let it do nothing
611 CYG_TEST_CHECK( E_OK == ercd, "dly_tsk bad ercd" );
614 ercd = wup_tsk( 4 ); // now issue a wup
615 CYG_TEST_CHECK( E_OK == ercd, "wup_tsk bad ercd" );
617 ercd = wup_tsk( 4 ); // now issue a wup
618 CYG_TEST_CHECK( E_OK == ercd, "wup_tsk bad ercd" );
620 ercd = wup_tsk( 4 ); // now issue a wup
621 CYG_TEST_CHECK( E_OK == ercd, "wup_tsk bad ercd" );
623 ercd = dly_tsk( 20 ); // lots of wups but no sleep
624 CYG_TEST_CHECK( E_OK == ercd, "dly_tsk bad ercd" );
625 CYG_TEST_CHECK( 5 == intercount, "intercount != 5" );
627 ercd = can_wup( &scratch, 4 );
628 CYG_TEST_CHECK( E_OK == ercd, "can_wup bad ercd" );
629 CYG_TEST_CHECK( 3 == scratch, "Cancelled wups not 3" );
630 // now check that they are cancelled by doing a wait again
631 intercom = 1; // test slp_tsk
633 ercd = rot_rdq( 0 ); // still without a wup
634 CYG_TEST_CHECK( E_OK == ercd, "rot_rdq bad ercd" );
636 ercd = rot_rdq( 0 ); // still without a wup
637 CYG_TEST_CHECK( E_OK == ercd, "rot_rdq bad ercd" );
638 intercom = 4; // do nothing next
641 CYG_TEST_CHECK( 6 == intercount, "intercount != 6" );
642 ercd = rot_rdq( 0 ); // still without a wup
643 CYG_TEST_CHECK( E_OK == ercd, "rot_rdq bad ercd" );
644 CYG_TEST_CHECK( 6 == intercount, "intercount != 6" );
646 ercd = wup_tsk( 4 ); // now issue a wup
647 CYG_TEST_CHECK( E_OK == ercd, "wup_tsk bad ercd" );
648 ercd = rot_rdq( 0 ); // it will run now
649 CYG_TEST_CHECK( E_OK == ercd, "wup_tsk bad ercd" );
651 ercd = rot_rdq( 0 ); // it will run now
652 CYG_TEST_CHECK( E_OK == ercd, "rot_rdq bad ercd" );
654 CYG_TEST_CHECK( 7 == intercount, "intercount != 7" );
657 intercom = 99; // exit, all done
658 ercd = rot_rdq( 0 ); // let it run
659 CYG_TEST_CHECK( E_OK == ercd, "rot_rdq bad ercd" );
661 CYG_TEST_CHECK( 8 == intercount, "intercount != 8" );
664 ercd = rot_rdq( 0 ); // let it run
665 CYG_TEST_CHECK( E_OK == ercd, "rot_rdq bad ercd" );
666 CYG_TEST_CHECK( 8 == intercount, "intercount != 8" );
668 CYG_TEST_PASS( "wup_tsk, can_wup, slp_tsk, tslp_tsk" );
670 #ifdef CYG_TEST_UITRON_TEST1_LOOPING
680 #endif // CYG_TEST_UITRON_TEST1_LOOPING
682 CYG_TEST_EXIT( "All done" );
688 void task2( unsigned int arg )
691 CYG_TEST_PASS( "Task 2 running" );
692 ercd = get_tid( &scratch );
693 CYG_TEST_CHECK( E_OK == ercd, "get_tid bad ercd" );
694 CYG_TEST_CHECK( 2 == scratch, "tid not 2" );
696 CYG_TEST_FAIL( "Task 2 arg not 99" );
698 CYG_TEST_FAIL( "Task 2 failed to exit" );
701 void task3( unsigned int arg )
705 CYG_TEST_PASS("Task3 running");
706 ercd = get_tid( &scratch );
707 CYG_TEST_CHECK( E_OK == ercd, "get_tid bad ercd" );
708 CYG_TEST_CHECK( 3 == scratch, "tid not 3" );
710 CYG_TEST_FAIL( "Task 3 arg not 66" );
712 while ( 2 & intercom ) {
713 while ( 1 & intercom ) {
718 ercd = rot_rdq( 0 ); // yield()
720 CYG_TEST_CHECK( E_OK == ercd, "rot_rdq 1 (task3) bad ercd" );
723 CYG_TEST_CHECK( 4 & intercom, "should not have got here yet 1" );
727 ercd = rot_rdq( 0 ); // yield()
729 CYG_TEST_CHECK( E_OK == ercd, "rot_rdq 2 (task3) bad ercd" );
732 CYG_TEST_CHECK( 8 & intercom, "should not have got here yet 2" );
736 CYG_TEST_FAIL( "Task 3 failed to exit" );
739 void task4( unsigned int arg )
742 CYG_TEST_PASS("Task4 running");
743 ercd = get_tid( &scratch );
744 CYG_TEST_CHECK( E_OK == ercd, "get_tid bad ercd" );
745 CYG_TEST_CHECK( 4 == scratch, "tid not 4" );
747 CYG_TEST_FAIL( "Task 4 arg not 77" );
749 switch ( intercom ) {
752 CYG_TEST_CHECK( E_OK == ercd, "slp_tsk (task4) bad ercd" );
755 ercd = tslp_tsk( 10 );
756 CYG_TEST_CHECK( E_OK == ercd, "slp_tsk (task4) bad ercd" );
759 ercd = tslp_tsk( 10 );
760 CYG_TEST_CHECK( E_TMOUT == ercd,
761 "slp_tsk (task4) bad ercd !E_TMOUT" );
765 while ( 4 == intercom ) {
767 CYG_TEST_CHECK( E_OK == ercd,
768 "rot_rdq (task4 idle) bad ercd" );
774 CYG_TEST_FAIL( "Task 4 bad intercom" );
780 ercd = rot_rdq( 0 ); // yield()
781 CYG_TEST_CHECK( E_OK == ercd, "rot_rdq (task4) bad ercd" );
786 CYG_TEST_FAIL( "Task 4 failed to exit" );
789 #else // not enough (or too many) uITRON objects configured in
790 #define N_A_MSG "not enough uITRON objects to run test"
791 #endif // not enough (or too many) uITRON objects configured in
792 #else // not C++ and some C++ specific options enabled
793 #define N_A_MSG "C++ specific options selected but this is C"
794 #endif // not C++ and some C++ specific options enabled
795 #else // ! CYGVAR_KERNEL_COUNTERS_CLOCK - can't test without it
796 #define N_A_MSG "no CYGVAR_KERNEL_COUNTERS_CLOCK"
797 #endif // ! CYGVAR_KERNEL_COUNTERS_CLOCK - can't test without it
798 #else // ! CYGFUN_KERNEL_THREADS_TIMER - can't test without it
799 #define N_A_MSG "no CYGFUN_KERNEL_THREADS_TIMER"
800 #endif // ! CYGFUN_KERNEL_THREADS_TIMER - can't test without it
801 #else // ! CYGIMP_THREAD_PRIORITY - can't test without it
802 #define N_A_MSG "no CYGSEM_KERNEL_SCHED_MLQUEUE"
803 #endif // ! CYGSEM_KERNEL_SCHED_MLQUEUE - can't test without it
804 #else // ! CYGPKG_UITRON
805 #define N_A_MSG "uITRON Compatibility layer disabled"
806 #endif // CYGPKG_UITRON
813 CYG_TEST_NA( N_A_MSG );
815 #endif // N_A_MSG defined ie. we are N/A.