hwi_core.c
来自「澳洲人写的Cortex,包括uC_IP协议栈」· C语言 代码 · 共 1,302 行 · 第 1/4 页
C
1,302 行
<HTML><HEAD><TITLE>/home/asysweb/public_html/cortex/kernel/src/hwi_core.c</TITLE></HEAD><BODY><pre><font color="#6920ac">/*************************************************************************/</font><font color="#6920ac">/* */</font><font color="#6920ac">/* Copyright (c) 1997-1999 Australian Real Time Embedded Systems */</font><font color="#6920ac">/* */</font><font color="#6920ac">/* PROPRIETARY RIGHTS of Australian Real Time Embedded Systems */</font><font color="#6920ac">/* are involved in the subject matter of this material. All reproduction,*/</font><font color="#6920ac">/* manufacturing, use, and sales rights pertaining to this subject matter*/</font><font color="#6920ac">/* are governed by the license agreement. The recipient of this software */</font><font color="#6920ac">/* implicitly accepts the terms of the license. */</font><font color="#6920ac">/* */</font><font color="#6920ac">/*************************************************************************/</font><font color="#6920ac">/************************************************************************* * * FILE NAME * * hwi_core.c * * SYSTEM COMPONENT * * Hardware Interrupt Management Component * * DESCRIPTION * * This file contains all core services for for Hardware * Interrupt Management Component * * SERVICES * * Common services * --------------- * hrdi_Install - install hardware interrupt handler * hrdi_Uninstall - uninstall hardware interrupt handler * hrdi_ServicePending - service pending software ISR * hrdi_CheckPending - same as sfti_CheckPending but does not * enable global software interrupt flag. * hrdi_Forbid - disable registered hardware ISR * hrdi_Permit - re-enable interrupts disabled by hrdi_Forbid * hrdi_GlobalForbid - disable all hardware interrupts * hrdi_GlobalPermit - enable interrupts disabled by hrdi_GlobalForbid * hrdi_Protect - disable interrupt source * hrdi_Unprotect - re-enable interrupt source * hrdi_Shell - LISR shell * hrdi_GetHandler - get LISR handler * hrdi_GetContext - get LISR context * hrdi_GetFlags - get LISR flags * hrdi_GetAttr - get LISR attributes * hrdi_GetInfo - get LISR info * hrdi_IsInstalled - check if LISR installed * * Services available for HRDI_INTR_MASK_MODEL * ------------------------------------------- * hrdi_GetDefined - get mask of defined interrupts * hrdi_GetEnabled - get mask of enabled interrupts * * Services available for HRDI_PRIO_LEVEL_MODEL * -------------------------------------------- * hrdi_GetMaxPriority - get highest registered interrupt priority * level * * Internal services * ----------------- * hrdi_InitISRCB - initialise ISR control block * hrdi_UnhandledLISR - unhandled interrupt handler * hrdi_SetGlobalBits - set internal bits/flags * hrdi_ClearGlobalBits- clear internal bits/flags * * SCCS HISTORY * * @(#)hwi_core.c 1.12, 09/14/99, 19:04:09 * * AUTHOR * * Vadim N. Azarovsky * * CREATED * * 17-Feb-1998 by Vadim N. Azarovsky * * REVISION HISTORY * * NAME DATE REMARKS * **************************************************************************/</font><b><font color='DarkGreen'>#include</font></b> <a href="hwi_priv.h.FIND-INC"><font color="blue">"hwi_priv.h"</font></a><b><font color='DarkGreen'>#include</font></b> <a href="swi_defs.h.FIND-INC"><font color="blue">"swi_defs.h"</font></a><b><font color='DarkGreen'>#include</font></b> <a href="ass_defs.h.FIND-INC"><font color="blue">"ass_defs.h"</font></a><b><font color='DarkGreen'>#include</font></b> <a href="mem_defs.h.FIND-INC"><font color="blue">"mem_defs.h"</font></a><b><font color='DarkGreen'>#include</font></b> <a href="sys_defs.h.FIND-INC"><font color="blue">"sys_defs.h"</font></a><b><font color='DarkGreen'>#include</font></b> <a href="swi_priv.h.FIND-INC"><font color="blue">"swi_priv.h"</font></a><b><font color='DarkGreen'>#ifdef</font></b><font color="maroon"> HRDI_INTR_MASK_MODEL</font><b><font color='DarkGreen'># if</font></b><font color="maroon"> ((HRDI_INTR_VECTORS < HRDI_NUM_LISR) || (HRDI_NUM_LISR > 32))</font><b><font color='DarkGreen'># error</font></b><font color="maroon"> Too many LISRs specified</font><b><font color='DarkGreen'># endif</font></b><font color="maroon"></font><b><font color='DarkGreen'>#endif</font></b><font color="maroon"></font><b><font color='DarkGreen'>#if</font></b><font color="maroon"> (defined(HRDI_INTR_MASK_MODEL) && defined(HRDI_PRIO_LEVEL_MODEL))</font><b><font color='DarkGreen'># error</font></b><font color="maroon"> Both interrupt models requested. </font><b><font color='DarkGreen'>#endif</font></b><font color="maroon"></font><b><font color='DarkGreen'>#if</font></b><font color="maroon"> (!defined(HRDI_INTR_MASK_MODEL) && !defined(HRDI_PRIO_LEVEL_MODEL))</font><b><font color='DarkGreen'># error</font></b><font color="maroon"> Interrupt model not specified.</font><b><font color='DarkGreen'>#endif</font></b><font color="maroon"></font><font color="#6920ac">/* * Register hardware interrupt handler for specified * interrupt vector */</font><font size="+1"><i>crtx_Status_t</i> <b><font color="azure1"><a name="hrdi_Install">hrdi_Install</a></font></b>( <i>hrdi_Vector_t</i> Vector_a, <font color="#6920ac">/* interrupt vector */</font> <i>hrdi_Handler_t</i> Handler_a, <font color="#6920ac">/* interrupt service routine */</font> <i>hrdi_Context_t</i> Context_a, <font color="#6920ac">/* context */</font> <i>crtx_Int_t</i> HandlerType_a, <font color="#6920ac">/* ISR calling type */</font> <i>hrdi_Attr_t</i> *pAttr_a <font color="#6920ac">/* attributes */</font>){</font><font color="#6920ac">/********************* * LOCAL VARIABLES * *********************/</font> <i>crtx_Int_t</i> LisrIndex; <font color="#6920ac">/* index of LISR slot allocated */</font> <i>hrdi_ISRCB_t</i> Lisr; <font color="#6920ac">/* LISR/HISR control block */</font><b><font color='DarkGreen'>#ifdef</font></b><font color="maroon"> HRDI_INTR_MASK_MODEL</font> <i>hrdi_Mask_t</i> VectorMask; <font color="#6920ac">/* interrupt mask for interrupt vector */</font> <i>hrdi_Mask_t</i> OldMask; <font color="#6920ac">/* current interrupt mask */</font><b><font color='DarkGreen'>#endif</font></b><font color="maroon"> <font color="#6920ac">/* HRDI_INTR_MASK_MODEL */</font></font><b><font color='DarkGreen'>#ifdef</font></b><font color="maroon"> HRDI_PRIO_LEVEL_MODEL</font> <i>hrdi_Priority_t</i> OldPrio; <font color="#6920ac">/* current CPU priority */</font><b><font color='DarkGreen'>#endif</font></b><font color="maroon"> <font color="#6920ac">/* HRDI_PRIO_LEVEL_MODEL */</font></font> <i>crtx_Status_t</i> Status = <a href="HRDI_SUCCESS.FIND-DEF">HRDI_SUCCESS</a>;<font color="#6920ac">/********************* * PROCEDURE LOGIC * *********************/</font> <a href="CRTX_ASSERT.FIND-DEF">CRTX_ASSERT</a>(Handler_a) <font color="#6920ac">/* verify interrupt vector number */</font> <b>if</b> ((Vector_a < 0) || (Vector_a >= <a href="HRDI_INTR_VECTORS.FIND-DEF">HRDI_INTR_VECTORS</a>)) { <font color="#6920ac">/* invalid interrupt vector number */</font> Status = <a href="HRDI_ERR_INVALID_VECTOR.FIND-DEF">HRDI_ERR_INVALID_VECTOR</a>; <a href="CRTX_EXCEPTION.FIND-DEF">CRTX_EXCEPTION</a> Error_Exc; } <b>if</b> (pAttr_a == <a href="CRTX_NULL.FIND-DEF">CRTX_NULL</a>) <font color="#6920ac">/* use default attributes */</font> pAttr_a = &hrdi_AttrDefault_g; <a href="CRTX_ASSERT.FIND-DEF">CRTX_ASSERT</a>(<a href="HRDI_FLAG_IS_HANDLER_TYPE_1.FIND-DEF">HRDI_FLAG_IS_HANDLER_TYPE_1</a>(HandlerType_a) || <a href="HRDI_FLAG_IS_HANDLER_TYPE_2.FIND-DEF">HRDI_FLAG_IS_HANDLER_TYPE_2</a>(HandlerType_a)) <font color="#6920ac">/* preparing to register interrupt source */</font> Lisr.Vector = Vector_a; <font color="#6920ac">/* hardware interrupt vector */</font> Lisr.Handler = Handler_a; <font color="#6920ac">/* interrupt handler */</font> Lisr.Context = Context_a; <font color="#6920ac">/* ISR context */</font> Lisr.Flags = <a href="HRDI_FLAG_INIT.FIND-DEF">HRDI_FLAG_INIT</a>; <font color="#6920ac">/* initial flags */</font>; Lisr.Attr = *pAttr_a; <font color="#6920ac">/* attributes */</font> Lisr.Flags |= HandlerType_a; <font color="#6920ac">/* handler type */</font> Lisr.pSP = <a href="CRTX_NULL.FIND-DEF">CRTX_NULL</a>; <font color="#6920ac">/* assume that no LISR stack */</font><b><font color='DarkGreen'>#if</font></b><font color="maroon"> ENVI_CRTX_ERR_CHECK_LEVEL > 1</font> Lisr.IntrCntr = 0;<b><font color='DarkGreen'>#endif</font></b><font color="maroon"> <font color="#6920ac">/* ENVI_CRTX_ERR_CHECK_LEVEL > 1 */</font></font> <b>if</b> (<a href="HRDI_FLAG_IS_HANDLER_TYPE_1.FIND-DEF">HRDI_FLAG_IS_HANDLER_TYPE_1</a>(HandlerType_a)) { Lisr.pArg0 = (<i>crtx_Void_t</i>*)Vector_a; Lisr.pArg1 = (<i>crtx_Void_t</i>*)Context_a; } <b>else</b> { Lisr.pArg0 = (<i>crtx_Void_t</i>*)Context_a; Lisr.pArg1 = (<i>crtx_Void_t</i>*)Vector_a; } <font color="#6920ac">/* process attributs*/</font> <b>if</b> ((Lisr.Attr.pStack==<a href="CRTX_NULL.FIND-DEF">CRTX_NULL</a>) && (Lisr.Attr.StackSize>0)) { <font color="#6920ac">/* allocate stack */</font> Lisr.Attr.pStack = (<i>crtx_Void_t</i>*)<a href="dmem_AllocStack.FIND-FUNC">dmem_AllocStack</a>(Lisr.Attr.Segment, Lisr.Attr.StackSize, <i>sizeof</i>(<i>crtx_Unsigned_t</i>)); <b>if</b> ((<i>crtx_Void_t</i>*)Lisr.Attr.pStack == (<i>crtx_Void_t</i>*)<a href="DMEM_ILLEGAL.FIND-DEF">DMEM_ILLEGAL</a>) { <font color="#6920ac">/* memory allocation error */</font> Status = <a href="HRDI_ERR_MEM_ALLOC.FIND-DEF">HRDI_ERR_MEM_ALLOC</a>; <a href="CRTX_EXCEPTION.FIND-DEF">CRTX_EXCEPTION</a> Error_Exc; } Lisr.Flags |= <a href="HRDI_FLAG_STACK_ALLOC.FIND-DEF">HRDI_FLAG_STACK_ALLOC</a>; } <font color="#6920ac">/* prepare LISR stack frame, if required */</font> <a href="hrdi_MakeLisrStackFrame.FIND-FUNC">hrdi_MakeLisrStackFrame</a>(&Lisr);<b><font color='DarkGreen'>#ifdef</font></b><font color="maroon"> HRDI_INTR_MASK_MODEL</font> VectorMask = <a href="hrdi_Mask.FIND-FUNC">hrdi_Mask</a>(Vector_a); <b>if</b> (VectorMask == 0) { <font color="#6920ac">/* don't register LISR for reserved interrupt sources */</font> Status = <a href="HRDI_ERR_RESERVED_VECTOR.FIND-DEF">HRDI_ERR_RESERVED_VECTOR</a>; <a href="CRTX_EXCEPTION.FIND-DEF">CRTX_EXCEPTION</a> Error_Exc; } <font color="#6920ac">/* disable all registered hardware interrupts */</font> OldMask = <a href="hrdi_Disable.FIND-FUNC">hrdi_Disable</a>(<a href="HRDI_INTR_DISABLE.FIND-DEF">HRDI_INTR_DISABLE</a>); <font color="#6920ac">/* LISR always blocks itself */</font> Lisr.Attr.Mask |= VectorMask;<b><font color='DarkGreen'>#endif</font></b><font color="maroon"> <font color="#6920ac">/* HRDI_INTR_MASK_MODEL */</font></font><b><font color='DarkGreen'>#ifdef</font></b><font color="maroon"> HRDI_PRIO_LEVEL_MODEL</font> <font color="#6920ac">/* disable all registered hardware interrupts */</font> OldPrio = <a href="hrdi_SetPrioLevel.FIND-FUNC">hrdi_SetPrioLevel</a>(<a href="HRDI_INTR_DISABLE.FIND-DEF">HRDI_INTR_DISABLE</a>);<b><font color='DarkGreen'>#endif</font></b><font color="maroon"> <font color="#6920ac">/* HRDI_PRIO_LEVEL_MODEL */</font></font> <font color="#6920ac">/* register LISR to catch interrupt */</font><b><font color='DarkGreen'>#if</font></b><font color="maroon"> (HRDI_INTR_VECTORS != HRDI_NUM_LISR)</font> LisrIndex = hrdi_RegVectorsTab_g[Vector_a]; <b>if</b> (LisrIndex == <a href="HRDI_NUM_LISR.FIND-DEF">HRDI_NUM_LISR</a>) { <i>crtx_Int_t</i> i; <font color="#6920ac">/* need to search for free LISR slot */</font> <b>for</b> (i=0; i<<a href="HRDI_NUM_LISR.FIND-DEF">HRDI_NUM_LISR</a>; i++) <b>if</b> (hrdi_LISRs_g[i].Vector == <a href="HRDI_FREE_SLOT.FIND-DEF">HRDI_FREE_SLOT</a>) <b>break</b>; <b>if</b> (i == <a href="HRDI_NUM_LISR.FIND-DEF">HRDI_NUM_LISR</a>) { <font color="#6920ac">/* all LISR slots are in use */</font> Status = <a href="HRDI_ERR_ALL_LISRS_IN_USE.FIND-DEF">HRDI_ERR_ALL_LISRS_IN_USE</a>; <a href="CRTX_EXCEPTION.FIND-DEF">CRTX_EXCEPTION</a> ErrorProtected_Exc; } hrdi_RegVectorsTab_g[Vector_a] = LisrIndex = i; }<b><font color='DarkGreen'>#else</font></b><font color="maroon"></font> <font color="#6920ac">/* have enough LISR slots for all interrupt vectors */</font> LisrIndex = Vector_a;<b><font color='DarkGreen'>#endif</font></b><font color="maroon"> <font color="#6920ac">/* (HRDI_INTR_VECTORS != HRDI_NUM_LISR) */</font></font> hrdi_LISRs_g[LisrIndex] = Lisr; <font color="#6920ac">/* setting up all bits are required for new interrupts vector */</font> <a href="#hrdi_SetGlobalBits">hrdi_SetGlobalBits</a>(&Lisr); <font color="#6920ac">/* check for Direct ISR */</font> <b>if</b> (Lisr.Flags & <a href="HRDI_FLAG_DISR.FIND-DEF">HRDI_FLAG_DISR</a>) { <a href="ENVI_HRDI_REGISTER_DISR.FIND-DEF">ENVI_HRDI_REGISTER_DISR</a>(&Lisr); } <b>else</b> { <font color="#6920ac">/* check for dispatcher */</font> <b>if</b> (Lisr.Attr.Dispatcher) { <a href="ENVI_HRDI_REGISTER_DISPATCHER.FIND-DEF">ENVI_HRDI_REGISTER_DISPATCHER</a>(&Lisr); } } <font color="#6920ac">/* Do some additional CPU setup enable specified source */</font> <a href="hrdi_EnableVector.FIND-FUNC">hrdi_EnableVector</a>(&Lisr);<b><font color='DarkGreen'>#ifdef</font></b><font color="maroon"> HRDI_INTR_MASK_MODEL</font> <font color="#6920ac">/* on return we will enable new interrupt source */</font> OldMask |= VectorMask;<b><font color='DarkGreen'>#endif</font></b><font color="maroon"> <font color="#6920ac">/* HRDI_INTR_MASK_MODEL */</font></font> <b><font color='DarkGreen'>#ifdef</font></b><font color="maroon"> HRDI_INTR_MASK_MODEL</font> <font color="#6920ac">/* restore interrupt mask */</font> <a href="hrdi_Enable.FIND-FUNC">hrdi_Enable</a>(OldMask);<b><font color='DarkGreen'>#endif</font></b><font color="maroon"> <font color="#6920ac">/* HRDI_INTR_MASK_MODEL */</font></font><b><font color='DarkGreen'>#ifdef</font></b><font color="maroon"> HRDI_PRIO_LEVEL_MODEL</font> <font color="#6920ac">/* restore interrupt priority level */</font> <a href="hrdi_SetPrioLevel.FIND-FUNC">hrdi_SetPrioLevel</a>(OldPrio);<b><font color='DarkGreen'>#endif</font></b><font color="maroon"> <font color="#6920ac">/* HRDI_PRIO_LEVEL_MODEL */</font></font> <b>return</b> Status;<font color="#6920ac">/************************ * EXCEPTION HANDLING * ************************/</font><b><font color='DarkGreen'>#if</font></b><font color="maroon"> (HRDI_INTR_VECTORS != HRDI_NUM_LISR)</font><font color="blue">ErrorProtected_Exc:</font><b><font color='DarkGreen'>#ifdef</font></b><font color="maroon"> HRDI_INTR_MASK_MODEL</font> <font color="#6920ac">/* restore interrupt mask */</font> <a href="hrdi_Enable.FIND-FUNC">hrdi_Enable</a>(OldMask);<b><font color='DarkGreen'>#endif</font></b><font color="maroon"> <font color="#6920ac">/* HRDI_INTR_MASK_MODEL */</font></font><b><font color='DarkGreen'>#ifdef</font></b><font color="maroon"> HRDI_PRIO_LEVEL_MODEL</font> <font color="#6920ac">/* restore interrupt priority level */</font> <a href="hrdi_SetPrioLevel.FIND-FUNC">hrdi_SetPrioLevel</a>(OldPrio);<b><font color='DarkGreen'>#endif</font></b><font color="maroon"> <font color="#6920ac">/* HRDI_PRIO_LEVEL_MODEL */</font></font> <font color="#6920ac">/* FALL-THROUGH */</font><b><font color='DarkGreen'>#endif</font></b><font color="maroon"> <font color="#6920ac">/* (HRDI_INTR_VECTORS != HRDI_NUM_LISR) */</font></font><font color="blue">Error_Exc:</font> <b>if</b> (Lisr.Flags & <a href="HRDI_FLAG_STACK_ALLOC.FIND-DEF">HRDI_FLAG_STACK_ALLOC</a>) { <font color="#6920ac">/* release internally allocated stack */</font> <a href="dmem_Free.FIND-FUNC">dmem_Free</a>(Lisr.Attr.Segment, (<i>crtx_Void_t</i>*)Lisr.Attr.pStack, Lisr.Attr.StackSize); } <b>return</b> Status;}<font color="#6920ac">/* * Unregister hardware interrupt handler for specified * interrupt vector */</font><font size="+1"><i>crtx_Status_t</i> <b><font color="azure1"><a name="hrdi_Uninstall">hrdi_Uninstall</a></font></b>( <i>hrdi_Vector_t</i> Vector_a <font color="#6920ac">/* interrupt vector */</font>){</font><font color="#6920ac">/********************* * LOCAL VARIABLES * *********************/</font> <i>crtx_Int_t</i> LisrIndex; <font color="#6920ac">/* index of LISR slot allocated */</font> <i>hrdi_ISRCB_t</i> Lisr, LisrOld; <font color="#6920ac">/* LISR/HISR control blocks */</font><b><font color='DarkGreen'>#ifdef</font></b><font color="maroon"> HRDI_INTR_MASK_MODEL</font> <i>hrdi_Mask_t</i> OldMask; <font color="#6920ac">/* current interrupt mask */</font><b><font color='DarkGreen'>
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?