Using ISR-wrapping with PIO

Posted by Nobody/Anonymous on May 10, 2005
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.

blpio_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


RE: Using ISR-wrapping with PIO

Posted by Richard on May 11, 2005
I replied to your other post.

Regards.