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

📄 hal_intr.h

📁 eCos操作系统源码
💻 H
字号:
#ifndef CYGONCE_HAL_HAL_INTR_H#define CYGONCE_HAL_HAL_INTR_H//==========================================================================////      hal_intr.h////      m68k Interrupt and clock support////==========================================================================//####ECOSGPLCOPYRIGHTBEGIN####// -------------------------------------------// This file is part of eCos, the Embedded Configurable Operating System.// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.//// eCos is free software; you can redistribute it and/or modify it under// the terms of the GNU General Public License as published by the Free// Software Foundation; either version 2 or (at your option) any later version.//// eCos is distributed in the hope that it will be useful, but WITHOUT ANY// WARRANTY; without even the implied warranty of MERCHANTABILITY or// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License// for more details.//// You should have received a copy of the GNU General Public License along// with eCos; if not, write to the Free Software Foundation, Inc.,// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.//// As a special exception, if other files instantiate templates or use macros// or inline functions from this file, or you compile this file and link it// with other works to produce a work based on this file, this file does not// by itself cause the resulting work to be covered by the GNU General Public// License. However the source code for this file must still be made available// in accordance with section (3) of the GNU General Public License.//// This exception does not invalidate any other reasons why a work based on// this file might be covered by the GNU General Public License.//// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.// at http://sources.redhat.com/ecos/ecos-license/// -------------------------------------------//####ECOSGPLCOPYRIGHTEND####//==========================================================================#include <pkgconf/hal.h>#include <cyg/infra/cyg_type.h>#include <cyg/hal/hal_arch.h>#include <cyg/hal/var_intr.h>//--------------------------------------------------------------------------// m68k exception vectors. These correspond to VSRs and are the values// to use for HAL_VSR_GET/SET#define CYGNUM_HAL_VECTOR_SSP               0#define CYGNUM_HAL_VECTOR_RESET             1#define CYGNUM_HAL_VECTOR_BUSERR            2#define CYGNUM_HAL_VECTOR_ADDERR            3#define CYGNUM_HAL_VECTOR_ILLINST           4#define CYGNUM_HAL_VECTOR_ZERODIV           5#define CYGNUM_HAL_VECTOR_CHKINST           6#define CYGNUM_HAL_VECTOR_TRAPVINST         7#define CYGNUM_HAL_VECTOR_PRIVVIOLATION     8#define CYGNUM_HAL_VECTOR_TRACE             9#define CYGNUM_HAL_VECTOR_L1010             10#define CYGNUM_HAL_VECTOR_L1111             11#define CYGNUM_HAL_VECTOR_UNINITINT         15#define CYGNUM_HAL_VECTOR_SPURINT           24#define CYGNUM_HAL_VECTOR_AUTOVEC1          25#define CYGNUM_HAL_VECTOR_AUTOVEC2          26#define CYGNUM_HAL_VECTOR_AUTOVEC3          27#define CYGNUM_HAL_VECTOR_AUTOVEC4          28#define CYGNUM_HAL_VECTOR_AUTOVEC5          29#define CYGNUM_HAL_VECTOR_AUTOVEC6          30#define CYGNUM_HAL_VECTOR_AUTOVEC7          31#define CYGNUM_HAL_VECTOR_NMI               CYGNUM_HAL_VECTOR_AUTOVEC7#define CYGNUM_HAL_VECTOR_TRAPFIRST         32#define CYGNUM_HAL_VECTOR_NUMTRAPS          16#define CYGNUM_HAL_VECTOR_TRAPLAST          (CYGNUM_HAL_VECTOR_TRAPFIRST+CYGNUM_HAL_VECTOR_NUMTRAPS-1)#define CYGNUM_HAL_VECTOR_INTRFIRST         64#define CYGNUM_HAL_VECTOR_NUMINTRS          192#define CYGNUM_HAL_VECTOR_INTRLAST          (CYGNUM_HAL_VECTOR_INTRFIRST+CYGNUM_HAL_VECTOR_NUMINTRS-1)#define CYGNUM_HAL_VSR_MIN                  CYGNUM_HAL_VECTOR_SSP#define CYGNUM_HAL_VSR_MAX                  CYGNUM_HAL_VECTOR_INTRLAST#define CYGNUM_HAL_VSR_COUNT                (CYGNUM_HAL_VSR_MAX+1)//--------------------------------------------------------------------------// Interrupt vectors.#ifndef CYGNUM_HAL_ISR_MAX#define CYGNUM_HAL_ISR_MIN                   0#define CYGNUM_HAL_ISR_MAX                   255#define CYGNUM_HAL_ISR_COUNT                 (7+CYGNUM_HAL_VECTOR_NUMINTRS)#endif /* CYGNUM_HAL_ISR_MAX */#ifndef CYGNUM_HAL_EXCEPTION_COUNT#define CYGNUM_HAL_EXCEPTION_MIN             CYGNUM_HAL_VECTOR_BUSERR#define CYGNUM_HAL_EXCEPTION_MAX             CYGNUM_HAL_VECTOR_SPURINT#define CYGNUM_HAL_EXCEPTION_COUNT           ((CYGNUM_HAL_EXCEPTION_MAX-CYGNUM_HAL_EXCEPTION_MIN)+1)#endif /* CYGNUM_HAL_EXCEPTION_COUNT *///--------------------------------------------------------------------------// Static data used by HAL// ISR tablesexternC volatile CYG_ADDRESS  cyg_hal_interrupt_handlers[CYGNUM_HAL_ISR_COUNT];externC volatile CYG_ADDRWORD cyg_hal_interrupt_data[CYGNUM_HAL_ISR_COUNT];externC volatile CYG_ADDRESS  cyg_hal_interrupt_objects[CYGNUM_HAL_ISR_COUNT];// VSR tableexternC volatile CYG_ADDRESS  cyg_hal_vsr_table[CYGNUM_HAL_VSR_COUNT];//---------------------------------------------------------------------------// Translate a vector number into an ISR table index.#define HAL_TRANSLATE_VECTOR(_vector_,_index_)                              \    CYG_MACRO_START                                                         \    switch ((_vector_))                                                     \    {                                                                       \    case CYGNUM_HAL_VECTOR_AUTOVEC1 ... CYGNUM_HAL_VECTOR_AUTOVEC7:         \        (_index_) = ((_vector_) - CYGNUM_HAL_VECTOR_AUTOVEC1);              \        break;                                                              \    case CYGNUM_HAL_VECTOR_INTRFIRST ... CYGNUM_HAL_VECTOR_INTRLAST:        \        (_index_) = ((_vector_)                                             \                     - CYGNUM_HAL_VECTOR_INTRFIRST                          \                     + (CYGNUM_HAL_VECTOR_AUTOVEC7                          \                        - CYGNUM_HAL_VECTOR_AUTOVEC1                        \                        + 1));                                              \        break;                                                              \    default:                                                                \        CYG_FAIL("Unknown Interrupt!!!");                                   \        (_index_) = (typeof(_index_))-1;                                                     \    }                                                                       \    CYG_MACRO_END//--------------------------------------------------------------------------// Interrupt state storagetypedef cyg_uint16 CYG_INTERRUPT_STATE;//---------------------------------------------------------------------------// Interrupt and VSR attachment macrosexternC cyg_uint32 hal_default_isr(CYG_ADDRWORD vector, CYG_ADDRWORD data);externC void hal_default_exception_handler(CYG_WORD vector,                                           HAL_SavedRegisters *regs);#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)&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)&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_INTERRUPT_MASK(_vector_); \    HAL_TRANSLATE_VECTOR((_vector_), _index_); \    if (cyg_hal_interrupt_handlers[_index_] \        == (CYG_ADDRESS)(_isr_)) \    { \        cyg_hal_interrupt_handlers[_index_] = \            (CYG_ADDRESS)&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 control macros//      The following interrupt control  macros are  the default  for the  68k// architecture.   Some  architectures  will  override  these  definitions  by// defining  them  in  their  var_intr.h  file.   Some  architectures  support// instructions  like  andi.w  #xxxx,%sr   but  others   (Coldfire)  do   not.// Architectures that support  these other  instructions will  want to  define// their own macros.#define HAL_M68K_SET_SR(__newsr__)                                          \    CYG_MACRO_START                                                         \    asm volatile ("move.w   %0,%%sr\n"                                      \                  :                                                         \                  : "g" ((CYG_INTERRUPT_STATE)(__newsr__)));                \    CYG_MACRO_END#ifndef HAL_ENABLE_INTERRUPTS#define HAL_ENABLE_INTERRUPTS()                                             \    CYG_MACRO_START                                                         \    CYG_INTERRUPT_STATE _msk_;                                              \    HAL_QUERY_INTERRUPTS(_msk_);                                            \    HAL_M68K_SET_SR((_msk_ & (CYG_INTERRUPT_STATE)0xf8ff));                 \    CYG_MACRO_END#endif // HAL_ENABLE_INTERRUPTS#ifndef HAL_DISABLE_INTERRUPTS#define HAL_DISABLE_INTERRUPTS(_old_)                                       \    CYG_MACRO_START                                                         \    HAL_QUERY_INTERRUPTS(_old_);                                            \    HAL_M68K_SET_SR((_old_ | (CYG_INTERRUPT_STATE)0x0700));                 \    CYG_MACRO_END#endif //HAL_DISABLE_INTERRUPTS#define HAL_RESTORE_INTERRUPTS(_prev_)                                      \    CYG_MACRO_START                                                         \    CYG_INTERRUPT_STATE _msk_;                                              \    HAL_QUERY_INTERRUPTS(_msk_);                                            \    _msk_ &= (CYG_INTERRUPT_STATE)0xf8ff;                                   \    _msk_ |= (((CYG_INTERRUPT_STATE)(_prev_))                               \              & (CYG_INTERRUPT_STATE)0x0700);                               \    asm volatile ("move.w   %0,%%sr\n"                                      \                  :                                                         \                  : "g" (_msk_));                                           \    CYG_MACRO_END// Use the extra assignment to avoid warnings.// The compiler should optimize it out.#define HAL_QUERY_INTERRUPTS(__oldmask__)                                   \    CYG_MACRO_START                                                         \    CYG_INTERRUPT_STATE _omsk_ = (CYG_INTERRUPT_STATE)(__oldmask__);        \    asm volatile ("move.w   %%sr,%0\n"                                      \                  : "=g" (_omsk_)                                           \                  : );                                                      \    (__oldmask__) = (typeof(__oldmask__))_omsk_;                            \    CYG_MACRO_END//---------------------------------------------------------------------------#endif // ifndef CYGONCE_HAL_HAL_INTR_H

⌨️ 快捷键说明

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