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 &lt; HRDI_NUM_LISR) || (HRDI_NUM_LISR &gt; 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) &amp;&amp; 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) &amp;&amp; !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 &lt; 0) || (Vector_a &gt;= <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 = &amp;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 &gt; 1</font>    Lisr.IntrCntr = 0;<b><font color='DarkGreen'>#endif</font></b><font color="maroon"> <font color="#6920ac">/* ENVI_CRTX_ERR_CHECK_LEVEL &gt; 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>) &amp;&amp; (Lisr.Attr.StackSize&gt;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>(&amp;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&lt;<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>(&amp;Lisr);    <font color="#6920ac">/* check for Direct ISR */</font>    <b>if</b> (Lisr.Flags &amp; <a href="HRDI_FLAG_DISR.FIND-DEF">HRDI_FLAG_DISR</a>)    {        <a href="ENVI_HRDI_REGISTER_DISR.FIND-DEF">ENVI_HRDI_REGISTER_DISR</a>(&amp;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>(&amp;Lisr);        }    }    <font color="#6920ac">/* Do some additional CPU setup enable specified source */</font>    <a href="hrdi_EnableVector.FIND-FUNC">hrdi_EnableVector</a>(&amp;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 &amp; <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 + -
显示快捷键?