summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJoel Sherrill <joel.sherrill@OARcorp.com>2001-11-08 14:15:47 +0000
committerJoel Sherrill <joel.sherrill@OARcorp.com>2001-11-08 14:15:47 +0000
commit21766bd6091530fdf1eab7a4d15357ab5d923e07 (patch)
tree94e2cb6f46fc9c7f2333f6b94fdda9c954399771
parent2001-11-07 Jennifer Averett <jennifer@OARcorp.com> (diff)
downloadrtems-21766bd6091530fdf1eab7a4d15357ab5d923e07.tar.bz2
2001-11-08 Jiri Gaisler <jiri@gaisler.com>
This fix is in response to test results reported by Jerry Needell <jerry.needell@unh.edu> for the SPARC/ERC32 and tracked as PR80. * erc32/include/bsp.h: TM27 was not running properly because the ERC32 and LEON cannot nest interrupts at the same level. The BSP test support had to be modified to support using two different interrupt sources. * tm27/task1.c: Account for overhead in starting and stopping the timer.
-rw-r--r--c/src/lib/libbsp/sparc/erc32/include/bsp.h12
-rw-r--r--c/src/tests/tmtests/tm27/task1.c21
2 files changed, 22 insertions, 11 deletions
diff --git a/c/src/lib/libbsp/sparc/erc32/include/bsp.h b/c/src/lib/libbsp/sparc/erc32/include/bsp.h
index 6af1353548..d1e3a058ab 100644
--- a/c/src/lib/libbsp/sparc/erc32/include/bsp.h
+++ b/c/src/lib/libbsp/sparc/erc32/include/bsp.h
@@ -19,8 +19,9 @@
* $Id$
*/
-#ifndef __SIS_h
-#define __SIS_h
+#ifndef __ERC32_BSP_h
+#define __ERC32_BSP_h
+
#ifdef __cplusplus
extern "C" {
@@ -90,16 +91,19 @@ extern "C" {
#else /* use a regular asynchronous trap */
#define TEST_INTERRUPT_SOURCE ERC32_INTERRUPT_EXTERNAL_1
+#define TEST_INTERRUPT_SOURCE2 (ERC32_INTERRUPT_EXTERNAL_1+1)
#define TEST_VECTOR ERC32_TRAP_TYPE( TEST_INTERRUPT_SOURCE )
+#define TEST_VECTOR2 ERC32_TRAP_TYPE( TEST_INTERRUPT_SOURCE2 )
#define MUST_WAIT_FOR_INTERRUPT 1
#define Install_tm27_vector( handler ) \
- set_vector( (handler), TEST_VECTOR, 1 );
+ set_vector( (handler), TEST_VECTOR, 1 ); \
+ set_vector( (handler), TEST_VECTOR2, 1 );
#define Cause_tm27_intr() \
do { \
- ERC32_Force_interrupt( TEST_INTERRUPT_SOURCE ); \
+ ERC32_Force_interrupt( TEST_INTERRUPT_SOURCE+(Interrupt_nest>>1) ); \
nop(); \
nop(); \
nop(); \
diff --git a/c/src/tests/tmtests/tm27/task1.c b/c/src/tests/tmtests/tm27/task1.c
index 0c50f3d0a7..22272d79aa 100644
--- a/c/src/tests/tmtests/tm27/task1.c
+++ b/c/src/tests/tmtests/tm27/task1.c
@@ -34,6 +34,7 @@ volatile rtems_unsigned32 Interrupt_occurred;
volatile rtems_unsigned32 Interrupt_enter_time, Interrupt_enter_nested_time;
volatile rtems_unsigned32 Interrupt_return_time, Interrupt_return_nested_time;
rtems_unsigned32 Interrupt_nest;
+rtems_unsigned32 timer_overhead;
rtems_isr Isr_handler(
rtems_vector_number vector
@@ -75,6 +76,11 @@ rtems_task Init(
status = rtems_task_start( Task_id[ 2 ], Task_2, 0 );
directive_failed( status, "rtems_task_start of Task_2" );
+ Timer_initialize();
+ Read_timer();
+ Timer_initialize();
+ timer_overhead = Read_timer();
+
status = rtems_task_delete( RTEMS_SELF );
directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
}
@@ -94,8 +100,9 @@ rtems_task Task_1(
_Thread_Dispatch_disable_level = 0;
Interrupt_occurred = 0;
+
Timer_initialize();
- Cause_tm27_intr();
+ Cause_tm27_intr();
/* goes to Isr_handler */
#if (MUST_WAIT_FOR_INTERRUPT == 1)
@@ -108,7 +115,7 @@ rtems_task Task_1(
Interrupt_enter_time,
1,
0,
- 0
+ timer_overhead
);
put_time(
@@ -116,7 +123,7 @@ rtems_task Task_1(
Interrupt_return_time,
1,
0,
- 0
+ timer_overhead
);
/*
@@ -129,7 +136,7 @@ rtems_task Task_1(
Interrupt_occurred = 0;
Timer_initialize();
- Cause_tm27_intr();
+ Cause_tm27_intr();
/* goes to Isr_handler */
#if (MUST_WAIT_FOR_INTERRUPT == 1)
@@ -165,7 +172,7 @@ rtems_task Task_1(
Interrupt_occurred = 0;
Timer_initialize();
- Cause_tm27_intr();
+ Cause_tm27_intr();
/*
* goes to Isr_handler and then returns
@@ -197,7 +204,7 @@ rtems_task Task_2(
Interrupt_enter_time,
1,
0,
- 0
+ timer_overhead
);
put_time(
@@ -256,7 +263,7 @@ void Isr_handler_inner( void )
Interrupt_occurred = 0;
Lower_tm27_intr();
Timer_initialize();
- Cause_tm27_intr();
+ Cause_tm27_intr();
/* goes to a nested copy of Isr_handler */
#if (MUST_WAIT_FOR_INTERRUPT == 1)
while ( Interrupt_occurred == 0 );