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

📄 hal_arch.h

📁 ecos移植到R8H系列的源码。源码包来自http://www.cetoni.de/develop/develop_ecosh8s_en.html
💻 H
📖 第 1 页 / 共 2 页
字号:
#define HAL_BREAKPOINT(_label_)                                \
asm volatile (" .globl  " __HAL_BREAKPOINT(_label_) "\n"       \
              __HAL_BREAKPOINT(_label_) ":\n\t"                \
              "trapa #3\n"                                     \
              )
#define HAL_BREAKINST           0x5730
#define HAL_BREAKINST_SIZE      2


//===========================================================================
//                              GDB SUPPORT
// DESCRIPTION:
//     The following macros provide support for interfacing GDB to the HAL.
//===========================================================================


//===========================================================================
//                     HAL_THREAD_GET_SAVED_REGISTERS
// DESCRIPTION:
//     Extracts a pointer to a HAL_SavedRegisters structure from a stack
//     pointer value. The stack pointer passed in should be the value saved 
//     by the thread context macros. The macro will assign a pointer to the
//     HAL_SavedRegisters structure to the variable passed as the second 
//     argument.
//
// PARAMETERS:
//     '_sp_'    Pointer to top of saved thred context
//     '_regs_'  Pointer to HAL_SavedRegisters structure
//===========================================================================
#define HAL_THREAD_GET_SAVED_REGISTERS(_sp_, _regs_)                     \
        (_regs_) = (HAL_SavedRegisters *)(_sp_)


//===========================================================================
//                     SET AND GET EXTRA REGISTERS FOR GDB
// DESCRIPTION:
//     Used for MAC register of H8S
//===========================================================================
#if defined(CYGHWR_HAL_H8S_USE_MAC)
//
// if we use MAC register then we also have to store and restore it for
// GDB - we will do this here
//
#ifndef HAL_GET_GDB_EXTRA_REGISTERS
    #define HAL_GET_GDB_EXTRA_REGISTERS( _regval_, _regs_ )  \
    {                                                        \
        _regval_[TICK]        = 0;                           \
        _regval_[INST]        = 0;                           \
        _regval_[MACH]        = (_regs_)->mach;              \
        _regval_[MACL]        = (_regs_)->macl;              \
    }
#endif // HAL_GET_GDB_EXTRA_REGISTERS

#ifndef HAL_SET_GDB_EXTRA_REGISTERS
    #define HAL_SET_GDB_EXTRA_REGISTERS( _regs_, _regval_ ) \
    {                                                       \
        (_regs_)->mach        = _regval_[MACH];             \
        (_regs_)->macl        = _regval_[MACL];             \
    }
#endif // HAL_SET_GDB_EXTRA_REGISTERS
#else // !defined(CYGHWR_HAL_H8S_USE_MAC)
//
// if we do not use the MAC register then we also do not have to make it
// available for GDB - therefore we leave the following two macros empty
//
#ifndef HAL_GET_GDB_EXTRA_REGISTERS
    #define HAL_GET_GDB_EXTRA_REGISTERS( _regval_, _regs_ )
#endif 

#ifndef HAL_SET_GDB_EXTRA_REGISTERS
    #define HAL_SET_GDB_EXTRA_REGISTERS( _regs_, _regval_ )
#endif 
#endif // !defined(CYGHWR_HAL_H8S_USE_MAC)


//===========================================================================
//                    TRANSLATE REGISTERS INTO GDB FORMAT
// DESCRIPTION:
//     Translates a register state as saved by the HAL and into a register 
//     dump in the format expected by GDB. 
//
// PARAMETERS:
//     '_aregval_'    pointer to a HAL_SavedRegisters structure
//     '_regs_'       pointer to the memory to contain the GDB register dump
//===========================================================================
#define HAL_GET_GDB_REGISTERS(_aregval_ , _regs_)                     \
{                                                                     \
    target_register_t *_regval_ = (target_register_t *)(_aregval_);   \
                                                                      \
    _regval_[ER0]         = (_regs_)->er0;                            \
    _regval_[ER1]         = (_regs_)->er1;                            \
    _regval_[ER2]         = (_regs_)->er2;                            \
    _regval_[ER3]         = (_regs_)->er3;                            \
    _regval_[ER4]         = (_regs_)->er4;                            \
    _regval_[ER5]         = (_regs_)->er5;                            \
    _regval_[ER6]         = (_regs_)->er6;                            \
                                                                      \
    _regval_[SP]          = (_regs_)->sp;                             \
    _regval_[CCR]         = (_regs_)->ccr;                            \
    _regval_[PC]          = (_regs_)->pc;                             \
    _regval_[CYCL]        = 0;                                        \
    _regval_[EXR]         = (_regs_)->exr;                            \
                                                                      \
    HAL_GET_GDB_EXTRA_REGISTERS(_regval_, _regs_);                    \
}


//===========================================================================
//                    TRANSLATE REGISTERS INTO GDB FORMAT
// DESCRIPTION:
//     translates a GDB format register dump into a the format expected by 
//     the HAL. 
//
// PARAMETERS:
//     '_regs_'       pointer to the memory containing the GDB register dump
//     '_aregval_'    pointer to a HAL_SavedRegisters structure
//===========================================================================
#define HAL_SET_GDB_REGISTERS(_regs_ , _aregval_)                       \
{                                                                       \
    target_register_t *_regval_ = (target_register_t *)(_aregval_);     \
                                                                        \
    (_regs_)->er0            = _regval_[ER0];                           \
    (_regs_)->er1            = _regval_[ER1];                           \
    (_regs_)->er2            = _regval_[ER2];                           \
    (_regs_)->er3            = _regval_[ER3];                           \
    (_regs_)->er4            = _regval_[ER4];                           \
    (_regs_)->er5            = _regval_[ER5];                           \
    (_regs_)->er6            = _regval_[ER6];                           \
                                                                        \
    (_regs_)->sp             = _regval_[SP];                            \
    (_regs_)->ccr            = _regval_[CCR];                           \
    (_regs_)->pc             = _regval_[PC];                            \
    (_regs_)->exr            = _regval_[EXR];                           \
                                                                        \
                                                                        \
     HAL_SET_GDB_EXTRA_REGISTERS( _regs_, _regval_ );                   \
}


//===========================================================================
//                    TRANSLATE REGISTERS INTO GDB FORMAT
// DESCRIPTION:
//     Get PC from HAL_SavedRegisters structure
//
// PARAMETERS:
//     '_regs_'   Pointer to HAL_SavedRegisters structure
//     '_val_'    Stores PC value
//===========================================================================
#ifndef CYGARC_HAL_GET_PC_REG
   #define CYGARC_HAL_GET_PC_REG(_regs_, _val_) (_val_) = (_regs_)->pc
#endif


//===========================================================================
//                    SETJMP AND LONGJMP SUPPORT
// DESCRIPTION:
//     These functions provide support for the C setjmp() and longjmp()
//     functions. Refer to the C library for further information.
//
// NOTES:
//     These definitions are repeated in context.S. If changes are required
//     remember to update both sets
//===========================================================================
#define CYGARC_JMP_BUF_SP        0
#define CYGARC_JMP_BUF_ER3       1
#define CYGARC_JMP_BUF_ER4       2
#define CYGARC_JMP_BUF_ER5       3
#define CYGARC_JMP_BUF_ER6       4
#define CYGARC_JMP_BUF_PC        5

#define CYGARC_JMP_BUF_SIZE      6

///
/// Buffer for hal_setjmp(hal_jmp_buf) / hal_longjmp(hal_jmp_buf, int) call.
/// This buffer stores the register content during the longjump calls
///
typedef cyg_uint32 hal_jmp_buf[CYGARC_JMP_BUF_SIZE];


//---------------------------------------------------------------------------
///
///  Sets jump label for later longjmp call.
///  setjmp / lonjmp enables non local long jumps.
///
/// \param  env   Buffer stores current registers for later restore
///
/// \retval zero     When this function is called directly
/// \retval nonzero  When returning from longjmp call
///
externC int hal_setjmp(hal_jmp_buf env);


//---------------------------------------------------------------------------
///
///  longjmp call for non local long jumps.
///  Forces a return to previously set jump label by setjmp call.
///
/// \param  val   Value that will be returned by setjmp when returning.
/// \param  env   Buffer containig previously stored register set.
///
externC void hal_longjmp(hal_jmp_buf env, int val);


//===========================================================================
//                    SETJMP AND LONGJMP SUPPORT
// DESCRIPTION:
//     Idle thread code. This macro is called in the idle thread loop, and 
//     gives the HAL the chance to insert code. Typical idle thread 
//     behaviour might be to halt the processor.
//===========================================================================
externC void hal_idle_thread_action(cyg_uint32 loop_count);
#define HAL_IDLE_THREAD_ACTION(_count_) hal_idle_thread_action(_count_)


//===========================================================================
//                             STACK SIZES
// DESCRIPTION:
//     Minimal and sensible stack sizes: the intention is that applications
//     will use these to provide a stack size in the first instance prior to
//     proper analysis.  Idle thread stack should be this big.
//
//       THESE ARE NOT INTENDED TO BE MICROMETRICALLY ACCURATE FIGURES.
//               THEY ARE HOWEVER ENOUGH TO START PROGRAMMING.
//     YOU MUST MAKE YOUR STACKS LARGER IF YOU HAVE LARGE "AUTO" VARIABLES!
//
//     We define quite large stack needs for SPARClite, for it requires 576
//     bytes (144 words) to process an interrupt and thread-switch, and
//     momentarily, but needed in case of recursive interrupts, it needs 208
//     words - if a sequence of saves to push out other regsets is interrupted.
//
//     This is not a config option because it should not be adjusted except
//     under "enough rope" sort of disclaimers.
//===========================================================================
//
// Worst case stack frame size: return link + 4 args + 4 pushed registers.
//
#define CYGNUM_HAL_STACK_FRAME_SIZE (40)

//
// Stack needed for a context switch:
//
#define CYGNUM_HAL_STACK_CONTEXT_SIZE (60)

//
// Interrupt + call to ISR, interrupt_end() and the DSR
//
#define CYGNUM_HAL_STACK_INTERRUPT_SIZE (128)

#ifdef CYGIMP_HAL_COMMON_INTERRUPTS_USE_INTERRUPT_STACK
//
// An interrupt stack which is large enough for all possible interrupt
// conditions (and only used for that purpose) exists.  "User" stacks
// can be much smaller
//
#define CYGNUM_HAL_STACK_SIZE_MINIMUM (CYGNUM_HAL_STACK_CONTEXT_SIZE+      \
                                       CYGNUM_HAL_STACK_INTERRUPT_SIZE*2+  \
                                       CYGNUM_HAL_STACK_FRAME_SIZE*16)
#define CYGNUM_HAL_STACK_SIZE_TYPICAL (2048)

#else // CYGIMP_HAL_COMMON_INTERRUPTS_USE_INTERRUPT_STACK
//
// No separate interrupt stack exists.  Make sure all threads contain
// a stack sufficiently large.
//
#define CYGNUM_HAL_STACK_SIZE_MINIMUM (4096)
#define CYGNUM_HAL_STACK_SIZE_TYPICAL (4096)
#endif


//===========================================================================
//                     GLOBAL POINTER SAVE RESTORE MACROS
// DESCRIPTION:
//     Not required in this architecture
//===========================================================================
#define CYGARC_HAL_SAVE_GP()
#define CYGARC_HAL_RESTORE_GP()

//--------------------------------------------------------------------------
#endif // CYGONCE_HAL_HAL_ARCH_H
// EOF hal_arch.h

⌨️ 快捷键说明

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