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

📄 hal_intr.h

📁 ecos为实时嵌入式操作系统
💻 H
📖 第 1 页 / 共 2 页
字号:
#define HAL_RESTORE_INTERRUPTS(_old_)                                   \    CYG_MACRO_START                                                     \    cyg_ucount8 _i_;                                                    \    cyg_hal_interrupts_disabled = (_old_);                              \    if (0 == cyg_hal_interrupts_disabled) {                             \        if (cyg_hal_interrupts_deferred) {                              \            cyg_hal_interrupts_deferred = 0;                            \            for (_i_ = CYGNUM_HAL_ISR_MIN; _i_ <= CYGNUM_HAL_ISR_MAX;   \                 _i_++){                                                \                if (cyg_hal_interrupts_unhandled[_i_]) {                \                    cyg_hal_default_interrupt_vsr(_i_);                 \                }                                                       \            }                                                           \        }                                                               \    }                                                                   \    CYG_MACRO_END#define HAL_QUERY_INTERRUPTS(_old_)             \    CYG_MACRO_START                             \    (_old_) = !cyg_hal_interrupts_disabled;     \    CYG_MACRO_END// FIXME: Must interract with the disable/enable macro.// --proven 19981005#define LINUX_SIG_UNBLOCK 1#define HAL_INTERRUPT_ACKNOWLEDGE( _vector_ )                   \    CYG_MACRO_START                                             \    long _old_, _new_;                                          \    _new_ = 0xffffffff;                                         \    cyg_hal_interrupts_unhandled[_vector_] = 0;                 \    cyg_hal_sys_sigprocmask(LINUX_SIG_UNBLOCK, &_new_, &_old_); \    CYG_MACRO_END#endif // ifdef CYGPKG_HAL_I386_LINUX//---------------------------------------------------------------------------// Translate a vector number into an ISR table index.#ifdef CYGPKG_HAL_I386_LINUX// The native linux port doesn't support chained interrupts --proven 19981005#define HAL_TRANSLATE_VECTOR(_vector_,_index_) (_index_) = (_vector_)#endif//---------------------------------------------------------------------------// Interrupt and VSR attachment macrosexternC cyg_uint32 cyg_hal_default_isr(CYG_ADDRWORD vector, CYG_ADDRWORD data);#define HAL_INTERRUPT_IN_USE( _vector_, _state_)        \    CYG_MACRO_START                                     \    cyg_uint32 _index_;                                 \    HAL_TRANSLATE_VECTOR ((_vector_), _index_);         \                                                        \    if (cyg_hal_interrupt_handlers[_index_]             \        ==(CYG_ADDRESS)&cyg_hal_default_isr)            \        (_state_) = 0;                                  \    else                                                \        (_state_) = 1;                                  \    CYG_MACRO_END#define HAL_INTERRUPT_ATTACH( _vector_, _isr_, _data_, _object_ )       \    CYG_MACRO_START                                                     \    cyg_uint32 _index_;                                                 \    HAL_TRANSLATE_VECTOR((_vector_), _index_);                          \                                                                        \    if (cyg_hal_interrupt_handlers[_index_]                             \        ==(CYG_ADDRESS)&cyg_hal_default_isr)                            \    {                                                                   \        cyg_hal_interrupt_handlers[_index_] = (CYG_ADDRESS)(_isr_);     \        cyg_hal_interrupt_data[_index_] = (CYG_ADDRWORD)(_data_);       \        cyg_hal_interrupt_objects[_index_] = (CYG_ADDRESS)(_object_);   \    }                                                                   \    CYG_MACRO_END#define HAL_INTERRUPT_DETACH( _vector_, _isr_ ) \    CYG_MACRO_START                             \    cyg_uint32 _index_;                         \    HAL_TRANSLATE_VECTOR((_vector_), _index_);  \                                                \    if (cyg_hal_interrupt_handlers[_index_]     \        == (CYG_ADDRESS)(_isr_))                \    {                                           \        cyg_hal_interrupt_handlers[_index_] =   \            (CYG_ADDRESS)&cyg_hal_default_isr;  \        cyg_hal_interrupt_data[_index_] = 0;    \        cyg_hal_interrupt_objects[_index_] = 0; \    }                                           \    CYG_MACRO_END#define HAL_VSR_GET( _vector_, _pvsr_ )                         \    *((CYG_ADDRESS *)(_pvsr_)) = cyg_hal_vsr_table[(_vector_)];    #define HAL_VSR_SET( _vector_, _vsr_, _poldvsr_ )                       \    CYG_MACRO_START                                                     \    if( (_poldvsr_) != NULL )                                           \        *(CYG_ADDRESS *)(_poldvsr_) = cyg_hal_vsr_table[(_vector_)];    \    cyg_hal_vsr_table[(_vector_)] = (CYG_ADDRESS)(_vsr_);               \    CYG_MACRO_END//---------------------------------------------------------------------------// Interrupt controller access#ifdef CYGPKG_HAL_I386_LINUX#define HAL_INTERRUPT_MASK( _vector_ )                          \    CYG_MACRO_START                                             \    /* Use sigblock to mask a vector */                         \    CYG_EMPTY_STATEMENT;                                        \    CYG_MACRO_END#define HAL_INTERRUPT_UNMASK( _vector_ )                        \    CYG_MACRO_START                                             \    /* Use sigunblock to mask a vector */                       \    CYG_EMPTY_STATEMENT;                                        \    CYG_MACRO_END// The native linux port doesn't have configurable interrupts.#define HAL_INTERRUPT_CONFIGURE( _vector_, _level_, _up_ )      // The native linux port doesn't have interrupt levels.#define HAL_INTERRUPT_SET_LEVEL( _vector_, _level_ )            #endif // ifdef CYGPKG_HAL_I386_LINUX//---------------------------------------------------------------------------// Clock control#ifdef CYGPKG_HAL_I386_LINUXstruct hal_timeval {    long tv_sec;    long tv_usec;};struct hal_itimerval {    struct hal_timeval it_interval;    struct hal_timeval it_value;};externC int cyg_hal_sys_setitimer(int, const struct hal_itimerval*,                                  struct hal_itimerval*);externC int cyg_hal_sys_getitimer(int, struct hal_itimerval*);#ifdef CYGSEM_HAL_I386_LINUX_REAL_TIME#define CYGNUM_HAL_TIMER_TYPE 0         // ITIMER_REAL#else#define CYGNUM_HAL_TIMER_TYPE 1         // ITIMER_VIRTUAL#endif#define HAL_CLOCK_INITIALIZE( _period_ )                                \    CYG_MACRO_START                                                     \    struct hal_itimerval new_itimerval, old;                            \                                                                        \    new_itimerval.it_interval.tv_sec = 0;                               \    new_itimerval.it_interval.tv_usec = (_period_);                     \    new_itimerval.it_value.tv_sec = 0;                                  \    new_itimerval.it_value.tv_usec = (_period_);                        \    /* Use setitimer to set the realtime clock */                       \    cyg_hal_sys_setitimer(CYGNUM_HAL_TIMER_TYPE, &new_itimerval, &old); \    CYG_MACRO_END// The clock reinitializes itself.#define HAL_CLOCK_RESET( _vector_, _period_ )// This timer counts down, so subtract from set value.#define HAL_CLOCK_READ( _pvalue_ )                                      \    CYG_MACRO_START                                                     \    struct hal_itimerval old_itimerval;                                 \    cyg_hal_sys_getitimer(CYGNUM_HAL_TIMER_TYPE, &old_itimerval);       \    *(_pvalue_) = old_itimerval.it_interval.tv_usec -                   \      old_itimerval.it_value.tv_usec;                                   \    CYG_MACRO_END#define HAL_CLOCK_LATENCY( _pvalue_ )           \    HAL_CLOCK_READ((_pvalue_))#endif // ifdef CYGPKG_HAL_I386_LINUX//---------------------------------------------------------------------------#endif // ifndef CYGONCE_HAL_HAL_INTR_H// End of hal_intr.h

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -