void LPC24XX_VIC_Driver::IRQ_Handler() { UINT32 index; LPC24XX_VIC& VIC = LPC24XX::VIC(); // set before jumping elsewhere or allowing other interrupts SystemState_SetNoLock( SYSTEM_STATE_ISR ); SystemState_SetNoLock( SYSTEM_STATE_NO_CONTINUATIONS ); index = VIC.ADDRESS; IRQ_VECTORING* IsrVector = &s_IsrTable[ index ]; // In case the interrupt was forced, remove the flag. VIC.RemoveForcedInterrupt( index ); IsrVector->Handler.Execute(); SystemState_ClearNoLock( SYSTEM_STATE_NO_CONTINUATIONS ); // nestable SystemState_ClearNoLock( SYSTEM_STATE_ISR ); // nestable // Reset VIC priority hw logic. VIC.ADDRESS = 0xFF; }
void /*__irq*/ AT91_AIC_Driver::IRQ_Handler(void) { unsigned int index; AT91_AIC &aic = AT91::AIC(); // set before jumping elsewhere or allowing other interrupts SystemState_SetNoLock( SYSTEM_STATE_ISR ); SystemState_SetNoLock( SYSTEM_STATE_NO_CONTINUATIONS ); while( (index = aic.AIC_IVR) < c_VECTORING_GUARD) { // Read IVR register (de-assert NIRQ) & check if we a spurous IRQ IRQ_VECTORING* IsrVector = &s_IsrTable[ index ]; // In case the interrupt was forced, remove the flag. RemoveForcedInterrupt( index ); IsrVector->Handler.Execute(); // Mark end of Interrupt aic.AIC_EOICR = 1; } SystemState_ClearNoLock( SYSTEM_STATE_NO_CONTINUATIONS ); // nestable SystemState_ClearNoLock( SYSTEM_STATE_ISR ); // nestable // Mark end of Interrupt (Last IVR read) aic.AIC_EOICR = 1; }
void __irq IRQ_Handler() { unsigned int index; // set before jumping elsewhere or allowing other interrupts SystemState_SetNoLock(SYSTEM_STATE_ISR); SystemState_SetNoLock(SYSTEM_STATE_NO_CONTINUATIONS); while ((index = AIC->AIC_IVR) < ID_PERIPH_COUNT) { // Read IVR register (de-assert NIRQ) & check if we a spurous IRQ IRQ_VECTORING* IsrVector = &s_IsrTable[index]; // In case the interrupt was forced, remove the flag. IRQ_ClearIT(index); IsrVector->Handler.Execute(); // Mark end of Interrupt AIC->AIC_EOICR = 1; } SystemState_ClearNoLock(SYSTEM_STATE_NO_CONTINUATIONS); // nestable SystemState_ClearNoLock(SYSTEM_STATE_ISR); // nestable // Mark end of Interrupt (Last IVR read) AIC->AIC_EOICR = 1; }
void MC9328MXL_AITC_Driver::IRQ_Handler() { UINT32 index; MC9328MXL_AITC& AITC = MC9328MXL::AITC(); // set before jumping elsewhere or allowing other interrupts SystemState_SetNoLock( SYSTEM_STATE_ISR ); SystemState_SetNoLock( SYSTEM_STATE_NO_CONTINUATIONS ); while((index = AITC.NormalInterruptPending()) != AITC.c_MaxInterruptIndex) { IRQ_VECTORING* IsrVector = &s_IsrTable[ index ]; // In case the interrupt was forced, remove the flag. AITC.RemoveForcedInterrupt( index ); IsrVector->Handler.Execute(); } SystemState_ClearNoLock( SYSTEM_STATE_NO_CONTINUATIONS ); // nestable SystemState_ClearNoLock( SYSTEM_STATE_ISR ); // nestable }