Back to home page

LXR

 
 

    


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;