--
-- TMTEST / BODY
--
-- DESCRIPTION:
--
-- This package is the implementation of Test 27 of the RTEMS
-- Timing Test Suite.
--
-- DEPENDENCIES:
--
--
--
-- COPYRIGHT (c) 1989-1997.
-- On-Line Applications Research Corporation (OAR).
-- Copyright assigned to U.S. Government, 1994.
--
-- The license and distribution terms for this file may in
-- the file LICENSE in this distribution or at
-- http://www.OARcorp.com/rtems/license.html.
--
-- $Id$
--
with INTERRUPT_TIME_TEST_SUPPORT;
with INTERFACES; use INTERFACES;
with RTEMS_CALLING_OVERHEAD;
with RTEMS;
with RTEMS_TEST_SUPPORT;
with TEST_SUPPORT;
with TEXT_IO;
with TIME_TEST_SUPPORT;
with UNSIGNED32_IO;
package body TMTEST is
--PAGE
--
-- INIT
--
procedure INIT (
ARGUMENT : in RTEMS.TASK_ARGUMENT
) is
STATUS : RTEMS.STATUS_CODES;
begin
TEXT_IO.NEW_LINE( 2 );
TEXT_IO.PUT_LINE( "*** TIME TEST 27 ***" );
RTEMS.TASK_CREATE(
RTEMS.BUILD_NAME( 'T', 'A', '1', ' ' ),
254,
2048,
RTEMS.DEFAULT_MODES,
RTEMS.DEFAULT_ATTRIBUTES,
TMTEST.TASK_ID( 1 ),
STATUS
);
TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_CREATE TASK_1" );
RTEMS.TASK_START(
TMTEST.TASK_ID( 1 ),
TMTEST.TASK_1'ACCESS,
0,
STATUS
);
TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_START TASK_1" );
RTEMS.TASK_CREATE(
RTEMS.BUILD_NAME( 'T', 'A', '2', ' ' ),
254,
2048,
RTEMS.DEFAULT_MODES,
RTEMS.DEFAULT_ATTRIBUTES,
TMTEST.TASK_ID( 2 ),
STATUS
);
TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_CREATE TASK_2" );
RTEMS.TASK_START(
TMTEST.TASK_ID( 2 ),
TMTEST.TASK_2'ACCESS,
0,
STATUS
);
TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_START TASK_2" );
RTEMS.TASK_DELETE( RTEMS.SELF, STATUS );
TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_DELETE OF SELF" );
end INIT;
--PAGE
--
-- TASK_1
--
procedure TASK_1 (
ARGUMENT : in RTEMS.TASK_ARGUMENT
) is
begin
RTEMS_TEST_SUPPORT.THREAD_DISPATCH_DISABLE_LEVEL := 1;
TMTEST.INTERRUPT_NEST := 1;
INTERRUPT_TIME_TEST_SUPPORT.INSTALL_HANDLER(
TMTEST.ISR_HANDLER'ADDRESS
);
TIMER_DRIVER.INITIALIZE;
INTERRUPT_TIME_TEST_SUPPORT.CAUSE_INTERRUPT;
-- goes to ISR_HANDLER
TMTEST.INTERRUPT_RETURN_TIME := TIMER_DRIVER.READ_TIMER;
TIME_TEST_SUPPORT.PUT_TIME(
"INTERRUPT_ENTER (nested interrupt)",
TMTEST.INTERRUPT_ENTER_NESTED_TIME,
1,
0,
0
);
TIME_TEST_SUPPORT.PUT_TIME(
"INTERRUPT_RETURN (nested interrupt)",
TMTEST.INTERRUPT_RETURN_NESTED_TIME,
1,
0,
0
);
TMTEST.INTERRUPT_NEST := 0;
RTEMS_TEST_SUPPORT.THREAD_DISPATCH_DISABLE_LEVEL := 0;
TIMER_DRIVER.INITIALIZE;
INTERRUPT_TIME_TEST_SUPPORT.CAUSE_INTERRUPT;
-- goes to ISR_HANDLER
TMTEST.INTERRUPT_RETURN_TIME := TIMER_DRIVER.READ_TIMER;
TIME_TEST_SUPPORT.PUT_TIME(
"INTERRUPT_ENTER (no preempt)",
TMTEST.INTERRUPT_ENTER_TIME,
1,
0,
0
);
TIME_TEST_SUPPORT.PUT_TIME(
"INTERRUPT_RETURN (no preempt)",
TMTEST.INTERRUPT_RETURN_TIME,
1,
0,
0
);
RTEMS_TEST_SUPPORT.THREAD_DISPATCH_DISABLE_LEVEL := 0;
RTEMS_TEST_SUPPORT.THREAD_HEIR :=
RTEMS_TEST_SUPPORT.THREAD_TO_CONTROL_POINTER(
RTEMS_TEST_SUPPORT.CHAIN_NODE_POINTER_TO_ADDRESS(
RTEMS_TEST_SUPPORT.THREAD_READY_CHAIN( 254 ).LAST
)
);
RTEMS_TEST_SUPPORT.CONTEXT_SWITCH_NECESSARY := TRUE;
TIMER_DRIVER.INITIALIZE;
INTERRUPT_TIME_TEST_SUPPORT.CAUSE_INTERRUPT;
-- goes to ISR_HANDLER
end TASK_1;
--PAGE
--
-- TASK_2
--
procedure TASK_2 (
ARGUMENT : in RTEMS.TASK_ARGUMENT
) is
begin
TMTEST.INTERRUPT_RETURN_TIME := TIMER_DRIVER.READ_TIMER;
TIME_TEST_SUPPORT.PUT_TIME(
"INTERRUPT_ENTER (preempt)",
TMTEST.INTERRUPT_ENTER_TIME,
1,
0,
0
);
TIME_TEST_SUPPORT.PUT_TIME(
"INTERRUPT_RETURN (preempt)",
TMTEST.INTERRUPT_RETURN_TIME,
1,
0,
0
);
RTEMS.SHUTDOWN_EXECUTIVE( 0 );
end TASK_2;
--PAGE
--
-- ISR_HANDLER
--
--
-- The ISR_HANDLER and ISR_HANDLER_INNER subprograms are structured
-- so that there will be as little entry overhead as possible included
-- in the interrupt entry time.
--
procedure ISR_HANDLER (
VECTOR : in RTEMS.VECTOR_NUMBER
) is
begin
TMTEST.END_TIME := TIMER_DRIVER.READ_TIMER;
TMTEST.ISR_HANDLER_INNER;
end ISR_HANDLER;
--
-- ISR_HANDLER_INNER
--
procedure ISR_HANDLER_INNER
is
begin
-- enable tracing here is necessary
INTERRUPT_TIME_TEST_SUPPORT.CLEAR_INTERRUPT;
case TMTEST.INTERRUPT_NEST is
when 0 =>
TMTEST.INTERRUPT_ENTER_TIME := TMTEST.END_TIME;
when 1 =>
TMTEST.INTERRUPT_ENTER_TIME := TMTEST.END_TIME;
TMTEST.INTERRUPT_NEST := 2;
TIMER_DRIVER.INITIALIZE;
INTERRUPT_TIME_TEST_SUPPORT.CAUSE_INTERRUPT;
-- goes to a nested copy of ISR_HANDLER
TMTEST.INTERRUPT_RETURN_NESTED_TIME := TIMER_DRIVER.READ_TIMER;
when 2 =>
TMTEST.INTERRUPT_ENTER_NESTED_TIME := TMTEST.END_TIME;
when others =>
NULL;
end case;
-- Start the timer so interrupt return times can be measured
TIMER_DRIVER.INITIALIZE;
end ISR_HANDLER_INNER;
end TMTEST;