Back to home page

LXR

 
 

    


File indexing completed on 2025-05-11 08:24:44

0001 /* SPDX-License-Identifier: BSD-2-Clause */
0002 
0003 /*  Task_1
0004  *
0005  *  This test serves as a test task.  It verifies timeslicing activities
0006  *  and tswitch extension processing.
0007  *
0008  *  Input parameters:
0009  *    argument - task argument
0010  *
0011  *  Output parameters:  NONE
0012  *
0013  *  COPYRIGHT (c) 1989-2009.
0014  *  On-Line Applications Research Corporation (OAR).
0015  *
0016  * Redistribution and use in source and binary forms, with or without
0017  * modification, are permitted provided that the following conditions
0018  * are met:
0019  * 1. Redistributions of source code must retain the above copyright
0020  *    notice, this list of conditions and the following disclaimer.
0021  * 2. Redistributions in binary form must reproduce the above copyright
0022  *    notice, this list of conditions and the following disclaimer in the
0023  *    documentation and/or other materials provided with the distribution.
0024  *
0025  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
0026  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
0027  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
0028  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
0029  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
0030  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
0031  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
0032  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
0033  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
0034  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
0035  * POSSIBILITY OF SUCH DAMAGE.
0036  */
0037 
0038 #ifdef HAVE_CONFIG_H
0039 #include "config.h"
0040 #endif
0041 
0042 #include "system.h"
0043 
0044 static void
0045 showTaskSwitches (void)
0046 {
0047   unsigned int i;
0048   unsigned int switches = taskSwitchLogIndex;
0049 
0050   for (i = 0 ; i < switches ; i++) {
0051       put_name( Task_name[taskSwitchLog[i].taskIndex], FALSE );
0052       print_time( "- ", &taskSwitchLog[i].when, "\n" );
0053   }
0054 }
0055 
0056 static int test_no_preempt_step;
0057 
0058 static rtems_id high_task_id;
0059 
0060 static rtems_id low_task_id;
0061 
0062 static void high_task( rtems_task_argument arg )
0063 {
0064   rtems_status_code sc;
0065 
0066   rtems_test_assert( test_no_preempt_step == 2 );
0067   test_no_preempt_step = 3;
0068 
0069   sc = rtems_event_transient_send( Task_id[ 1 ] );
0070   rtems_test_assert( sc == RTEMS_SUCCESSFUL );
0071 
0072   rtems_task_suspend(RTEMS_SELF);
0073   rtems_test_assert(0);
0074 }
0075 
0076 static void low_task( rtems_task_argument arg )
0077 {
0078   rtems_test_assert( test_no_preempt_step == 1 );
0079   test_no_preempt_step = 2;
0080 
0081   rtems_task_suspend(RTEMS_SELF);
0082   rtems_test_assert(0);
0083 }
0084 
0085 static void no_preempt_timer( rtems_id id, void *arg )
0086 {
0087   rtems_status_code sc;
0088 
0089   rtems_test_assert( test_no_preempt_step == 0 );
0090   test_no_preempt_step = 1;
0091 
0092   sc = rtems_task_start( low_task_id, low_task, 0 );
0093   rtems_test_assert( sc == RTEMS_SUCCESSFUL );
0094 
0095   sc = rtems_task_start( high_task_id, high_task, 0 );
0096   rtems_test_assert( sc == RTEMS_SUCCESSFUL );
0097 }
0098 
0099 static void test_no_preempt( void )
0100 {
0101   rtems_status_code sc;
0102   rtems_id id;
0103 
0104   rtems_test_assert( test_no_preempt_step == 0 );
0105 
0106   sc = rtems_task_delete( Task_id[ 2 ] );
0107   rtems_test_assert( sc == RTEMS_SUCCESSFUL );
0108 
0109   sc = rtems_task_delete( Task_id[ 3 ] );
0110   rtems_test_assert( sc == RTEMS_SUCCESSFUL );
0111 
0112   sc = rtems_task_create(
0113     rtems_build_name( 'H', 'I', 'G', 'H' ),
0114     1,
0115     RTEMS_MINIMUM_STACK_SIZE,
0116     RTEMS_DEFAULT_MODES,
0117     RTEMS_DEFAULT_ATTRIBUTES,
0118     &high_task_id
0119   );
0120   rtems_test_assert( sc == RTEMS_SUCCESSFUL );
0121 
0122   sc = rtems_task_create(
0123     rtems_build_name( 'L', 'O', 'W', ' ' ),
0124     2,
0125     RTEMS_MINIMUM_STACK_SIZE,
0126     RTEMS_NO_PREEMPT,
0127     RTEMS_DEFAULT_ATTRIBUTES,
0128     &low_task_id
0129   );
0130   rtems_test_assert( sc == RTEMS_SUCCESSFUL );
0131 
0132   sc = rtems_timer_create( rtems_build_name( 'N', 'O', 'P', 'R' ), &id );
0133   rtems_test_assert( sc == RTEMS_SUCCESSFUL );
0134 
0135   sc = rtems_timer_fire_after( id, 1, no_preempt_timer, NULL );
0136   rtems_test_assert( sc == RTEMS_SUCCESSFUL );
0137 
0138   sc = rtems_event_transient_receive( RTEMS_WAIT, RTEMS_NO_TIMEOUT );
0139   rtems_test_assert( sc == RTEMS_SUCCESSFUL );
0140 
0141   sc = rtems_timer_delete( id );
0142   rtems_test_assert( sc == RTEMS_SUCCESSFUL );
0143 
0144   sc = rtems_task_delete( high_task_id );
0145   rtems_test_assert( sc == RTEMS_SUCCESSFUL );
0146 
0147   sc = rtems_task_delete( low_task_id );
0148   rtems_test_assert( sc == RTEMS_SUCCESSFUL );
0149 
0150   rtems_test_assert( test_no_preempt_step == 3 );
0151 }
0152 
0153 rtems_task Task_1(
0154   rtems_task_argument argument
0155 )
0156 {
0157   uint32_t    seconds;
0158   uint32_t    old_seconds;
0159   rtems_mode        previous_mode;
0160   rtems_time_of_day time;
0161   rtems_status_code status;
0162   uint32_t    start_time;
0163   uint32_t    end_time;
0164 
0165   puts( "TA1 - rtems_task_suspend - on Task 2" );
0166   status = rtems_task_suspend( Task_id[ 2 ] );
0167   directive_failed( status, "rtems_task_suspend of TA2" );
0168 
0169   puts( "TA1 - rtems_task_suspend - on Task 3" );
0170   status = rtems_task_suspend( Task_id[ 3 ] );
0171   directive_failed( status, "rtems_task_suspend of TA3" );
0172 
0173   status = rtems_clock_get_seconds_since_epoch( &start_time );
0174   directive_failed( status, "rtems_clock_get_seconds_since_epoch" );
0175 
0176   puts( "TA1 - killing time" );
0177 
0178   for ( ; ; ) {
0179     status = rtems_clock_get_seconds_since_epoch( &end_time );
0180     directive_failed( status, "rtems_clock_get_seconds_since_epoch" );
0181 
0182     if ( end_time > (start_time + 2) )
0183       break;
0184   }
0185 
0186   puts( "TA1 - rtems_task_resume - on Task 2" );
0187   status = rtems_task_resume( Task_id[ 2 ] );
0188   directive_failed( status, "rtems_task_resume of TA2" );
0189 
0190   puts( "TA1 - rtems_task_resume - on Task 3" );
0191   status = rtems_task_resume( Task_id[ 3 ] );
0192   directive_failed( status, "rtems_task_resume of TA3" );
0193 
0194   while ( FOREVER ) {
0195     if ( Run_count[ 1 ] >= 3 ) {
0196       puts( "TA1 - rtems_task_mode - change mode to NO RTEMS_PREEMPT" );
0197 
0198       status = rtems_task_mode(
0199         RTEMS_NO_PREEMPT,
0200         RTEMS_PREEMPT_MASK,
0201         &previous_mode
0202       );
0203       directive_failed( status, "rtems_task_mode" );
0204 
0205       status = rtems_clock_get_tod( &time );
0206       directive_failed( status, "rtems_clock_get_tod" );
0207 
0208       old_seconds = time.second;
0209 
0210       for ( seconds = 0 ; seconds < 6 ; ) {
0211         status = rtems_clock_get_tod( &time );
0212         directive_failed( status, "rtems_clock_get_tod" );
0213 
0214         if ( time.second != old_seconds ) {
0215           old_seconds = time.second;
0216           seconds++;
0217           print_time( "TA1 - ", &time, "\n" );
0218         }
0219       }
0220 
0221       puts( "TA1 - rtems_task_mode - change mode to RTEMS_PREEMPT" );
0222       status = rtems_task_mode(
0223         RTEMS_PREEMPT,
0224         RTEMS_PREEMPT_MASK,
0225         &previous_mode
0226       );
0227       directive_failed( status, "rtems_task_mode" );
0228 
0229       while ( !testsFinished );
0230       showTaskSwitches ();
0231 
0232       puts( "TA1 - rtems_extension_delete - successful" );
0233       status = rtems_extension_delete( Extension_id[1] );
0234       directive_failed( status, "rtems_extension_delete" );
0235 
0236       test_no_preempt();
0237 
0238       TEST_END();
0239       rtems_test_exit (0);
0240     }
0241   }
0242 }