📄 hal_intr.h
字号:
{ \
/* ICRs are 16 bit regs at 32 bit spacing */ \
cyg_ucount16 _ix_ = ((_vector_)>>2)<<1; \
\
/* read the appropriate interrupt control register */ \
cyg_uint16 _icr_ = mn10300_interrupt_control[_ix_]; \
\
/* extract interrupt priority level */ \
_index_ = CYGNUM_HAL_INTERRUPT_RESERVED_3 + ((_icr_ >> 12) & 0x7); \
} \
}
#else
#define HAL_TRANSLATE_VECTOR(_vector_,_index_) _index_ = (_vector_)
#endif
#endif
//--------------------------------------------------------------------------
// Interrupt and VSR attachment macros
#define HAL_INTERRUPT_IN_USE( _vector_, _state_) \
CYG_MACRO_START \
cyg_uint32 _index_; \
HAL_TRANSLATE_VECTOR ((_vector_), _index_); \
\
if( hal_interrupt_handlers[_index_] == (CYG_ADDRESS)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( hal_interrupt_handlers[_index_] == (CYG_ADDRESS)HAL_DEFAULT_ISR ) \
{ \
hal_interrupt_handlers[_index_] = (CYG_ADDRESS)_isr_; \
hal_interrupt_data[_index_] = (CYG_ADDRWORD)_data_; \
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( hal_interrupt_handlers[_index_] == (CYG_ADDRESS)_isr_ ) \
{ \
hal_interrupt_handlers[_index_] = (CYG_ADDRESS)HAL_DEFAULT_ISR; \
hal_interrupt_data[_index_] = 0; \
hal_interrupt_objects[_index_] = 0; \
} \
CYG_MACRO_END
#define HAL_VSR_GET( _vector_, _pvsr_ ) \
*((CYG_ADDRESS *)_pvsr_) = hal_vsr_table[_vector_];
#define HAL_VSR_SET( _vector_, _vsr_, _poldvsr_ ) \
if( _poldvsr_ != NULL ) \
*(CYG_ADDRESS *)_poldvsr_ = hal_vsr_table[_vector_]; \
hal_vsr_table[_vector_] = (CYG_ADDRESS)_vsr_;
//--------------------------------------------------------------------------
// Interrupt controller access
// Read interrupt control registers back after writing to them. This
// ensures that the written value is not sitting in the store buffers
// when interrupts are re-enabled.
#define HAL_INTERRUPT_MASK( _vector_ ) \
{ \
/* ICRs are 16 bit regs at 32 bit spacing */ \
cyg_ucount16 _index_ = ((_vector_)>>2)<<1; \
\
/* read the appropriate interrupt control register */ \
cyg_uint16 _icr_ = mn10300_interrupt_control[_index_]; \
\
/* clear interrupt enable bit for this vector */ \
_icr_ &= ~(0x0100<<((_vector_)&3)); \
\
/* restore the interrupt control register */ \
mn10300_interrupt_control[_index_] = _icr_; \
_icr_ = mn10300_interrupt_control[_index_]; \
}
#define HAL_INTERRUPT_UNMASK( _vector_ ) \
{ \
/* ICRs are 16 bit regs at 32 bit spacing */ \
cyg_ucount16 _index_ = (_vector_>>2)<<1; \
\
/* read the appropriate interrupt control register */ \
cyg_uint16 _icr_ = mn10300_interrupt_control[_index_]; \
\
/* set interrupt enable bit for this vector */ \
_icr_ |= (0x0100<<(_vector_&3)); \
\
/* restore the interrupt control register */ \
mn10300_interrupt_control[_index_] = _icr_; \
_icr_ = mn10300_interrupt_control[_index_]; \
}
#define HAL_INTERRUPT_ACKNOWLEDGE( _vector_ ) \
{ \
/* ICRs are 16 bit regs at 32 bit spacing */ \
cyg_ucount16 _index_ = ((_vector_)>>2)<<1; \
\
/* read the appropriate interrupt control register */ \
cyg_uint16 _icr_ = mn10300_interrupt_control[_index_]; \
\
/* clear interrupt request bit for this vector */ \
_icr_ &= ~(0x0010<<((_vector_)&3)); \
\
/* set interrupt detect bit for this vector */ \
_icr_ |= (0x0001<<((_vector_)&3)); \
\
/* restore the interrupt control register */ \
mn10300_interrupt_control[_index_] = _icr_; \
_icr_ = mn10300_interrupt_control[_index_]; \
}
#if !defined(HAL_INTERRUPT_CONFIGURE)
#error HAL_INTERRUPT_CONFIGURE not defined by variant
#endif
#define HAL_INTERRUPT_SET_LEVEL( _vector_, _level_ ) \
{ \
/* ICRs are 16 bit regs at 32 bit spacing */ \
cyg_ucount16 _index_ = (_vector_>>2)<<1; \
\
/* read the appropriate interrupt control register */ \
cyg_uint16 _icr_ = mn10300_interrupt_control[_index_]; \
\
/* set interrupt level for this group of vectors */ \
_icr_ &= 0x0FFF; \
_icr_ |= (_level_)<<12; \
\
/* restore the interrupt control register */ \
mn10300_interrupt_control[_index_] = _icr_; \
_icr_ = mn10300_interrupt_control[_index_]; \
}
//--------------------------------------------------------------------------
// Clock control.
// This is almost all handled in the var_intr.h.
#ifdef CYGVAR_KERNEL_COUNTERS_CLOCK_LATENCY
#define HAL_CLOCK_LATENCY(_pvalue_) HAL_CLOCK_READ(_pvalue_)
#endif
//--------------------------------------------------------------------------
// Memory region top
//
#if CYGINT_HAL_MN10300_MEM_REAL_REGION_TOP
externC cyg_uint8 *hal_mn10300_mem_real_region_top( cyg_uint8 *_regionend_ );
# define HAL_MEM_REAL_REGION_TOP( _regionend_ ) \
hal_mn10300_mem_real_region_top( _regionend_ )
#endif
//--------------------------------------------------------------------------
#endif // ifndef CYGONCE_HAL_HAL_INTR_H
// EOF hal_intr.h
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -