📄 hal_intr.h
字号:
#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 + -