📄 hal_intr.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 Red Hat eCos Public License // Version 1.1 (the "License"); you may not use this file except in // compliance with the License. You may obtain a copy of the License at // http://www.redhat.com/ // // 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 Configurable Operating System, // released September 30, 1998. // // The Initial Developer of the Original Code is Red Hat. // Portions created by Red Hat are // Copyright (C) 1998, 1999, 2000 Red Hat, Inc. // All Rights Reserved. // ------------------------------------------- // //####COPYRIGHTEND####//==========================================================================//#####DESCRIPTIONBEGIN####//// Author(s): jskov// Contributors: jskov,// Date: 1999-04-24// 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>// More include statements below. First part of this file must be// usable for both assembly and C files, so only use defines here.//--------------------------------------------------------------------------// SH3 exception vectors. These correspond to VSRs and are the values// to use for HAL_VSR_GET/SET//// Note that exceptions are decoded - there is a VSR slot for each exception// source, while interrupts are handled via the same VSR.#define CYGNUM_HAL_VECTOR_POWERON 0 // power-on#define CYGNUM_HAL_VECTOR_RESET 1 // reset#define CYGNUM_HAL_VECTOR_TLBMISS_ACCESS 2 // TLB-miss/invalid load#define CYGNUM_HAL_VECTOR_TLBMISS_WRITE 3 // TLB-miss/invalid store#define CYGNUM_HAL_VECTOR_INITIAL_WRITE 4 // initial page write#define CYGNUM_HAL_VECTOR_TLBERROR_ACCESS 5 // TLB prot violation l#define CYGNUM_HAL_VECTOR_TLBERROR_WRITE 6 // TLB prot violation s#define CYGNUM_HAL_VECTOR_DATA_ACCESS 7 // address error (load)#define CYGNUM_HAL_VECTOR_DATA_WRITE 8 // address error (store)// define CYGNUM_HAL_VECTOR_RESERVED_9 9// define CYGNUM_HAL_VECTOR_RESERVED_10 10#define CYGNUM_HAL_VECTOR_TRAP 11 // unconditional trap#define CYGNUM_HAL_VECTOR_ILLEGAL_INSTRUCTION 12 // reserved instruction#define CYGNUM_HAL_VECTOR_ILLEGAL_SLOT_INSTRUCTION 13 // illegal instruction in delay slot// define CYGNUM_HAL_VECTOR_RESERVED_14 14#define CYGNUM_HAL_VECTOR_INSTRUCTION_BP 15 // user breakpoint#define CYG_VECTOR_IS_INTERRUPT(v) \ (CYGNUM_HAL_VECTOR_INSTRUCTION_BP < (v))#define CYGNUM_HAL_VECTOR_INTERRUPT 16 // all interrupts#define CYGNUM_HAL_VSR_MIN CYGNUM_HAL_VECTOR_POWERON#define CYGNUM_HAL_VSR_MAX CYGNUM_HAL_VECTOR_INTERRUPT#define CYGNUM_HAL_VSR_COUNT ( CYGNUM_HAL_VSR_MAX + 1 )#define CYGNUM_HAL_VSR_EXCEPTION_COUNT (CYGNUM_HAL_VECTOR_INSTRUCTION_BP-CYGNUM_HAL_VECTOR_POWERON+1)// The decoded interrupts.#define CYGNUM_HAL_INTERRUPT_NMI 0#define CYGNUM_HAL_INTERRUPT_RESERVED_1E0 1#define CYGNUM_HAL_INTERRUPT_LVL0 2#define CYGNUM_HAL_INTERRUPT_LVL1 3#define CYGNUM_HAL_INTERRUPT_LVL2 4#define CYGNUM_HAL_INTERRUPT_LVL3 5#define CYGNUM_HAL_INTERRUPT_LVL4 6#define CYGNUM_HAL_INTERRUPT_LVL5 7#define CYGNUM_HAL_INTERRUPT_LVL6 8#define CYGNUM_HAL_INTERRUPT_LVL7 9#define CYGNUM_HAL_INTERRUPT_LVL8 10#define CYGNUM_HAL_INTERRUPT_LVL9 11#define CYGNUM_HAL_INTERRUPT_LVL10 12#define CYGNUM_HAL_INTERRUPT_LVL11 13#define CYGNUM_HAL_INTERRUPT_LVL12 14#define CYGNUM_HAL_INTERRUPT_LVL13 15#define CYGNUM_HAL_INTERRUPT_LVL14 16#define CYGNUM_HAL_INTERRUPT_RESERVED_3E0 17#define CYGNUM_HAL_INTERRUPT_TMU0_TUNI0 18#define CYGNUM_HAL_INTERRUPT_TMU1_TUNI1 19#define CYGNUM_HAL_INTERRUPT_TMU2_TUNI2 20#define CYGNUM_HAL_INTERRUPT_TMU2_TICPI2 21#define CYGNUM_HAL_INTERRUPT_RTC_ATI 22#define CYGNUM_HAL_INTERRUPT_RTC_PRI 23#define CYGNUM_HAL_INTERRUPT_RTC_CUI 24#define CYGNUM_HAL_INTERRUPT_SCI_ERI 25#define CYGNUM_HAL_INTERRUPT_SCI_RXI 26#define CYGNUM_HAL_INTERRUPT_SCI_TXI 27#define CYGNUM_HAL_INTERRUPT_SCI_TEI 28#define CYGNUM_HAL_INTERRUPT_WDT_ITI 29#define CYGNUM_HAL_INTERRUPT_REF_RCMI 30#define CYGNUM_HAL_INTERRUPT_REF_ROVI 31// CYGNUM_HAL_ISR_COUNT must match CYG_ISR_TABLE_SIZE defined in vectors.S.#define CYGNUM_HAL_ISR_MIN CYGNUM_HAL_INTERRUPT_NMI#define CYGNUM_HAL_ISR_MAX CYGNUM_HAL_INTERRUPT_REF_ROVI#define CYGNUM_HAL_ISR_COUNT ( CYGNUM_HAL_ISR_MAX + 1 )// Exception vectors. These are the values used when passed out to an// external exception handler using cyg_hal_deliver_exception()// The exception indexes are EXPEVT/0x20#define CYGNUM_HAL_EXCEPTION_POWERON 0 // power-on#define CYGNUM_HAL_EXCEPTION_RESET 1 // reset#define CYGNUM_HAL_EXCEPTION_TLBMISS_ACCESS 2 // TLB-miss/invalid load#define CYGNUM_HAL_EXCEPTION_TLBMISS_WRITE 3 // TLB-miss/invalid store#define CYGNUM_HAL_EXCEPTION_INITIAL_WRITE 4 // initial page write#define CYGNUM_HAL_EXCEPTION_TLBERROR_ACCESS 5 // TLB prot violation l#define CYGNUM_HAL_EXCEPTION_TLBERROR_WRITE 6 // TLB prot violation s#define CYGNUM_HAL_EXCEPTION_DATA_ACCESS 7 // address error (load)#define CYGNUM_HAL_EXCEPTION_DATA_WRITE 8 // address error (store)// define CYGNUM_HAL_EXCEPTION_RESERVED_9 9// define CYGNUM_HAL_EXCEPTION_RESERVED_10 10#define CYGNUM_HAL_EXCEPTION_TRAP 11 // unconditional trap#define CYGNUM_HAL_EXCEPTION_ILLEGAL_INSTRUCTION 12 // reserved instruction#define CYGNUM_HAL_EXCEPTION_ILLEGAL_SLOT_INSTRUCTION 13 // illegal instruction in delay slot// define CYGNUM_HAL_EXCEPTION_RESERVED_14 14#define CYGNUM_HAL_EXCEPTION_INSTRUCTION_BP 15 // user breakpoint#define CYGNUM_HAL_EXCEPTION_MIN CYGNUM_HAL_EXCEPTION_POWERON#define CYGNUM_HAL_EXCEPTION_MAX CYGNUM_HAL_EXCEPTION_INSTRUCTION_BP#define CYGNUM_HAL_EXCEPTION_COUNT \ ( CYGNUM_HAL_EXCEPTION_MAX - CYGNUM_HAL_EXCEPTION_MIN + 1 )// The vector used by the Real time clock#define CYGNUM_HAL_INTERRUPT_RTC CYGNUM_HAL_INTERRUPT_TMU0_TUNI0#ifndef __ASSEMBLER__#include <cyg/infra/cyg_type.h>#include <cyg/hal/sh_regs.h> // register definitions#include <cyg/hal/hal_io.h> // io macros#include <cyg/infra/cyg_ass.h> // CYG_FAIL//--------------------------------------------------------------------------// 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 that these macros control interrupt state by setting the Imask// of the SR rather than the (more obvious) BL. This is because a CPU// reset is forced if execptions (such as breakpoints) are generated// while the BL flag is set.#define HAL_DISABLE_INTERRUPTS(_old_) \ CYG_MACRO_START \ cyg_uint32 _tmp_; \ asm volatile ( \ "stc sr,%1 \n\t" \ "mov %2,%0 \n\t" \ "and %1,%0 \n\t" \ "or %2,%1 \n\t" \ "ldc %1,sr \n\t" \ : "=&r"(_old_), "=&r" (_tmp_) \ : "r" (CYGARC_REG_SR_IMASK) \ ); \ CYG_MACRO_END#define HAL_ENABLE_INTERRUPTS() \ CYG_MACRO_START \ cyg_uint32 _tmp_; \ asm volatile ( \ "stc sr,%0 \n\t" \ "and %1,%0 \n\t" \ "ldc %0,sr \n\t" \ : "=&r" (_tmp_) \ : "r" (~CYGARC_REG_SR_IMASK) \ ); \ CYG_MACRO_END#define HAL_RESTORE_INTERRUPTS(_old_) \ CYG_MACRO_START \ cyg_uint32 _tmp1_, _tmp2_; \ asm volatile ( \ "stc sr,%0 \n\t" \ "and %3,%0 \n\t" \ "not %3,%1 \n\t" \ "and %2,%1 \n\t" \ "or %1,%0 \n\t" \ "ldc %0,sr \n\t" \ : "=&r" (_tmp1_), "=&r" (_tmp2_) \ : "r" (_old_), "r" (~CYGARC_REG_SR_IMASK) \ ); \ CYG_MACRO_END#define HAL_QUERY_INTERRUPTS(_old_) \ CYG_MACRO_START \ asm volatile ( \ "stc sr,%0 \n\t" \ "and %1,%0 \n\t" \ : "=&r"(_old_) \ : "r" (CYGARC_REG_SR_IMASK) \ ); \ CYG_MACRO_END//--------------------------------------------------------------------------// Vector translation.#ifdef CYGIMP_HAL_COMMON_INTERRUPTS_CHAIN# define HAL_TRANSLATE_VECTOR(_vector_,_index_) (_index_) = 0#else# define HAL_TRANSLATE_VECTOR(_vector_,_index_) (_index_) = (_vector_)#endif//--------------------------------------------------------------------------// Routine to execute DSRs using separate interrupt stack#ifdef CYGIMP_HAL_COMMON_INTERRUPTS_USE_INTERRUPT_STACKexternC void hal_interrupt_stack_call_pending_DSRs(void);#define HAL_INTERRUPT_STACK_CALL_PENDING_DSRS() \ hal_interrupt_stack_call_pending_DSRs()// these are offered solely for stack usage testing// if they are not defined, then there is no interrupt stack.#define HAL_INTERRUPT_STACK_BASE cyg_interrupt_stack_base
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -