📄 intr.cxx
字号:
cyg_uint32Cyg_Interrupt::chain_isr(cyg_vector vector, CYG_ADDRWORD data){ Cyg_Interrupt *p = *(Cyg_Interrupt **)data; CYG_INSTRUMENT_INTR(CHAIN_ISR, vector, 0); while( p != NULL ) { if( p->vector == vector ) { register cyg_uint32 isr_ret = p->isr(vector, p->data); if( isr_ret & Cyg_Interrupt::CALL_DSR ) p->post_dsr(); if( isr_ret & Cyg_Interrupt::HANDLED ) break; } p = p->next; } return 0;}#endif// -------------------------------------------------------------------------// Attach an ISR to an interrupt vector.voidCyg_Interrupt::attach(void){ CYG_REPORT_FUNCTION(); CYG_ASSERT( vector >= CYGNUM_HAL_ISR_MIN, "Invalid vector"); CYG_ASSERT( vector <= CYGNUM_HAL_ISR_MAX, "Invalid vector"); CYG_INSTRUMENT_INTR(ATTACH, vector, 0); HAL_INTERRUPT_SET_LEVEL( vector, priority ); #ifdef CYGIMP_KERNEL_INTERRUPTS_CHAIN CYG_ASSERT( next == NULL , "Cyg_Interrupt already on a list"); cyg_uint32 index; HAL_TRANSLATE_VECTOR( vector, index ); if( chain_list[index] == NULL ) { int in_use; // First Interrupt on this chain, just assign it and register // the chain_isr with the HAL. chain_list[index] = this; HAL_INTERRUPT_IN_USE( vector, in_use ); CYG_ASSERT( 0 == in_use, "Interrupt vector not free."); HAL_INTERRUPT_ATTACH( vector, chain_isr, &chain_list[index], NULL ); } else { // There are already interrupts chained, add this one into the // chain in priority order. Cyg_Interrupt **p = &chain_list[index]; while( *p != NULL ) { Cyg_Interrupt *n = *p; if( n->priority < priority ) break; p = &n->next; } next = *p; *p = this; } #else { int in_use; HAL_INTERRUPT_IN_USE( vector, in_use ); CYG_ASSERT( 0 == in_use, "Interrupt vector not free."); HAL_INTERRUPT_ATTACH( vector, isr, data, this ); }#endif CYG_REPORT_RETURN();}// -------------------------------------------------------------------------// Detach the ISR from the vectorvoidCyg_Interrupt::detach(void){ CYG_REPORT_FUNCTION(); CYG_ASSERT( vector >= CYGNUM_HAL_ISR_MIN, "Invalid vector"); CYG_ASSERT( vector <= CYGNUM_HAL_ISR_MAX, "Invalid vector"); CYG_INSTRUMENT_INTR(DETACH, vector, 0);#ifdef CYGIMP_KERNEL_INTERRUPTS_CHAIN // Remove the interrupt object from the vector chain. cyg_uint32 index; HAL_TRANSLATE_VECTOR( vector, index ); Cyg_Interrupt **p = &chain_list[index]; while( *p != NULL ) { Cyg_Interrupt *n = *p; if( n == this ) { *p = next; break; } p = &n->next; } // If this was the last one, detach the vector. if( chain_list[index] == NULL ) HAL_INTERRUPT_DETACH( vector, chain_isr ); #else HAL_INTERRUPT_DETACH( vector, isr );#endif CYG_REPORT_RETURN(); }// -------------------------------------------------------------------------// Get the current service routinevoidCyg_Interrupt::get_vsr(cyg_vector vector, cyg_VSR **vsr){ CYG_REPORT_FUNCTION(); CYG_REPORT_FUNCARG2("vector = %d, mem to put VSR in is at %08x", vector, vsr); CYG_ASSERT( vector >= CYGNUM_HAL_VSR_MIN, "Invalid vector"); CYG_ASSERT( vector <= CYGNUM_HAL_VSR_MAX, "Invalid vector"); HAL_VSR_GET( vector, vsr ); CYG_REPORT_RETURN();}// -------------------------------------------------------------------------// Install a vector service routinevoidCyg_Interrupt::set_vsr(cyg_vector vector, cyg_VSR *vsr, cyg_VSR **old){ CYG_REPORT_FUNCTION(); CYG_REPORT_FUNCARG3( "vector = %d, new vsr is at %08x, mem to put " "old VSR in is at %08x", vector, vsr, old); CYG_INSTRUMENT_INTR(SET_VSR, vector, vsr); CYG_ASSERT( vector >= CYGNUM_HAL_VSR_MIN, "Invalid vector"); CYG_ASSERT( vector <= CYGNUM_HAL_VSR_MAX, "Invalid vector"); CYG_INTERRUPT_STATE old_ints; HAL_DISABLE_INTERRUPTS(old_ints); HAL_VSR_SET( vector, vsr, old ); HAL_RESTORE_INTERRUPTS(old_ints); CYG_REPORT_RETURN();}// -------------------------------------------------------------------------// Disable interrupts at the CPUvoidCyg_Interrupt::disable_interrupts(void){ CYG_REPORT_FUNCTION(); CYG_INSTRUMENT_INTR(DISABLE, disable_counter+1, 0); CYG_INTERRUPT_STATE dummy; HAL_DISABLE_INTERRUPTS(dummy); CYG_ASSERT( disable_counter >= 0 , "Disable counter negative"); disable_counter++; CYG_REPORT_RETURN();}// -------------------------------------------------------------------------// Re-enable CPU interruptsvoidCyg_Interrupt::enable_interrupts(void){ CYG_REPORT_FUNCTION(); CYG_INSTRUMENT_INTR(ENABLE, disable_counter, 0); CYG_ASSERT( disable_counter > 0 , "Disable counter not greater than zero"); disable_counter--; if ( disable_counter == 0 ) { HAL_ENABLE_INTERRUPTS(); } CYG_REPORT_RETURN();} // -------------------------------------------------------------------------// Mask a specific interrupt in a PICvoidCyg_Interrupt::mask_interrupt(cyg_vector vector){ CYG_REPORT_FUNCTION(); CYG_REPORT_FUNCARG1("vector=%d", vector); CYG_ASSERT( vector >= CYGNUM_HAL_ISR_MIN, "Invalid vector"); CYG_ASSERT( vector <= CYGNUM_HAL_ISR_MAX, "Invalid vector"); CYG_INSTRUMENT_INTR(MASK, vector, 0); HAL_INTERRUPT_MASK( vector ); CYG_REPORT_RETURN();}// -------------------------------------------------------------------------// Clear PIC maskvoidCyg_Interrupt::unmask_interrupt(cyg_vector vector){ CYG_REPORT_FUNCTION(); CYG_ASSERT( vector >= CYGNUM_HAL_ISR_MIN, "Invalid vector"); CYG_ASSERT( vector <= CYGNUM_HAL_ISR_MAX, "Invalid vector"); CYG_INSTRUMENT_INTR(UNMASK, vector, 0); HAL_INTERRUPT_UNMASK( vector ); CYG_REPORT_RETURN();} // -------------------------------------------------------------------------// Acknowledge interrupt at PICvoidCyg_Interrupt::acknowledge_interrupt(cyg_vector vector){// CYG_REPORT_FUNCTION(); CYG_ASSERT( vector >= CYGNUM_HAL_ISR_MIN, "Invalid vector"); CYG_ASSERT( vector <= CYGNUM_HAL_ISR_MAX, "Invalid vector"); CYG_INSTRUMENT_INTR(ACK, vector, 0); HAL_INTERRUPT_ACKNOWLEDGE( vector );}// -------------------------------------------------------------------------// Change interrupt detection at PICvoidCyg_Interrupt::configure_interrupt( cyg_vector vector, // vector to control cyg_bool level, // level or edge triggered cyg_bool up // hi/lo level, rising/falling edge ){ CYG_REPORT_FUNCTION(); CYG_REPORT_FUNCARG3("vector = %d, level = %d, up = %d", vector, level, up); CYG_ASSERT( vector >= CYGNUM_HAL_ISR_MIN, "Invalid vector"); CYG_ASSERT( vector <= CYGNUM_HAL_ISR_MAX, "Invalid vector"); CYG_INSTRUMENT_INTR(CONFIGURE, vector, (level<<1)|up); HAL_INTERRUPT_CONFIGURE( vector, level, up ); CYG_REPORT_RETURN();}// -------------------------------------------------------------------------// EOF intr/intr.cxx
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -