Warning, /testsuites/ada/sptests/sp04/sptest.adb is written in an unsupported language. File is not indexed.
0001 -- SPDX-License-Identifier: BSD-2-Clause
0002
0003 --
0004 -- SPTEST / BODY
0005 --
0006 -- DESCRIPTION:
0007 --
0008 -- This package is the implementation of Test 4 of the RTEMS
0009 -- Single Processor Test Suite.
0010 --
0011 -- DEPENDENCIES:
0012 --
0013 --
0014 --
0015 -- COPYRIGHT (c) 1989-2011.
0016 -- On-Line Applications Research Corporation (OAR).
0017 --
0018 -- Redistribution and use in source and binary forms, with or without
0019 -- modification, are permitted provided that the following conditions
0020 -- are met:
0021 -- 1. Redistributions of source code must retain the above copyright
0022 -- notice, this list of conditions and the following disclaimer.
0023 -- 2. Redistributions in binary form must reproduce the above copyright
0024 -- notice, this list of conditions and the following disclaimer in the
0025 -- documentation and/or other materials provided with the distribution.
0026 --
0027 -- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
0028 -- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
0029 -- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
0030 -- ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
0031 -- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
0032 -- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
0033 -- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
0034 -- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
0035 -- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
0036 -- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
0037 -- POSSIBILITY OF SUCH DAMAGE.
0038 --
0039
0040 with INTERFACES; use INTERFACES;
0041 with TEST_SUPPORT;
0042 with TEXT_IO;
0043 with RTEMS.CLOCK;
0044 with RTEMS.EXTENSION;
0045 with RTEMS.FATAL;
0046
0047 package body SPTEST is
0048
0049 TestsFinished : Boolean := False;
0050 pragma Volatile (TestsFinished);
0051
0052 type Task_Event is record
0053 Task_Index : RTEMS.Unsigned32;
0054 When_Switched : RTEMS.Time_Of_Day;
0055 end record;
0056
0057 Task_Events : array (1 .. 15) of Task_Event;
0058 Task_Events_Index : Natural := Task_Events'First;
0059
0060 procedure Log_Task_Event (
0061 Task_Index : RTEMS.Unsigned32;
0062 When_Switched : RTEMS.Time_Of_Day
0063 ) is
0064 begin
0065 if Task_Events_Index = Task_Events'Last then
0066 RTEMS.Fatal.Error_Occurred ( 1 ); -- no other choice
0067 else
0068 Task_Events (Task_Events_Index).Task_Index := Task_Index;
0069 Task_Events (Task_Events_Index).When_Switched := When_Switched;
0070 Task_Events_Index := Task_Events_Index + 1;
0071 end if;
0072 end Log_Task_Event;
0073
0074 procedure Flush_Task_Event_Log is
0075 begin
0076 for I in Task_Events'First .. Task_Events_Index - 1 loop
0077
0078 TEST_SUPPORT.PUT_NAME(
0079 SPTEST.TASK_NAME( Task_Events (I).Task_Index ), FALSE
0080 );
0081 TEST_SUPPORT.PRINT_TIME( "- ", Task_Events (I).When_Switched, "" );
0082 TEXT_IO.NEW_LINE;
0083
0084 end loop;
0085
0086 end Flush_Task_Event_Log;
0087
0088 --
0089 -- INIT
0090 --
0091
0092 procedure INIT (
0093 ARGUMENT : in RTEMS.TASKS.ARGUMENT
0094 ) is
0095 pragma Unreferenced(ARGUMENT);
0096 TIME : RTEMS.TIME_OF_DAY;
0097 STATUS : RTEMS.STATUS_CODES;
0098 begin
0099
0100 TEXT_IO.NEW_LINE( 2 );
0101 TEST_SUPPORT.ADA_TEST_BEGIN;
0102
0103 TIME := ( 1988, 12, 31, 9, 15, 0, 0 );
0104
0105 RTEMS.CLOCK.SET( TIME, STATUS );
0106 TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "CLOCK_SET" );
0107
0108 SPTEST.EXTENSION_NAME( 1 ) := RTEMS.BUILD_NAME( 'E', 'X', 'T', ' ' );
0109
0110 RTEMS.EXTENSION.CREATE(
0111 SPTEST.EXTENSION_NAME( 1 ),
0112 SPTEST.EXTENSIONS'ACCESS,
0113 EXTENSION_ID( 1 ),
0114 STATUS
0115 );
0116 TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "EXTENSION_CREATE" );
0117
0118 SPTEST.TASK_NAME( 1 ) := RTEMS.BUILD_NAME( 'T', 'A', '1', ' ' );
0119 SPTEST.TASK_NAME( 2 ) := RTEMS.BUILD_NAME( 'T', 'A', '2', ' ' );
0120 SPTEST.TASK_NAME( 3 ) := RTEMS.BUILD_NAME( 'T', 'A', '3', ' ' );
0121
0122 SPTEST.RUN_COUNT( 1 ) := 0;
0123 SPTEST.RUN_COUNT( 2 ) := 0;
0124 SPTEST.RUN_COUNT( 3 ) := 0;
0125
0126 RTEMS.TASKS.CREATE(
0127 SPTEST.TASK_NAME( 1 ),
0128 1,
0129 2048,
0130 RTEMS.TIMESLICE,
0131 RTEMS.DEFAULT_ATTRIBUTES,
0132 SPTEST.TASK_ID( 1 ),
0133 STATUS
0134 );
0135 TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_CREATE OF TA1" );
0136
0137 RTEMS.TASKS.CREATE(
0138 SPTEST.TASK_NAME( 2 ),
0139 1,
0140 2048,
0141 RTEMS.TIMESLICE,
0142 RTEMS.DEFAULT_ATTRIBUTES,
0143 SPTEST.TASK_ID( 2 ),
0144 STATUS
0145 );
0146 TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_CREATE OF TA2" );
0147
0148 RTEMS.TASKS.CREATE(
0149 SPTEST.TASK_NAME( 3 ),
0150 1,
0151 2048,
0152 RTEMS.TIMESLICE,
0153 RTEMS.DEFAULT_ATTRIBUTES,
0154 SPTEST.TASK_ID( 3 ),
0155 STATUS
0156 );
0157 TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_CREATE OF TA3" );
0158
0159 RTEMS.TASKS.START(
0160 SPTEST.TASK_ID( 1 ),
0161 SPTEST.TASK_1'ACCESS,
0162 0,
0163 STATUS
0164 );
0165 TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_START OF TA1" );
0166
0167 RTEMS.TASKS.START(
0168 SPTEST.TASK_ID( 2 ),
0169 SPTEST.TASK_2'ACCESS,
0170 0,
0171 STATUS
0172 );
0173 TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_START OF TA2" );
0174
0175 RTEMS.TASKS.START(
0176 SPTEST.TASK_ID( 3 ),
0177 SPTEST.TASK_3'ACCESS,
0178 0,
0179 STATUS
0180 );
0181 TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_START OF TA3" );
0182
0183 RTEMS.TASKS.DELETE( RTEMS.SELF, STATUS );
0184 TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_DELETE OF SELF" );
0185
0186 end INIT;
0187
0188 --
0189 -- TASK_1
0190 --
0191
0192 procedure TASK_1 (
0193 ARGUMENT : in RTEMS.TASKS.ARGUMENT
0194 ) is
0195 pragma Unreferenced(ARGUMENT);
0196 SECONDS : RTEMS.UNSIGNED32;
0197 OLD_SECONDS : RTEMS.UNSIGNED32;
0198 PREVIOUS_MODE : RTEMS.MODE;
0199 TIME : RTEMS.TIME_OF_DAY;
0200 START_TIME : RTEMS.INTERVAL;
0201 END_TIME : RTEMS.INTERVAL;
0202 STATUS : RTEMS.STATUS_CODES;
0203 begin
0204
0205 TEXT_IO.PUT_LINE( "TA1 - task_suspend - on Task 2" );
0206 RTEMS.TASKS.SUSPEND( TASK_ID( 2 ), STATUS );
0207 TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_SUSPEND OF TA2" );
0208
0209 TEXT_IO.PUT_LINE( "TA1 - task_suspend - on Task 3" );
0210 RTEMS.TASKS.SUSPEND( TASK_ID( 3 ), STATUS );
0211 TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_SUSPEND OF TA3" );
0212
0213 TEXT_IO.PUT_LINE( "TA1 - killing time" );
0214
0215 RTEMS.CLOCK.GET_SECONDS_SINCE_EPOCH( START_TIME, STATUS );
0216 TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "CLOCK_GET_SECONDS_SINCE_EPOCH" );
0217
0218 loop
0219 RTEMS.CLOCK.GET_SECONDS_SINCE_EPOCH( END_TIME, STATUS );
0220 TEST_SUPPORT.DIRECTIVE_FAILED(STATUS, "CLOCK_GET_SECONDS_SINCE_EPOCH");
0221
0222 exit when END_TIME > (START_TIME + 2);
0223 end loop;
0224
0225 TEXT_IO.PUT_LINE( "TA1 - task_resume - on Task 2" );
0226 RTEMS.TASKS.RESUME( TASK_ID( 2 ), STATUS );
0227 TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_RESUME OF TA2" );
0228
0229 TEXT_IO.PUT_LINE( "TA1 - task_resume - on Task 3" );
0230 RTEMS.TASKS.RESUME( TASK_ID( 3 ), STATUS );
0231 TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_RESUME OF TA3" );
0232
0233 loop
0234
0235 if SPTEST.RUN_COUNT( 1 ) = 3 then
0236
0237 TEXT_IO.PUT_LINE(
0238 "TA1 - task_mode - change mode to NO PREEMPT"
0239 );
0240 RTEMS.TASKS.MODE(
0241 RTEMS.NO_PREEMPT,
0242 RTEMS.PREEMPT_MASK,
0243 PREVIOUS_MODE,
0244 STATUS
0245 );
0246 TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_MODE" );
0247
0248 RTEMS.CLOCK.GET_TOD( TIME, STATUS );
0249 TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "CLOCK_GET_TOD" );
0250
0251 OLD_SECONDS := TIME.SECOND;
0252
0253 SECONDS := 0;
0254 loop
0255
0256 exit when SECONDS >= 6;
0257
0258 RTEMS.CLOCK.GET_TOD( TIME, STATUS );
0259 TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "CLOCK_GET_TOD" );
0260
0261 if TIME.SECOND /= OLD_SECONDS then
0262 OLD_SECONDS := TIME.SECOND;
0263 SECONDS := SECONDS + 1;
0264 TEST_SUPPORT.PRINT_TIME( "TA1 - ", TIME, "" );
0265 TEXT_IO.NEW_LINE;
0266 end if;
0267
0268 end loop;
0269
0270 TEXT_IO.PUT_LINE(
0271 "TA1 - task_mode - change mode to PREEMPT"
0272 );
0273
0274 RTEMS.TASKS.MODE(
0275 RTEMS.PREEMPT,
0276 RTEMS.PREEMPT_MASK,
0277 PREVIOUS_MODE,
0278 STATUS
0279 );
0280 TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_MODE" );
0281
0282 while not TestsFinished loop
0283 NULL;
0284 END LOOP;
0285 Flush_Task_Event_Log;
0286 TEST_SUPPORT.ADA_TEST_END;
0287 RTEMS.SHUTDOWN_EXECUTIVE( 0 );
0288
0289 end if;
0290
0291 end loop;
0292
0293 end TASK_1;
0294
0295 --
0296 -- TASK_2
0297 --
0298
0299 procedure TASK_2 (
0300 ARGUMENT : in RTEMS.TASKS.ARGUMENT
0301 ) is
0302 pragma Unreferenced(ARGUMENT);
0303 begin
0304
0305 LOOP
0306 NULL;
0307 END LOOP;
0308
0309 end TASK_2;
0310
0311 --
0312 -- TASK_3
0313 --
0314
0315 procedure TASK_3 (
0316 ARGUMENT : in RTEMS.TASKS.ARGUMENT
0317 ) is
0318 pragma Unreferenced(ARGUMENT);
0319 begin
0320
0321 LOOP
0322 NULL;
0323 END LOOP;
0324
0325 end TASK_3;
0326
0327 --
0328 -- TASK_SWITCH
0329 --
0330
0331 procedure TASK_SWITCH (
0332 UNUSED : in RTEMS.TCB_POINTER;
0333 HEIR : in RTEMS.TCB_POINTER
0334 ) is
0335 pragma Unreferenced(UNUSED);
0336 INDEX : RTEMS.UNSIGNED32;
0337 TIME : RTEMS.TIME_OF_DAY;
0338 STATUS : RTEMS.STATUS_CODES;
0339 function TCB_To_ID (
0340 TCB : RTEMS.TCB_POINTER
0341 ) return RTEMS.ID;
0342 pragma Import (C, TCB_To_ID, "tcb_to_id" );
0343
0344 begin
0345
0346 INDEX := TEST_SUPPORT.TASK_NUMBER( TCB_To_ID( HEIR ) );
0347
0348 case INDEX is
0349 when 1 | 2 | 3 =>
0350 SPTEST.RUN_COUNT( INDEX ) := SPTEST.RUN_COUNT( INDEX ) + 1;
0351
0352 RTEMS.CLOCK.GET_TOD( TIME, STATUS );
0353 TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "CLOCK_GET_TOD" );
0354
0355 Log_Task_Event ( INDEX, TIME );
0356
0357 if TIME.SECOND >= 16 then
0358 TestsFinished := True;
0359 end if;
0360
0361 when others =>
0362 NULL;
0363 end case;
0364
0365 end TASK_SWITCH;
0366
0367 end SPTEST;