File indexing completed on 2025-05-11 08:24:44
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
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 }