diff options
Diffstat (limited to 'testsuites/ada/tmtests/tm20/tmtest.adb')
-rw-r--r-- | testsuites/ada/tmtests/tm20/tmtest.adb | 455 |
1 files changed, 455 insertions, 0 deletions
diff --git a/testsuites/ada/tmtests/tm20/tmtest.adb b/testsuites/ada/tmtests/tm20/tmtest.adb new file mode 100644 index 0000000000..4a997f3ff4 --- /dev/null +++ b/testsuites/ada/tmtests/tm20/tmtest.adb @@ -0,0 +1,455 @@ +-- +-- TMTEST / BODY +-- +-- DESCRIPTION: +-- +-- This package is the implementation of Test 20 of the RTEMS +-- Timing Test Suite. +-- +-- DEPENDENCIES: +-- +-- +-- +-- COPYRIGHT (c) 1989-2011. +-- On-Line Applications Research Corporation (OAR). +-- +-- The license and distribution terms for this file may in +-- the file LICENSE in this distribution or at +-- http://www.rtems.org/license/LICENSE. +-- + +with INTERFACES; use INTERFACES; +with RTEMS_CALLING_OVERHEAD; +with TEST_SUPPORT; +with TEXT_IO; +with TIMER_DRIVER; +with RTEMS.PARTITION; +with RTEMS.REGION; + +package body TMTEST is + +-- +-- INIT +-- + + procedure INIT ( + ARGUMENT : in RTEMS.TASKS.ARGUMENT + ) is + pragma Unreferenced(ARGUMENT); + STATUS : RTEMS.STATUS_CODES; + begin + + TEXT_IO.NEW_LINE( 2 ); + TEXT_IO.PUT_LINE( "*** TIME TEST 20 ***" ); + + RTEMS.TASKS.CREATE( + RTEMS.BUILD_NAME( 'T', 'I', 'M', '1' ), + 128, + 2048, + RTEMS.DEFAULT_MODES, + RTEMS.DEFAULT_ATTRIBUTES, + TMTEST.TASK_ID( 1 ), + STATUS + ); + TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_CREATE OF TASK1" ); + + RTEMS.TASKS.START( + TMTEST.TASK_ID( 1 ), + TMTEST.TASK_1'ACCESS, + 0, + STATUS + ); + TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_START OF TASK1" ); + + RTEMS.TASKS.CREATE( + RTEMS.BUILD_NAME( 'T', 'I', 'M', '2' ), + 129, + 2048, + RTEMS.DEFAULT_MODES, + RTEMS.DEFAULT_ATTRIBUTES, + TMTEST.TASK_ID( 2 ), + STATUS + ); + TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_CREATE OF TASK2" ); + + RTEMS.TASKS.START( + TMTEST.TASK_ID( 2 ), + TMTEST.TASK_2'ACCESS, + 0, + STATUS + ); + TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_START OF TASK2" ); + + RTEMS.TASKS.DELETE( RTEMS.SELF, STATUS ); + TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_DELETE OF SELF" ); + + end INIT; + +-- +-- TASK_1 +-- + + procedure TASK_1 ( + ARGUMENT : in RTEMS.TASKS.ARGUMENT + ) is + pragma Unreferenced(ARGUMENT); + BUFFER_COUNT : RTEMS.UNSIGNED32; + PREVIOUS_MODE : RTEMS.MODE; + PREVIOUS_PRIORITY : RTEMS.TASKS.PRIORITY; + STATUS : RTEMS.STATUS_CODES; + begin + + TMTEST.PARTITION_NAME := RTEMS.BUILD_NAME( 'P', 'A', 'R', 'T' ); + + TIMER_DRIVER.INITIALIZE; + + RTEMS.PARTITION.CREATE( + TMTEST.PARTITION_NAME, + TMTEST.PARTITION_AREA'ADDRESS, + 2048, + 128, + RTEMS.DEFAULT_ATTRIBUTES, + TMTEST.PARTITION_ID, + STATUS + ); + TMTEST.END_TIME := TIMER_DRIVER.READ_TIMER; + + TIME_TEST_SUPPORT.PUT_TIME( + "PARTITION_CREATE", + TMTEST.END_TIME, + 1, + 0, + RTEMS_CALLING_OVERHEAD.PARTITION_CREATE + ); + + TMTEST.REGION_NAME := RTEMS.BUILD_NAME( 'R', 'E', 'G', 'N' ); + + TIMER_DRIVER.INITIALIZE; + + RTEMS.REGION.CREATE( + TMTEST.REGION_NAME, + TMTEST.REGION_AREA'ADDRESS, + 2048, + 16, + RTEMS.DEFAULT_ATTRIBUTES, + TMTEST.REGION_ID, + STATUS + ); + TMTEST.END_TIME := TIMER_DRIVER.READ_TIMER; + + TIME_TEST_SUPPORT.PUT_TIME( + "REGION_CREATE", + TMTEST.END_TIME, + 1, + 0, + RTEMS_CALLING_OVERHEAD.REGION_CREATE + ); + + TIMER_DRIVER.INITIALIZE; + RTEMS.PARTITION.GET_BUFFER( + TMTEST.PARTITION_ID, + TMTEST.BUFFER_ADDRESS_1, + STATUS + ); + TMTEST.END_TIME := TIMER_DRIVER.READ_TIMER; + + TIME_TEST_SUPPORT.PUT_TIME( + "PARTITION_GET_BUFFER (available)", + TMTEST.END_TIME, + 1, + 0, + RTEMS_CALLING_OVERHEAD.PARTITION_GET_BUFFER + ); + + BUFFER_COUNT := 0; + loop + + RTEMS.PARTITION.GET_BUFFER( + TMTEST.PARTITION_ID, + TMTEST.BUFFER_ADDRESSES( BUFFER_COUNT ), + STATUS + ); + + exit when RTEMS.ARE_STATUSES_EQUAL( STATUS, RTEMS.UNSATISFIED ); + + BUFFER_COUNT := BUFFER_COUNT + 1; + + end loop; + + TIMER_DRIVER.INITIALIZE; + RTEMS.PARTITION.GET_BUFFER( + TMTEST.PARTITION_ID, + TMTEST.BUFFER_ADDRESS_2, + STATUS + ); + TMTEST.END_TIME := TIMER_DRIVER.READ_TIMER; + + TIME_TEST_SUPPORT.PUT_TIME( + "PARTITION_GET_BUFFER (not available)", + TMTEST.END_TIME, + 1, + 0, + RTEMS_CALLING_OVERHEAD.PARTITION_GET_BUFFER + ); + + TIMER_DRIVER.INITIALIZE; + RTEMS.PARTITION.RETURN_BUFFER( + TMTEST.PARTITION_ID, + TMTEST.BUFFER_ADDRESS_1, + STATUS + ); + TMTEST.END_TIME := TIMER_DRIVER.READ_TIMER; + + TIME_TEST_SUPPORT.PUT_TIME( + "PARTITION_RETURN_BUFFER", + TMTEST.END_TIME, + 1, + 0, + RTEMS_CALLING_OVERHEAD.PARTITION_RETURN_BUFFER + ); + + for INDEX in 0 .. BUFFER_COUNT - 1 + loop + + RTEMS.PARTITION.RETURN_BUFFER( + TMTEST.PARTITION_ID, + TMTEST.BUFFER_ADDRESSES( INDEX ), + STATUS + ); + TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "PARTITION_RETURN_BUFFER" ); + + end loop; + + TIMER_DRIVER.INITIALIZE; + RTEMS.PARTITION.DELETE( TMTEST.PARTITION_ID, STATUS ); + TMTEST.END_TIME := TIMER_DRIVER.READ_TIMER; + + TIME_TEST_SUPPORT.PUT_TIME( + "PARTITION_DELETE", + TMTEST.END_TIME, + 1, + 0, + RTEMS_CALLING_OVERHEAD.PARTITION_DELETE + ); + + RTEMS.REGION.GET_SEGMENT( + TMTEST.REGION_ID, + 400, + RTEMS.DEFAULT_OPTIONS, + RTEMS.NO_TIMEOUT, + TMTEST.BUFFER_ADDRESS_2, + STATUS + ); + TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "REGION_GET_SEGMENT" ); + + TIMER_DRIVER.INITIALIZE; + RTEMS.REGION.GET_SEGMENT( + TMTEST.REGION_ID, + 400, + RTEMS.DEFAULT_OPTIONS, + RTEMS.NO_TIMEOUT, + TMTEST.BUFFER_ADDRESS_3, + STATUS + ); + TMTEST.END_TIME := TIMER_DRIVER.READ_TIMER; + + TIME_TEST_SUPPORT.PUT_TIME( + "REGION_GET_SEGMENT (available)", + TMTEST.END_TIME, + 1, + 0, + RTEMS_CALLING_OVERHEAD.REGION_GET_SEGMENT + ); + + TIMER_DRIVER.INITIALIZE; + RTEMS.REGION.GET_SEGMENT( + TMTEST.REGION_ID, + 1998, + RTEMS.NO_WAIT, + RTEMS.NO_TIMEOUT, + TMTEST.BUFFER_ADDRESS_4, + STATUS + ); + TMTEST.END_TIME := TIMER_DRIVER.READ_TIMER; + + TIME_TEST_SUPPORT.PUT_TIME( + "REGION_GET_SEGMENT (NO_WAIT)", + TMTEST.END_TIME, + 1, + 0, + RTEMS_CALLING_OVERHEAD.REGION_GET_SEGMENT + ); + + RTEMS.REGION.RETURN_SEGMENT( + TMTEST.REGION_ID, + TMTEST.BUFFER_ADDRESS_3, + STATUS + ); + TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "REGION_RETURN_SEGMENT" ); + + TIMER_DRIVER.INITIALIZE; + RTEMS.REGION.RETURN_SEGMENT( + TMTEST.REGION_ID, + TMTEST.BUFFER_ADDRESS_2, + STATUS + ); + TMTEST.END_TIME := TIMER_DRIVER.READ_TIMER; + + TIME_TEST_SUPPORT.PUT_TIME( + "REGION_RETURN_SEGMENT (no tasks waiting)", + TMTEST.END_TIME, + 1, + 0, + RTEMS_CALLING_OVERHEAD.REGION_RETURN_SEGMENT + ); + + RTEMS.REGION.GET_SEGMENT( + TMTEST.REGION_ID, + 400, + RTEMS.DEFAULT_OPTIONS, + RTEMS.NO_TIMEOUT, + TMTEST.BUFFER_ADDRESS_1, + STATUS + ); + TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "REGION_GET_SEGMENT" ); + + TIMER_DRIVER.INITIALIZE; + RTEMS.REGION.GET_SEGMENT( + TMTEST.REGION_ID, + 1998, + RTEMS.DEFAULT_OPTIONS, + RTEMS.NO_TIMEOUT, + TMTEST.BUFFER_ADDRESS_2, + STATUS + ); + + -- execute TASK_2 + + TMTEST.END_TIME := TIMER_DRIVER.READ_TIMER; + + TIME_TEST_SUPPORT.PUT_TIME( + "REGION_RETURN_SEGMENT (preempt)", + TMTEST.END_TIME, + 1, + 0, + RTEMS_CALLING_OVERHEAD.REGION_RETURN_SEGMENT + ); + + RTEMS.REGION.RETURN_SEGMENT( + TMTEST.REGION_ID, + TMTEST.BUFFER_ADDRESS_2, + STATUS + ); + TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "REGION_RETURN_SEGMENT" ); + + RTEMS.TASKS.MODE( + RTEMS.NO_PREEMPT, + RTEMS.PREEMPT_MASK, + PREVIOUS_MODE, + STATUS + ); + TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_MODE" ); + + RTEMS.TASKS.SET_PRIORITY( RTEMS.SELF, 254, PREVIOUS_PRIORITY, STATUS ); + TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_SET_PRIORITY" ); + + RTEMS.REGION.GET_SEGMENT( + TMTEST.REGION_ID, + 400, + RTEMS.DEFAULT_OPTIONS, + RTEMS.NO_TIMEOUT, + TMTEST.BUFFER_ADDRESS_1, + STATUS + ); + + RTEMS.REGION.GET_SEGMENT( + TMTEST.REGION_ID, + 1998, + RTEMS.DEFAULT_OPTIONS, + RTEMS.NO_TIMEOUT, + TMTEST.BUFFER_ADDRESS_2, + STATUS + ); + TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "REGION_GET_SEGMENT" ); + + -- execute TASK_2 + + RTEMS.REGION.RETURN_SEGMENT( + TMTEST.REGION_ID, + TMTEST.BUFFER_ADDRESS_2, + STATUS + ); + TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "REGION_RETURN_SEGMENT" ); + + TIMER_DRIVER.INITIALIZE; + RTEMS.REGION.DELETE( TMTEST.REGION_ID, STATUS ); + TMTEST.END_TIME := TIMER_DRIVER.READ_TIMER; + TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "REGION_DELETE" ); + + TIME_TEST_SUPPORT.PUT_TIME( + "REGION_DELETE", + TMTEST.END_TIME, + 1, + 0, + RTEMS_CALLING_OVERHEAD.REGION_DELETE + ); + + TEXT_IO.PUT_LINE( "*** END OF TIME TEST 20 ***" ); + RTEMS.SHUTDOWN_EXECUTIVE( 0 ); + + end TASK_1; + +-- +-- TASK_2 +-- + + procedure TASK_2 ( + ARGUMENT : in RTEMS.TASKS.ARGUMENT + ) is + pragma Unreferenced(ARGUMENT); + STATUS : RTEMS.STATUS_CODES; + begin + + TMTEST.END_TIME := TIMER_DRIVER.READ_TIMER; + + TIME_TEST_SUPPORT.PUT_TIME( + "REGION_GET_SEGMENT (blocking)", + TMTEST.END_TIME, + 1, + 0, + RTEMS_CALLING_OVERHEAD.REGION_GET_SEGMENT + ); + + TIMER_DRIVER.INITIALIZE; + RTEMS.REGION.RETURN_SEGMENT( + TMTEST.REGION_ID, + TMTEST.BUFFER_ADDRESS_1, + STATUS + ); + + -- preempt back to TASK_1 + TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "REGION_RETURN_SEGMENT" ); + + TIMER_DRIVER.INITIALIZE; + RTEMS.REGION.RETURN_SEGMENT( + TMTEST.REGION_ID, + TMTEST.BUFFER_ADDRESS_1, + STATUS + ); + TMTEST.END_TIME := TIMER_DRIVER.READ_TIMER; + TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "REGION_RETURN_SEGMENT" ); + + TIME_TEST_SUPPORT.PUT_TIME( + "REGION_RETURN_SEGMENT (ready -- return)", + TMTEST.END_TIME, + 1, + 0, + RTEMS_CALLING_OVERHEAD.REGION_RETURN_SEGMENT + ); + + RTEMS.TASKS.DELETE( RTEMS.SELF, STATUS ); + TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_DELETE OF SELF" ); + + end TASK_2; + +end TMTEST; |