⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 intr.cxx

📁 ecos为实时嵌入式操作系统
💻 CXX
📖 第 1 页 / 共 2 页
字号:
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 + -