Using ISR-wrapping with PIO
Hello!
I am having problems to get the ISR-handler for PIO to work . The interrupt is called properly but when processor is about to leave the ISR I get a data abort when portRESTORE_CONTEXT is called. I can’t figure out why!! ???
My code follows:
__arm void pio_ISR( void )
{
portCHAR cContextSwitchRequired;
int dummy;
dummy = AT91C_BASE_PIOA->PIO_ISR;
dummy=dummy; //Suppress compiler warning
//* Read the output state
if ( (AT91F_PIO_GetInput(AT91C_BASE_PIOA) & INPUT_SERVO2_CAP) == INPUT_SERVO2_CAP); //Don’t do anything, rising edge
else //Falling edge -> capture value in
{
measure.duty_channel_2 = TimerBaseCPWM->TC_CV;
}
cContextSwitchRequired = pdFALSE;
portEND_SWITCHING_ISR( ( cContextSwitchRequired ) );
/* End the interrupt in the AIC. */
AT91C_BASE_AIC->AIC_EOICR = 0;
}
The interrupt is configured according to following lines:
AT91F_PIO_CfgInput(AT91C_BASE_PIOA, INPUT_SERVO2_CAP);
AT91F_AIC_ConfigureIt (AT91C_BASE_AIC, AT91C_ID_PIOA, PIO_INTERRUPT_LEVEL, AT91C_AIC_SRCTYPE_INT_LEVEL_SENSITIVE, ( void (*)( void ) ) pio_ISREntry);
AT91F_PIO_InterruptEnable(AT91C_BASE_PIOA, INPUT_SERVO2_CAP);
//* set the interrupt by software
AT91F_AIC_EnableIt (AT91C_BASE_AIC, AT91C_ID_PIOA);
My wrapping file looks like this:
RSEG ICODE:CODE
CODE32
EXTERN pio_ISR
PUBLIC pio_ISREntry
; Wrapper for the USB interrupt service routine. This can cause a
; context switch so requires an assembly wrapper.
; Defines the portSAVE_CONTEXT and portRESTORE_CONTEXT macros.
#include "ISR_Support.h"
pio_ISREntry:
portSAVE_CONTEXT ; Save the context of the current task.
bl pio_ISR ; Call the ISR routine.
portRESTORE_CONTEXT ; Restore the context of the current task –
; which may be different to the task that
; was interrupted.
END
Thanks in advance!
//MB
Using ISR-wrapping with PIO
I replied to your other post.
Regards.