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

📄 hal_intr.h

📁 ecos为实时嵌入式操作系统
💻 H
📖 第 1 页 / 共 2 页
字号:
#else#define HAL_TRANSLATE_VECTOR(_vector_,_index_) (_index_) = (_vector_)#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_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_;             \    }                                                                       \}#define HAL_INTERRUPT_DETACH( _vector_, _isr_ )                         \{                                                                       \    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;                             \    }                                                                   \}#define HAL_VSR_GET( _vector_, _pvsr_ )                 \    *(_pvsr_) = (void (*)())hal_vsr_table[_vector_];    #define HAL_VSR_SET( _vector_, _vsr_, _poldvsr_ ) CYG_MACRO_START         \    if( _poldvsr_ != NULL)                                                \        *(CYG_ADDRESS *)_poldvsr_ = (CYG_ADDRESS)hal_vsr_table[_vector_]; \    hal_vsr_table[_vector_] = (CYG_ADDRESS)_vsr_;                         \CYG_MACRO_END// This is an ugly name, but what it means is: grab the VSR back to eCos// internal handling, or if you like, the default handler.  But if// cooperating with GDB and CygMon, the default behaviour is to pass most// exceptions to CygMon.  This macro undoes that so that eCos handles the// exception.  So use it with care.externC void __default_exception_vsr(void);externC void __default_interrupt_vsr(void);#define HAL_VSR_SET_TO_ECOS_HANDLER( _vector_, _poldvsr_ ) CYG_MACRO_START  \    HAL_VSR_SET( _vector_, _vector_ == CYGNUM_HAL_VECTOR_INTERRUPT          \                              ? (CYG_ADDRESS)__default_interrupt_vsr        \                              : (CYG_ADDRESS)__default_exception_vsr,       \                 _poldvsr_ );                                               \CYG_MACRO_END//--------------------------------------------------------------------------// Interrupt controller access#if defined(CYG_HAL_MIPS_TX3904) || defined(CYG_HAL_MIPS_SIM)#define CYG_HAL_MIPS_TX3904_ILR0     0xFFFFC010#define CYG_HAL_MIPS_TX3904_CConR    0xFFFFE000// Array which stores the configured priority levels for the configured// interrupts.externC volatile CYG_BYTE hal_interrupt_level[CYGNUM_HAL_ISR_COUNT];#define HAL_INTERRUPT_MASK( _vector_ )                       \{                                                            \    HAL_IO_REGISTER _reg_ = CYG_HAL_MIPS_TX3904_ILR0;        \    CYG_WORD32 _ilr_;                                        \    _reg_ += (_vector_)&0xC;                                 \    HAL_READ_UINT32( _reg_, _ilr_ );                         \    _ilr_ &= ~(7 << (((_vector_)&0x3)<<3));                  \    HAL_WRITE_UINT32( _reg_, _ilr_ );                        \}#define HAL_INTERRUPT_UNMASK( _vector_ )                                \{                                                                       \    HAL_IO_REGISTER _reg_ = CYG_HAL_MIPS_TX3904_ILR0;                   \    CYG_WORD32 _ilr_;                                                   \    _reg_ += (_vector_)&0xC;                                            \    HAL_READ_UINT32( _reg_, _ilr_ );                                    \    _ilr_ |= hal_interrupt_level[_vector_] << (((_vector_)&0x3)<<3);    \    HAL_WRITE_UINT32( _reg_, _ilr_ );                                   \}#define HAL_INTERRUPT_ACKNOWLEDGE( _vector_ )                           \{                                                                       \    if( _vector_ <= CYGNUM_HAL_INTERRUPT_7 ||                           \        _vector_ == CYGNUM_HAL_INTERRUPT_0 )                            \    {                                                                   \        cyg_uint32 _val_ = _vector_ + 1;                                \        if( _val_ == CYGNUM_HAL_INTERRUPT_0 + 1 ) _val_ = 0;            \        HAL_WRITE_UINT8( CYG_HAL_MIPS_TX3904_CConR+1, _val_);           \    }                                                                   \}#define HAL_INTERRUPT_CONFIGURE( _vector_, _level_, _up_ )              \{                                                                       \    if( _vector_ <= CYGNUM_HAL_INTERRUPT_7 ||                           \        _vector_ == CYGNUM_HAL_INTERRUPT_0 )                            \    {                                                                   \        cyg_uint32 _val_ = 0;                                           \        if( _up_ ) _val_ |= 1;                                          \        if( !(_level_) ) _val_ |= 2;                                    \        HAL_WRITE_UINT16( CYG_HAL_MIPS_TX3904_CConR+2, _val_ );         \    }                                                                   \}#define HAL_INTERRUPT_SET_LEVEL( _vector_, _level_ )    \{                                                       \    HAL_IO_REGISTER _reg_ = CYG_HAL_MIPS_TX3904_ILR0;   \    CYG_WORD32 _ilr_;                                   \    _reg_ += (_vector_)&0xC;                            \    HAL_READ_UINT32( _reg_, _ilr_ );                    \    _ilr_ |= (_level_) << (((_vector_)&0x3)<<3);        \    HAL_WRITE_UINT32( _reg_, _ilr_ );                   \    hal_interrupt_level[_vector_] = _level_;            \}#else#error Unspecified platform for MIPS#endif//--------------------------------------------------------------------------// Clock control#if defined(CYG_HAL_MIPS_TX3904) || defined(CYG_HAL_MIPS_SIM)#define CYG_HAL_MIPS_TX3904_TIMER_BASE 0xFFFFF000#define CYG_HAL_MIPS_TX3904_TIMER_CR  (CYG_HAL_MIPS_TX3904_TIMER_BASE + 0x00)#define CYG_HAL_MIPS_TX3904_TIMER_SR  (CYG_HAL_MIPS_TX3904_TIMER_BASE + 0x04)#define CYG_HAL_MIPS_TX3904_TIMER_CPR (CYG_HAL_MIPS_TX3904_TIMER_BASE + 0x08)#define CYG_HAL_MIPS_TX3904_TIMER_IMR (CYG_HAL_MIPS_TX3904_TIMER_BASE + 0x10)#define CYG_HAL_MIPS_TX3904_TIMER_DR  (CYG_HAL_MIPS_TX3904_TIMER_BASE + 0x20)#define CYG_HAL_MIPS_TX3904_TIMER_RR  (CYG_HAL_MIPS_TX3904_TIMER_BASE + 0xF0)#define HAL_CLOCK_INITIALIZE( _period_ )                             \{                                                                    \    HAL_WRITE_UINT32( CYG_HAL_MIPS_TX3904_TIMER_DR, 0x00000003 );    \    HAL_WRITE_UINT32( CYG_HAL_MIPS_TX3904_TIMER_CPR, _period_ );     \    HAL_WRITE_UINT32( CYG_HAL_MIPS_TX3904_TIMER_SR, 0x00000000 );    \    HAL_WRITE_UINT32( CYG_HAL_MIPS_TX3904_TIMER_IMR, 0x00008001 );   \    HAL_WRITE_UINT32( CYG_HAL_MIPS_TX3904_TIMER_CR, 0x000000C0 );    \}#define HAL_CLOCK_RESET( _vector_, _period_ )                        \{                                                                    \    HAL_WRITE_UINT32( CYG_HAL_MIPS_TX3904_TIMER_SR, 0x00000000 );    \}#if defined(CYGHWR_HAL_MIPS_TX3904_TRR_REQUIRES_SYNC) && \    !defined(CYG_HAL_MIPS_SIM)// We need to sync and check the coprocessor 0 condition - this indicates// whether data is present in the write buffer. We need to wait until// that data to be written is flushed out. This works around a tx39 bug.// gcc will insert a NOP after the asm insns.# define HAL_CLOCK_READ( _pvalue_ )                                  \CYG_MACRO_START                                                      \    asm volatile (                                                   \        "sync; nop; 1: ; bc0f 1b"                                    \        :                                                            \        :                                                            \        : "$0"                                                       \        );                                                           \    HAL_READ_UINT32( CYG_HAL_MIPS_TX3904_TIMER_RR, *(_pvalue_) );    \CYG_MACRO_END#else# define HAL_CLOCK_READ( _pvalue_ )                                  \CYG_MACRO_START                                                      \    HAL_READ_UINT32( CYG_HAL_MIPS_TX3904_TIMER_RR, *(_pvalue_) );    \CYG_MACRO_END#endif#ifdef CYGVAR_KERNEL_COUNTERS_CLOCK_LATENCY#define HAL_CLOCK_LATENCY( _pvalue_ ) HAL_CLOCK_READ(_pvalue_)#endif#else#error Unspecified platform for MIPS#endif//--------------------------------------------------------------------------// Timeout exception support. This is only enabled on the real TX39 hardware.#if defined(CYG_HAL_MIPS_TX3904)#define HAL_TX39_DEBUG_TOE_ENABLE()                     \{                                                       \    HAL_IO_REGISTER _reg_ = CYG_HAL_MIPS_TX3904_CConR;  \    CYG_WORD32 _cconr_;                                 \    HAL_READ_UINT32( _reg_, _cconr_);                   \    _cconr_ |= 0x04000000;                              \    HAL_WRITE_UINT32( _reg_, _cconr_);                  \}#define HAL_TX39_DEBUG_TOE_DISABLE()                    \{                                                       \    HAL_IO_REGISTER _reg_ = CYG_HAL_MIPS_TX3904_CConR;  \    CYG_WORD32 _cconr_;                                 \    HAL_READ_UINT32( _reg_, _cconr_);                   \    _cconr_ &= 0xFBFFFFFF;                              \    HAL_WRITE_UINT32( _reg_, _cconr_);                  \}#else#define HAL_TX39_DEBUG_TOE_ENABLE()#define HAL_TX39_DEBUG_TOE_DISABLE()#endif//--------------------------------------------------------------------------#endif // ifndef CYGONCE_HAL_HAL_INTR_H// End of hal_intr.h

⌨️ 快捷键说明

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