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

📄 hal_intr.h

📁 ecos为实时嵌入式操作系统
💻 H
字号:
#ifndef CYGONCE_HAL_INTR_H#define CYGONCE_HAL_INTR_H//==========================================================================////      hal_intr.h////      HAL Interrupt and clock support////==========================================================================//####COPYRIGHTBEGIN####//// -------------------------------------------// The contents of this file are subject to the Cygnus eCos Public License// Version 1.0 (the "License"); you may not use this file except in// compliance with the License.  You may obtain a copy of the License at// http://sourceware.cygnus.com/ecos// // Software distributed under the License is distributed on an "AS IS"// basis, WITHOUT WARRANTY OF ANY KIND, either express or implied.  See the// License for the specific language governing rights and limitations under// the License.// // The Original Code is eCos - Embedded Cygnus Operating System, released// September 30, 1998.// // The Initial Developer of the Original Code is Cygnus.  Portions created// by Cygnus are Copyright (C) 1998,1999 Cygnus Solutions.  All Rights Reserved.// -------------------------------------------////####COPYRIGHTEND####//==========================================================================//#####DESCRIPTIONBEGIN####//// Author(s):    nickg, gthomas// Contributors: nickg, gthomas,//               jlarmour// Date:         1999-02-20// Purpose:      Define Interrupt support// Description:  The macros defined here provide the HAL APIs for handling//               interrupts and the clock.//              // Usage:        #include <cyg/hal/hal_intr.h>//               ...//              ////####DESCRIPTIONEND####////==========================================================================#include <pkgconf/hal.h>#include <cyg/infra/cyg_type.h>#include <cyg/hal/hal_platform_ints.h>//--------------------------------------------------------------------------// ARM exception vectors.// These vectors correspond to VSRs. These values are the ones to use for// HAL_VSR_GET/SET#define CYGNUM_HAL_VECTOR_RESERVED_0           0#define CYGNUM_HAL_VECTOR_RESET                1#define CYGNUM_HAL_VECTOR_UNDEF_INSTRUCTION    2#define CYGNUM_HAL_VECTOR_SOFTWARE_INTERRUPT   3#define CYGNUM_HAL_VECTOR_ABORT_PREFETCH       4#define CYGNUM_HAL_VECTOR_ABORT_DATA           5#define CYGNUM_HAL_VECTOR_reserved             6#define CYGNUM_HAL_VECTOR_IRQ                  7#define CYGNUM_HAL_VECTOR_FIQ                  8#define CYGNUM_HAL_VSR_MIN                     0#define CYGNUM_HAL_VSR_MAX                     8#define CYGNUM_HAL_VSR_COUNT                   9// Exception vectors. These are the values used when passed out to an// external exception handler using cyg_hal_deliver_exception()#define CYGNUM_HAL_EXCEPTION_ILLEGAL_INSTRUCTION \          CYGNUM_HAL_VECTOR_UNDEF_INSTRUCTION#define CYGNUM_HAL_EXCEPTION_INTERRUPT \          CYGNUM_HAL_VECTOR_SOFTWARE_INTERRUPT#define CYGNUM_HAL_EXCEPTION_CODE_ACCESS    CYGNUM_HAL_VECTOR_ABORT_PREFETCH#define CYGNUM_HAL_EXCEPTION_DATA_ACCESS    CYGNUM_HAL_VECTOR_ABORT_DATA#define CYGNUM_HAL_EXCEPTION_FIQ            CYGNUM_HAL_VECTOR_FIQ#define CYGNUM_HAL_EXCEPTION_MIN     CYGNUM_HAL_EXCEPTION_ILLEGAL_INSTRUCTION#define CYGNUM_HAL_EXCEPTION_MAX     CYGNUM_HAL_EXCEPTION_FIQ#define CYGNUM_HAL_EXCEPTION_COUNT   (CYGNUM_HAL_EXCEPTION_MAX - \                                      CYGNUM_HAL_EXCEPTION_MIN + 1)//--------------------------------------------------------------------------// Static data used by HAL// ISR tablesexternC volatile CYG_ADDRESS    hal_interrupt_handlers[CYGNUM_HAL_ISR_COUNT];externC volatile CYG_ADDRWORD   hal_interrupt_data[CYGNUM_HAL_ISR_COUNT];externC volatile CYG_ADDRESS    hal_interrupt_objects[CYGNUM_HAL_ISR_COUNT];// VSR tableexternC volatile CYG_ADDRESS    hal_vsr_table[CYGNUM_HAL_VSR_COUNT];//--------------------------------------------------------------------------// Default ISRexternC cyg_uint32 hal_default_isr(CYG_ADDRWORD vector, CYG_ADDRWORD data);//--------------------------------------------------------------------------// Interrupt state storagetypedef cyg_uint32 CYG_INTERRUPT_STATE;//--------------------------------------------------------------------------// Interrupt control macros// Note: This disables both FIQ and IRQ interrupts!#define HAL_DISABLE_INTERRUPTS(_old_)           \    asm volatile (                              \        "mrs %0,cpsr;"                          \        "mrs r4,cpsr;"                          \        "orr r4,r4,#0xC0;"                      \        "msr cpsr,r4"                           \        : "=r"(_old_)                           \        :                                       \        : "r4"                                  \        );#define HAL_ENABLE_INTERRUPTS()                 \    asm volatile (                              \        "mrs r3,cpsr;"                          \        "bic r3,r3,#0xC0;"                      \        "msr cpsr,r3"                           \        :                                       \        :                                       \        : "r3"                                  \        );#define HAL_RESTORE_INTERRUPTS(_old_)           \    asm volatile (                              \        "mrs r3,cpsr;"                          \        "and r4,%0,#0xC0;"                      \        "bic r3,r3,#0xC0;"                      \        "orr r3,r3,r4;"                         \        "msr cpsr,r3"                           \        :                                       \        : "r"(_old_)                            \        : "r3", "r4"                            \        );#define HAL_QUERY_INTERRUPTS(_old_)             \    asm volatile (                              \        "mrs r4,cpsr;"                          \        "and r4,r4,#0xC0;"                      \        "eor %0,r4,#0xC0;"                      \        : "=r"(_old_)                           \        :                                       \        : "r4"                                  \        );//--------------------------------------------------------------------------// Vector translation.#ifndef HAL_TRANSLATE_VECTOR#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_MACRO_START                                                        \    if( hal_interrupt_handlers[_vector_] == (CYG_ADDRESS)hal_default_isr ) \    {                                                                      \        hal_interrupt_handlers[_vector_] = (CYG_ADDRESS)_isr_;             \        hal_interrupt_data[_vector_] = (CYG_ADDRWORD) _data_;              \        hal_interrupt_objects[_vector_] = (CYG_ADDRESS)_object_;           \    }                                                                      \    CYG_MACRO_END#define HAL_INTERRUPT_DETACH( _vector_, _isr_ )                            \    CYG_MACRO_START                                                        \    if( hal_interrupt_handlers[_vector_] == (CYG_ADDRESS)_isr_ )           \    {                                                                      \        hal_interrupt_handlers[_vector_] = (CYG_ADDRESS)hal_default_isr;   \        hal_interrupt_data[_vector_] = 0;                                  \        hal_interrupt_objects[_vector_] = 0;                               \    }                                                                      \    CYG_MACRO_END#define HAL_VSR_GET( _vector_, _pvsr_ )                         \    *(CYG_ADDRESS *)(_pvsr_) = hal_vsr_table[_vector_];    #define HAL_VSR_SET( _vector_, _vsr_, _poldvsr_ )               \    CYG_MACRO_START                                             \    if( _poldvsr_ != NULL )                                     \        *(CYG_ADDRESS *)_poldvsr_ = hal_vsr_table[_vector_];    \    hal_vsr_table[_vector_] = (CYG_ADDRESS)_vsr_;               \    CYG_MACRO_END//--------------------------------------------------------------------------// Interrupt controller accessexternC void hal_interrupt_mask(int);externC void hal_interrupt_unmask(int);externC void hal_interrupt_acknowledge(int);externC void hal_interrupt_configure(int, int, int);externC void hal_interrupt_set_level(int, int);#define HAL_INTERRUPT_MASK( _vector_ )                     \    hal_interrupt_mask( _vector_ ) #define HAL_INTERRUPT_UNMASK( _vector_ )                   \    hal_interrupt_unmask( _vector_ )#define HAL_INTERRUPT_ACKNOWLEDGE( _vector_ )              \    hal_interrupt_acknowledge( _vector_ )#define HAL_INTERRUPT_CONFIGURE( _vector_, _level_, _up_ ) \    hal_interrupt_configure( _vector_, _level_, _up_ )#define HAL_INTERRUPT_SET_LEVEL( _vector_, _level_ )       \    hal_interrupt_set_level( _vector_, _level_ )//--------------------------------------------------------------------------// Clock controlexternC void hal_clock_initialize(cyg_uint32);externC void hal_clock_read(cyg_uint32 *);externC void hal_clock_reset(cyg_uint32, cyg_uint32);#define HAL_CLOCK_INITIALIZE( _period_ )   hal_clock_initialize( _period_ )#define HAL_CLOCK_RESET( _vec_, _period_ ) hal_clock_reset( _vec_, _period_ )#define HAL_CLOCK_READ( _pvalue_ )         hal_clock_read( _pvalue_ )#ifdef CYGVAR_KERNEL_COUNTERS_CLOCK_LATENCY#define HAL_CLOCK_LATENCY( _pvalue_ )      HAL_CLOCK_READ( (cyg_uint32 *)_pvalue_ )#endif//--------------------------------------------------------------------------#endif // ifndef CYGONCE_HAL_INTR_H// End of hal_intr.h

⌨️ 快捷键说明

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