mirror of
https://gitlab.rtems.org/rtems/rtos/rtems.git
synced 2025-11-16 12:34:45 +00:00
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.
This commit is contained in:
@@ -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(); \
|
||||
|
||||
@@ -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 );
|
||||
|
||||
Reference in New Issue
Block a user