Warning, /testsuites/ada/tmtests/tm04/tmtest.adb is written in an unsupported language. File is not indexed.
0001 -- SPDX-License-Identifier: BSD-2-Clause
0002
0003 --
0004 -- TMTEST / BODY
0005 --
0006 -- DESCRIPTION:
0007 --
0008 -- This package is the implementation of Test 4 of the RTEMS
0009 -- Timing 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 RTEMS_CALLING_OVERHEAD;
0042 with TEST_SUPPORT;
0043 with TEXT_IO;
0044 with TIMER_DRIVER;
0045 with RTEMS.SEMAPHORE;
0046
0047 package body TMTEST is
0048
0049 --
0050 -- INIT
0051 --
0052
0053 procedure INIT (
0054 ARGUMENT : in RTEMS.TASKS.ARGUMENT
0055 ) is
0056 pragma Unreferenced(ARGUMENT);
0057 STATUS : RTEMS.STATUS_CODES;
0058 begin
0059
0060 TEXT_IO.NEW_LINE( 2 );
0061 TEST_SUPPORT.ADA_TEST_BEGIN;
0062
0063 TMTEST.TEST_INIT;
0064
0065 RTEMS.TASKS.DELETE( RTEMS.SELF, STATUS );
0066 TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_DELETE OF SELF" );
0067
0068 end INIT;
0069
0070 --
0071 -- TEST_INIT
0072 --
0073
0074 procedure TEST_INIT
0075 is
0076 STATUS : RTEMS.STATUS_CODES;
0077 begin
0078
0079 TMTEST.TASK_COUNT := TIME_TEST_SUPPORT.OPERATION_COUNT;
0080
0081 for INDEX in 1 .. TIME_TEST_SUPPORT.OPERATION_COUNT
0082 loop
0083
0084 RTEMS.TASKS.CREATE(
0085 RTEMS.BUILD_NAME( 'T', 'I', 'M', 'E' ),
0086 10,
0087 1024,
0088 RTEMS.NO_PREEMPT,
0089 RTEMS.DEFAULT_ATTRIBUTES,
0090 TMTEST.TASK_ID( INDEX ),
0091 STATUS
0092 );
0093 TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_CREATE LOOP" );
0094
0095 RTEMS.TASKS.START(
0096 TMTEST.TASK_ID( INDEX ),
0097 TMTEST.LOW_TASKS'ACCESS,
0098 0,
0099 STATUS
0100 );
0101 TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_START LOOP" );
0102
0103 end loop;
0104
0105 RTEMS.SEMAPHORE.CREATE(
0106 RTEMS.BUILD_NAME( 'S', 'M', '1', ' ' ),
0107 0,
0108 RTEMS.DEFAULT_ATTRIBUTES,
0109 RTEMS.TASKS.NO_PRIORITY,
0110 TMTEST.SEMAPHORE_ID,
0111 STATUS
0112 );
0113 TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "SEMAPHORE_CREATE OF SM1" );
0114
0115 end TEST_INIT;
0116
0117 --
0118 -- HIGHEST_TASK
0119 --
0120
0121 procedure HIGHEST_TASK (
0122 ARGUMENT : in RTEMS.TASKS.ARGUMENT
0123 ) is
0124 OLD_PRIORITY : RTEMS.TASKS.PRIORITY;
0125 STATUS : RTEMS.STATUS_CODES;
0126 begin
0127
0128 if ARGUMENT = 1 then
0129
0130 TMTEST.END_TIME := TIMER_DRIVER.READ_TIMER;
0131
0132 TIME_TEST_SUPPORT.PUT_TIME(
0133 "TASK_RESTART (blocked, preempt)",
0134 TMTEST.END_TIME,
0135 1,
0136 0,
0137 RTEMS_CALLING_OVERHEAD.TASK_RESTART
0138 );
0139
0140 RTEMS.TASKS.SET_PRIORITY( RTEMS.SELF, 254, OLD_PRIORITY, STATUS );
0141 TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_SET_PRIORITY" );
0142
0143 elsif ARGUMENT = 2 then
0144
0145 TMTEST.END_TIME := TIMER_DRIVER.READ_TIMER;
0146
0147 TIME_TEST_SUPPORT.PUT_TIME(
0148 "TASK_RESTART (ready, preempt)",
0149 TMTEST.END_TIME,
0150 1,
0151 0,
0152 RTEMS_CALLING_OVERHEAD.TASK_RESTART
0153 );
0154
0155 RTEMS.TASKS.DELETE( RTEMS.SELF, STATUS );
0156 TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_DELETE" );
0157
0158 else
0159
0160 RTEMS.SEMAPHORE.OBTAIN(
0161 TMTEST.SEMAPHORE_ID,
0162 RTEMS.DEFAULT_OPTIONS,
0163 RTEMS.NO_TIMEOUT,
0164 STATUS
0165 );
0166
0167 end if;
0168
0169 end HIGHEST_TASK;
0170
0171 --
0172 -- HIGH_TASK
0173 --
0174
0175 procedure HIGH_TASK (
0176 ARGUMENT : in RTEMS.TASKS.ARGUMENT
0177 ) is
0178 pragma Unreferenced(ARGUMENT);
0179 OLD_PRIORITY : RTEMS.TASKS.PRIORITY;
0180 OVERHEAD : RTEMS.UNSIGNED32;
0181 NAME : RTEMS.NAME;
0182 STATUS : RTEMS.STATUS_CODES;
0183 begin
0184
0185 TIMER_DRIVER.INITIALIZE;
0186 RTEMS.TASKS.RESTART( TMTEST.HIGHEST_ID, 1, STATUS );
0187 -- preempted by Higher_task
0188 TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_RESTART" );
0189
0190 TIMER_DRIVER.INITIALIZE;
0191 RTEMS.TASKS.RESTART( TMTEST.HIGHEST_ID, 2, STATUS );
0192 -- preempted by Higher_task
0193 TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_RESTART" );
0194
0195 TIMER_DRIVER.INITIALIZE;
0196 for INDEX in 1 .. TIME_TEST_SUPPORT.OPERATION_COUNT
0197 loop
0198 TIMER_DRIVER.EMPTY_FUNCTION;
0199 end loop;
0200 OVERHEAD := TIMER_DRIVER.READ_TIMER;
0201
0202 TIMER_DRIVER.INITIALIZE;
0203 for INDEX in 1 .. TIME_TEST_SUPPORT.OPERATION_COUNT
0204 loop
0205 RTEMS.SEMAPHORE.RELEASE( TMTEST.SEMAPHORE_ID, STATUS );
0206 end loop;
0207 TMTEST.END_TIME := TIMER_DRIVER.READ_TIMER;
0208 TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "SEMAPHORE_RELEASE" );
0209
0210 TIME_TEST_SUPPORT.PUT_TIME(
0211 "SEMAPHORE_RELEASE (readying)",
0212 TMTEST.END_TIME,
0213 TIME_TEST_SUPPORT.OPERATION_COUNT,
0214 OVERHEAD,
0215 RTEMS_CALLING_OVERHEAD.SEMAPHORE_RELEASE
0216 );
0217
0218 -- All low priority (non-preemptible) tasks are ready now. We must
0219 -- prevent them from running (this would result in an invalid task exit),
0220 -- since the rtems_task_delete() performs an implicit join.
0221 for INDEX in 1 .. TIME_TEST_SUPPORT.OPERATION_COUNT
0222 loop
0223 RTEMS.TASKS.SUSPEND( TMTEST.TASK_ID( INDEX ), STATUS );
0224 TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_SUSPEND" );
0225 end loop;
0226
0227 for INDEX in 1 .. TIME_TEST_SUPPORT.OPERATION_COUNT
0228 loop
0229 RTEMS.TASKS.DELETE( TMTEST.TASK_ID( INDEX ), STATUS );
0230 TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_DELETE" );
0231 end loop;
0232
0233 NAME := RTEMS.BUILD_NAME( 'T', 'I', 'M', 'E' );
0234
0235 TIMER_DRIVER.INITIALIZE;
0236 for INDEX in 1 .. TIME_TEST_SUPPORT.OPERATION_COUNT
0237 loop
0238 RTEMS.TASKS.CREATE(
0239 NAME,
0240 10,
0241 1024,
0242 RTEMS.NO_PREEMPT,
0243 RTEMS.DEFAULT_ATTRIBUTES,
0244 TMTEST.TASK_ID( INDEX ),
0245 STATUS
0246 );
0247 end loop;
0248 TMTEST.END_TIME := TIMER_DRIVER.READ_TIMER;
0249
0250 TIME_TEST_SUPPORT.PUT_TIME(
0251 "TASK_CREATE",
0252 TMTEST.END_TIME,
0253 TIME_TEST_SUPPORT.OPERATION_COUNT,
0254 OVERHEAD,
0255 RTEMS_CALLING_OVERHEAD.TASK_CREATE
0256 );
0257
0258 TIMER_DRIVER.INITIALIZE;
0259 for INDEX in 1 .. TIME_TEST_SUPPORT.OPERATION_COUNT
0260 loop
0261 RTEMS.TASKS.START(
0262 TMTEST.TASK_ID( INDEX ),
0263 TMTEST.LOW_TASKS'ACCESS,
0264 0,
0265 STATUS
0266 );
0267 end loop;
0268 TMTEST.END_TIME := TIMER_DRIVER.READ_TIMER;
0269
0270 TIME_TEST_SUPPORT.PUT_TIME(
0271 "TASK_START",
0272 TMTEST.END_TIME,
0273 TIME_TEST_SUPPORT.OPERATION_COUNT,
0274 OVERHEAD,
0275 RTEMS_CALLING_OVERHEAD.TASK_START
0276 );
0277
0278 for INDEX in 1 .. TIME_TEST_SUPPORT.OPERATION_COUNT
0279 loop
0280 RTEMS.TASKS.DELETE( TMTEST.TASK_ID( INDEX ), STATUS );
0281 TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_DELETE LOOP" );
0282 end loop;
0283
0284 for INDEX in 1 .. TIME_TEST_SUPPORT.OPERATION_COUNT
0285 loop
0286 RTEMS.TASKS.CREATE(
0287 NAME,
0288 250,
0289 1024,
0290 RTEMS.NO_PREEMPT,
0291 RTEMS.DEFAULT_ATTRIBUTES,
0292 TMTEST.TASK_ID( INDEX ),
0293 STATUS
0294 );
0295 TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_CREATE LOOP" );
0296 RTEMS.TASKS.START(
0297 TMTEST.TASK_ID( INDEX ),
0298 TMTEST.RESTART_TASK'ACCESS,
0299 0,
0300 STATUS
0301 );
0302 TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_START LOOP" );
0303 RTEMS.TASKS.SUSPEND( TMTEST.TASK_ID( INDEX ), STATUS );
0304 TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_SUSPEND LOOP" );
0305 end loop;
0306
0307 TIMER_DRIVER.INITIALIZE;
0308 for INDEX in 1 .. TIME_TEST_SUPPORT.OPERATION_COUNT
0309 loop
0310 RTEMS.TASKS.RESTART( TMTEST.TASK_ID( INDEX ), 0, STATUS );
0311 end loop;
0312 TMTEST.END_TIME := TIMER_DRIVER.READ_TIMER;
0313
0314 TIME_TEST_SUPPORT.PUT_TIME(
0315 "TASK_RESTART (suspended)",
0316 TMTEST.END_TIME,
0317 TIME_TEST_SUPPORT.OPERATION_COUNT,
0318 OVERHEAD,
0319 RTEMS_CALLING_OVERHEAD.TASK_RESTART
0320 );
0321
0322 for INDEX in 1 .. TIME_TEST_SUPPORT.OPERATION_COUNT
0323 loop
0324 RTEMS.TASKS.SUSPEND( TMTEST.TASK_ID( INDEX ), STATUS );
0325 TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_SUSPEND LOOP" );
0326 end loop;
0327
0328 TIMER_DRIVER.INITIALIZE;
0329 for INDEX in 1 .. TIME_TEST_SUPPORT.OPERATION_COUNT
0330 loop
0331 RTEMS.TASKS.DELETE( TMTEST.TASK_ID( INDEX ), STATUS );
0332 end loop;
0333 TMTEST.END_TIME := TIMER_DRIVER.READ_TIMER;
0334
0335 TIME_TEST_SUPPORT.PUT_TIME(
0336 "TASK_DELETE (suspended)",
0337 TMTEST.END_TIME,
0338 TIME_TEST_SUPPORT.OPERATION_COUNT,
0339 OVERHEAD,
0340 RTEMS_CALLING_OVERHEAD.TASK_DELETE
0341 );
0342
0343 for INDEX in 1 .. TIME_TEST_SUPPORT.OPERATION_COUNT
0344 loop
0345 RTEMS.TASKS.CREATE(
0346 NAME,
0347 250,
0348 1024,
0349 RTEMS.DEFAULT_OPTIONS,
0350 RTEMS.DEFAULT_ATTRIBUTES,
0351 TMTEST.TASK_ID( INDEX ),
0352 STATUS
0353 );
0354 TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_CREATE LOOP" );
0355 RTEMS.TASKS.START(
0356 TMTEST.TASK_ID( INDEX ),
0357 TMTEST.RESTART_TASK'ACCESS,
0358 0,
0359 STATUS
0360 );
0361 TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_START LOOP" );
0362 end loop;
0363
0364 TIMER_DRIVER.INITIALIZE;
0365 for INDEX in 1 .. TIME_TEST_SUPPORT.OPERATION_COUNT
0366 loop
0367 RTEMS.TASKS.RESTART( TMTEST.TASK_ID( INDEX ), 1, STATUS );
0368 end loop;
0369 TMTEST.END_TIME := TIMER_DRIVER.READ_TIMER;
0370
0371 TIME_TEST_SUPPORT.PUT_TIME(
0372 "TASK_RESTART (ready)",
0373 TMTEST.END_TIME,
0374 TIME_TEST_SUPPORT.OPERATION_COUNT,
0375 OVERHEAD,
0376 RTEMS_CALLING_OVERHEAD.TASK_RESTART
0377 );
0378
0379 for INDEX in 1 .. TIME_TEST_SUPPORT.OPERATION_COUNT
0380 loop
0381 RTEMS.TASKS.SET_PRIORITY(
0382 TMTEST.TASK_ID( INDEX ),
0383 5,
0384 OLD_PRIORITY,
0385 STATUS
0386 );
0387 TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_SET_PRIORITY LOOP" );
0388 end loop;
0389
0390 -- yield processor -- tasks block
0391 RTEMS.TASKS.WAKE_AFTER( RTEMS.YIELD_PROCESSOR, STATUS );
0392 TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_WAKE_AFTER" );
0393
0394 TIMER_DRIVER.INITIALIZE;
0395 for INDEX in 1 .. TIME_TEST_SUPPORT.OPERATION_COUNT
0396 loop
0397 RTEMS.TASKS.RESTART( TMTEST.TASK_ID( INDEX ), 1, STATUS );
0398 end loop;
0399 TMTEST.END_TIME := TIMER_DRIVER.READ_TIMER;
0400
0401 TIME_TEST_SUPPORT.PUT_TIME(
0402 "TASK_RESTART (blocked, no preempt)",
0403 TMTEST.END_TIME,
0404 TIME_TEST_SUPPORT.OPERATION_COUNT,
0405 OVERHEAD,
0406 RTEMS_CALLING_OVERHEAD.TASK_RESTART
0407 );
0408
0409 -- yield processor -- tasks block
0410 RTEMS.TASKS.WAKE_AFTER( RTEMS.YIELD_PROCESSOR, STATUS );
0411 TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_WAKE_AFTER" );
0412
0413 TIMER_DRIVER.INITIALIZE;
0414 for INDEX in 1 .. TIME_TEST_SUPPORT.OPERATION_COUNT
0415 loop
0416 RTEMS.TASKS.DELETE( TMTEST.TASK_ID( INDEX ), STATUS );
0417 end loop;
0418 TMTEST.END_TIME := TIMER_DRIVER.READ_TIMER;
0419
0420 TIME_TEST_SUPPORT.PUT_TIME(
0421 "TASK_DELETE (blocked)",
0422 TMTEST.END_TIME,
0423 TIME_TEST_SUPPORT.OPERATION_COUNT,
0424 OVERHEAD,
0425 RTEMS_CALLING_OVERHEAD.TASK_DELETE
0426 );
0427
0428 TEST_SUPPORT.ADA_TEST_END;
0429 RTEMS.SHUTDOWN_EXECUTIVE( 0 );
0430
0431 end HIGH_TASK;
0432
0433 --
0434 -- LOW_TASKS
0435 --
0436
0437 procedure LOW_TASKS (
0438 ARGUMENT : in RTEMS.TASKS.ARGUMENT
0439 ) is
0440 pragma Unreferenced(ARGUMENT);
0441 ID : RTEMS.ID;
0442 STATUS : RTEMS.STATUS_CODES;
0443 begin
0444
0445 TMTEST.TASK_COUNT := TMTEST.TASK_COUNT - 1;
0446
0447 if TMTEST.TASK_COUNT = 0 then
0448
0449 RTEMS.TASKS.CREATE(
0450 RTEMS.BUILD_NAME( 'H', 'I', ' ', ' ' ),
0451 5,
0452 2048,
0453 RTEMS.DEFAULT_OPTIONS,
0454 RTEMS.DEFAULT_ATTRIBUTES,
0455 ID,
0456 STATUS
0457 );
0458 TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_CREATE HI" );
0459
0460 RTEMS.TASKS.START(
0461 ID,
0462 TMTEST.HIGH_TASK'ACCESS,
0463 0,
0464 STATUS
0465 );
0466 TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_START HI" );
0467
0468
0469 RTEMS.TASKS.CREATE(
0470 RTEMS.BUILD_NAME( 'H', 'I', 'G', 'H' ),
0471 3,
0472 2048,
0473 RTEMS.DEFAULT_OPTIONS,
0474 RTEMS.DEFAULT_ATTRIBUTES,
0475 TMTEST.HIGHEST_ID,
0476 STATUS
0477 );
0478 TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_CREATE HIGH" );
0479
0480 RTEMS.TASKS.START(
0481 TMTEST.HIGHEST_ID,
0482 TMTEST.HIGHEST_TASK'ACCESS,
0483 0,
0484 STATUS
0485 );
0486 TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_START HIGH" );
0487
0488
0489 end if;
0490
0491 RTEMS.SEMAPHORE.OBTAIN(
0492 TMTEST.SEMAPHORE_ID,
0493 RTEMS.DEFAULT_OPTIONS,
0494 RTEMS.NO_TIMEOUT,
0495 STATUS
0496 );
0497 TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "SEMAPHORE_OBTAIN" );
0498
0499 end LOW_TASKS;
0500
0501 --
0502 -- RESTART_TASK
0503 --
0504
0505 procedure RESTART_TASK (
0506 ARGUMENT : in RTEMS.TASKS.ARGUMENT
0507 ) is
0508 STATUS : RTEMS.STATUS_CODES;
0509 begin
0510
0511 if ARGUMENT = 1 then
0512 RTEMS.SEMAPHORE.OBTAIN(
0513 TMTEST.SEMAPHORE_ID,
0514 RTEMS.DEFAULT_OPTIONS,
0515 RTEMS.NO_TIMEOUT,
0516 STATUS
0517 );
0518 end if;
0519
0520 end RESTART_TASK;
0521
0522 end TMTEST;