On 25/06/2020 01:36, Chris Johns wrote:
On 24/6/20 2:40 am, Sebastian Huber wrote:
Hello,
I noticed that the rtems_interrupt_catch() directive is only declared
and implemented if CPU_SIMPLE_VECTORED_INTERRUPTS == TRUE:
#if (CPU_SIMPLE_VECTORED_INTERRUPTS == FALSE)
typedef ISR_Handler_entry rtems_isr_entry;
#else
/**
* @brief Interrupt handler type.
*
* @see rtems_interrupt_catch()
*/
typedef rtems_isr ( *rtems_isr_entry )(
rtems_vector_number
);
/**
* @brief RTEMS Interrupt Catch
*
* This directive installs @a new_isr_handler as the RTEMS interrupt
service
* routine for the interrupt vector with number @a vector. The
previous RTEMS
* interrupt service routine is returned in @a old_isr_handler.
*
* @param[in] new_isr_handler is the address of interrupt service
routine
* @param[in] vector is the interrupt vector number
* @param[in] old_isr_handler address at which to store previous ISR
address
*
* @retval RTEMS_SUCCESSFUL and *old_isr_handler filled with
previous ISR
* address
*/
rtems_status_code rtems_interrupt_catch(
rtems_isr_entry new_isr_handler,
rtems_vector_number vector,
rtems_isr_entry *old_isr_handler
);
#endif
This is not mentioned in the documentation:
https://docs.rtems.org/branches/master/c-user/interrupt_manager.html#interrupt-catch-establish-an-isr
Should we provide this function also if
CPU_SIMPLE_VECTORED_INTERRUPTS == FALSE and for example just return
RTEMS_NOT_IMPLEMENTED?
Which archs define CPU_SIMPLE_VECTORED_INTERRUPTS as false?
cpukit/score/cpu/arm/include/rtems/score/cpu.h:#define
CPU_SIMPLE_VECTORED_INTERRUPTS FALSE
cpukit/score/cpu/v850/include/rtems/score/cpu.h:#define
CPU_SIMPLE_VECTORED_INTERRUPTS FALSE
cpukit/score/cpu/x86_64/include/rtems/score/cpu.h:#define
CPU_SIMPLE_VECTORED_INTERRUPTS FALSE
cpukit/score/cpu/i386/include/rtems/score/cpu.h:#define
CPU_SIMPLE_VECTORED_INTERRUPTS FALSE
cpukit/score/cpu/powerpc/include/rtems/score/cpu.h:#define
CPU_SIMPLE_VECTORED_INTERRUPTS FALSE
cpukit/score/cpu/mips/include/rtems/score/cpu.h:#define
CPU_SIMPLE_VECTORED_INTERRUPTS FALSE
cpukit/score/cpu/m68k/include/rtems/score/cpu.h:#define
CPU_SIMPLE_VECTORED_INTERRUPTS TRUE
cpukit/score/cpu/bfin/include/rtems/score/cpu.h:#define
CPU_SIMPLE_VECTORED_INTERRUPTS TRUE
cpukit/score/cpu/sparc64/include/rtems/score/cpu.h:#define
CPU_SIMPLE_VECTORED_INTERRUPTS TRUE
cpukit/score/cpu/sh/include/rtems/score/cpu.h:#define
CPU_SIMPLE_VECTORED_INTERRUPTS TRUE
cpukit/score/cpu/lm32/include/rtems/score/cpu.h:#define
CPU_SIMPLE_VECTORED_INTERRUPTS TRUE
cpukit/score/cpu/no_cpu/include/rtems/score/cpu.h:#define
CPU_SIMPLE_VECTORED_INTERRUPTS TRUE
cpukit/score/cpu/nios2/include/rtems/score/cpu.h:#define
CPU_SIMPLE_VECTORED_INTERRUPTS TRUE
cpukit/score/cpu/sparc/include/rtems/score/cpu.h:#define
CPU_SIMPLE_VECTORED_INTERRUPTS TRUE
cpukit/score/cpu/moxie/include/rtems/score/cpu.h:#define
CPU_SIMPLE_VECTORED_INTERRUPTS TRUE
It seem riscv is missing, so an implicit FALSE.
Instead of returning RTEMS_NOT_IMPLEMENTED we could also implement it
like this for CPU_SIMPLE_VECTORED_INTERRUPTS == FALSE:
#if CPU_SIMPLE_VECTORED_INTERRUPTS == TRUE
typedef ISR_Handler_entry rtems_isr_entry;
#else
typedef void ( *rtems_isr_entry )( void * );
/* Now: typedef void rtems_isr_entry; */
#endif
rtems_status_code rtems_interrupt_catch(
rtems_isr_entry new_isr_handler,
rtems_vector_number vector,
rtems_isr_entry *old_isr_handler
)
{
rtems_status_code sc;
if ( old_isr_handler == NULL ) {
return RTEMS_INVALID_ADDRESS;
}
sc = rtems_interrupt_handler_install(
vector,
"Catch",
RTEMS_INTERRUPT_UNIQUE,
new_isr_handler,
NULL
);
if ( sc == RTEMS_SUCCESSFUL ) {
*old_isr_handler = NULL;
}
return RTEMS_SUCCESSFUL;
}
_______________________________________________
devel mailing list
devel@rtems.org
http://lists.rtems.org/mailman/listinfo/devel