コード例 #1
0
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;
}
コード例 #2
0
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;
}
コード例 #3
0
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;
}
コード例 #4
0
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
}