swi_core.c

来自「澳洲人写的Cortex,包括uC_IP协议栈」· C语言 代码 · 共 912 行 · 第 1/3 页

C
912
字号
<HTML><HEAD><TITLE>/home/asysweb/public_html/cortex/kernel/src/swi_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 * *      swi_core.c * * SYSTEM COMPONENT * *      Software Interrupt Management Component * * DESCRIPTION * *      This file contains all core services for for Software *      Interrupt Management Component * * SERVICES * *      Common services *      --------------- *      sfti_Init           - component initialisation routine *      sfti_Create         - create software ISR handler *      sfti_Delete         - delete software ISR handler *      sfti_GlobalForbid   - disable global software interrupt flag *      sfti_GlobalPermit   - enable  global software interrupt flag *      sfti_Disable        - disable HISRs according interrupt mask *      sfti_Enable         - enable HISRs according interrupt mask *      sfti_Trigger        - trigger software ISR *      sfti_GetHandler     - get HISR handler *      sfti_GetContext     - get HISR context *      sfti_GetFlags       - get HISR flags *      sfti_GetAttr        - get HISR attributes *      sfti_GetInfo        - get HISR info *      sfti_IsCreated      - check if HISR created *       *      Internal services *      ----------------- *      sfti_CheckPending   - check for pending software interrupts *      sfti_GetPending     - get highest pending software interrupt *      sfti_ServicePending - service all pending software interrupts * * SCCS HISTORY * *      @(#)swi_core.c  1.11, 05/19/99, 11:22:53 * * AUTHOR * *      Vadim N. Azarovsky * * CREATED * *      21-Feb-1998         by Vadim N. Azarovsky * * REVISION HISTORY * *      NAME                DATE                    REMARKS * **************************************************************************/</font><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="swi_priv.h.FIND-INC"><font color="blue">"swi_priv.h"</font></a><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="thr_priv.h.FIND-INC"><font color="blue">"thr_priv.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><font color="#6920ac">/* create HISR */</font><font size="+1"><i>crtx_Status_t</i> <b><font color="azure1"><a name="sfti_Create">sfti_Create</a></font></b>(    <i>sfti_Vector_t</i>   *pVector_a,     <i>sfti_Handler_t</i>  Handler_a,    <i>sfti_Context_t</i>  Context_a,     <i>crtx_Int_t</i>      HandlerType_a,    <i>sfti_Attr_t</i>     *pAttr_a){</font><font color="#6920ac">/********************* *  LOCAL VARIABLES  * *********************/</font>    <i>sfti_Vector_t</i>   Vector;    <i>sfti_ISRCB_t</i>    Hisr;    <i>crtx_Status_t</i>   Status = <a href="SFTI_SUCCESS.FIND-DEF">SFTI_SUCCESS</a>;<font color="#6920ac">/********************* *  PROCEDURE LOGIC  * *********************/</font>    <a href="CRTX_ASSERT.FIND-DEF">CRTX_ASSERT</a>(pVector_a)    <a href="CRTX_ASSERT.FIND-DEF">CRTX_ASSERT</a>(*pVector_a&lt;<a href="SFTI_INTR_VECTORS.FIND-DEF">SFTI_INTR_VECTORS</a>)    <a href="CRTX_ASSERT.FIND-DEF">CRTX_ASSERT</a>(Handler_a)    <a href="CRTX_ASSERT.FIND-DEF">CRTX_ASSERT</a>(HandlerType_a==<a href="SFTI_FLAG_HANDLER_TYPE_1.FIND-DEF">SFTI_FLAG_HANDLER_TYPE_1</a> ||                HandlerType_a==<a href="SFTI_FLAG_HANDLER_TYPE_2.FIND-DEF">SFTI_FLAG_HANDLER_TYPE_2</a>)    <b>if</b> (pAttr_a == <a href="CRTX_NULL.FIND-DEF">CRTX_NULL</a>)        pAttr_a = &amp;sfti_AttrDefault_g;    Hisr.Handler = Handler_a;           <font color="#6920ac">/* HISR handler */</font>    Hisr.Context = Context_a;           <font color="#6920ac">/* context */</font>    Hisr.Flags   = <a href="SFTI_FLAG_INIT.FIND-DEF">SFTI_FLAG_INIT</a>;      <font color="#6920ac">/* initial flags */</font>    Hisr.Attr    = *pAttr_a;            <font color="#6920ac">/* default attributes */</font>    Hisr.Flags  |= HandlerType_a;       <font color="#6920ac">/* handler type */</font>    <font color="#6920ac">/* process attributes */</font>    <b>if</b> ((Hisr.Attr.pStack==<a href="CRTX_NULL.FIND-DEF">CRTX_NULL</a>) &amp;&amp; (Hisr.Attr.StackSize&gt;0))    {        <font color="#6920ac">/* allocate stack */</font>        Hisr.Attr.pStack = (<i>crtx_Void_t</i>*)<a href="dmem_AllocStack.FIND-FUNC">dmem_AllocStack</a>(Hisr.Attr.Segment,                                                    Hisr.Attr.StackSize,                                                    <i>sizeof</i>(<i>crtx_Unsigned_t</i>));        <b>if</b> ((<i>crtx_Void_t</i>*)Hisr.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="SFTI_ERR_MEM_ALLOC.FIND-DEF">SFTI_ERR_MEM_ALLOC</a>;            <a href="CRTX_EXCEPTION.FIND-DEF">CRTX_EXCEPTION</a> Error_Exc;        }        Hisr.Flags |= <a href="SFTI_FLAG_STACK_ALLOC.FIND-DEF">SFTI_FLAG_STACK_ALLOC</a>;    }    <font color="#6920ac">/* disable software interrupts */</font>    <a href="#sfti_GlobalForbid">sfti_GlobalForbid</a>();    <b>if</b> (*pVector_a &lt; 0)    {        <b>if</b> (*pVector_a == -1)         {            <font color="#6920ac">/* serach for empty slot (from low-priority to high-priority) */</font>            <b>for</b> (Vector = 0; Vector &lt; <a href="SFTI_INTR_VECTORS.FIND-DEF">SFTI_INTR_VECTORS</a>; Vector++)                <b>if</b> (!<a href="sfti_IS_CREATED.FIND-FUNC">sfti_IS_CREATED</a>(Vector))                    <b>break</b>;        }        <b>else</b>        {            <font color="#6920ac">/* serach for empty slot (from high-priority to low-priority) */</font>            <b>for</b> (Vector = <a href="SFTI_INTR_VECTORS.FIND-DEF">SFTI_INTR_VECTORS</a>-1; Vector &gt;= 0; Vector--)                <b>if</b> (!<a href="sfti_IS_CREATED.FIND-FUNC">sfti_IS_CREATED</a>(Vector))                    <b>break</b>;        }        <b>if</b> (Vector==<a href="SFTI_INTR_VECTORS.FIND-DEF">SFTI_INTR_VECTORS</a> || Vector==-1)        {            <font color="#6920ac">/* all HISR slots are in use */</font>            Status = <a href="SFTI_ERR_ALL_HISRS_IN_USE.FIND-DEF">SFTI_ERR_ALL_HISRS_IN_USE</a>;            <a href="CRTX_EXCEPTION.FIND-DEF">CRTX_EXCEPTION</a> ErrorProtected_Exc;        }        *pVector_a = Vector;    }    <b>else</b>    {        <b>if</b> (<a href="sfti_IS_CREATED.FIND-FUNC">sfti_IS_CREATED</a>(*pVector_a))        {            <font color="#6920ac">/* required interrupt vector already defined */</font>            Status = <a href="SFTI_ERR_ALREADY_DEFINED.FIND-DEF">SFTI_ERR_ALREADY_DEFINED</a>;            <a href="CRTX_EXCEPTION.FIND-DEF">CRTX_EXCEPTION</a> ErrorProtected_Exc;        }        Vector = *pVector_a;    }    Hisr.Vector = Vector;    <b>if</b> (HandlerType_a == <a href="SFTI_FLAG_HANDLER_TYPE_1.FIND-DEF">SFTI_FLAG_HANDLER_TYPE_1</a>)    {        Hisr.pArg0 = (<i>crtx_Void_t</i>*)Vector;        Hisr.pArg1 = (<i>crtx_Void_t</i>*)Context_a;    }    <b>else</b>    {        Hisr.pArg0 = (<i>crtx_Void_t</i>*)Context_a;        Hisr.pArg1 = (<i>crtx_Void_t</i>*)Vector;    }<b><font color='DarkGreen'>#if</font></b><font color="maroon"> SFTI_HISR_TRACKER_ENABLED==1</font>    <font color="#6920ac">/* initialise tracker control block */</font>    Hisr.Ticks = 0;    Hisr.Cycles = 0;    Hisr.MaxTicks = 0;    Hisr.MaxCycles = 0;    Hisr.Switches = 0;<b><font color='DarkGreen'>#endif</font></b><font color="maroon"> <font color="#6920ac">/* THRD_THREAD_TRACKER_ENABLED==1 */</font></font>    <font color="#6920ac">/* prepare HISR stack frame, if required */</font>    <a href="sfti_MakeHisrStackFrame.FIND-FUNC">sfti_MakeHisrStackFrame</a>(&amp;Hisr);    <font color="#6920ac">/* initialise HISR control block */</font>    sfti_Environ_g.Defined |= <a href="sfti_Mask.FIND-FUNC">sfti_Mask</a>(Vector);    sfti_Environ_g.Enabled |= <a href="sfti_Mask.FIND-FUNC">sfti_Mask</a>(Vector);    sfti_HISRs_g[Vector] = Hisr;    <a href="#sfti_GlobalPermit">sfti_GlobalPermit</a>();    <b>return</b> Status;<font color="#6920ac">/************************ *  EXCEPTION HANDLING  * ************************/</font><font color="blue">ErrorProtected_Exc:</font>    <font color="#6920ac">/* restore interrupts */</font>    <a href="#sfti_GlobalPermit">sfti_GlobalPermit</a>();    <font color="#6920ac">/* FALL-THROUGH */</font><font color="blue">Error_Exc:</font>    <b>if</b> (Hisr.Flags &amp; <a href="SFTI_FLAG_STACK_ALLOC.FIND-DEF">SFTI_FLAG_STACK_ALLOC</a>)    {        <font color="#6920ac">/* release internally allocated stack */</font>        <a href="dmem_Free.FIND-FUNC">dmem_Free</a>(Hisr.Attr.Segment, (<i>crtx_Void_t</i>*)Hisr.Attr.pStack,                  Hisr.Attr.StackSize);    }    <b>return</b> Status;}<font color="#6920ac">/* delete HISR */</font><font size="+1"><i>crtx_Status_t</i> <b><font color="azure1"><a name="sfti_Delete">sfti_Delete</a></font></b>(    <i>sfti_Vector_t</i> Vector_a){</font><font color="#6920ac">/********************* *  LOCAL VARIABLES  * *********************/</font>    <i>crtx_Mask_t</i>     Mask;    <i>sfti_ISRCB_t</i>    HisrNew, HisrOld;    <i>crtx_Status_t</i>   Status = <a href="SFTI_SUCCESS.FIND-DEF">SFTI_SUCCESS</a>;<font color="#6920ac">/********************* *  PROCEDURE LOGIC  * *********************/</font>    <a href="CRTX_ASSERT.FIND-DEF">CRTX_ASSERT</a>(Vector_a&gt;=0 &amp;&amp; Vector_a&lt;<a href="SFTI_INTR_VECTORS.FIND-DEF">SFTI_INTR_VECTORS</a>)    HisrNew.Handler = sfti_UnhandledHISR;       <font color="#6920ac">/* unregistered interrupts  */</font>    HisrNew.Context = (<i>sfti_Context_t</i>)Vector_a; <font color="#6920ac">/* HISR vector number */</font>    HisrNew.Flags   = <a href="SFTI_FLAG_INIT.FIND-DEF">SFTI_FLAG_INIT</a>;           <font color="#6920ac">/* init flags */</font>    HisrNew.Attr.pStack = <a href="CRTX_NULL.FIND-DEF">CRTX_NULL</a>;            <font color="#6920ac">/* no personal stack */</font>    <font color="#6920ac">/* disable software interrupts */</font>    <a href="#sfti_GlobalForbid">sfti_GlobalForbid</a>();    <b>if</b> (!<a href="sfti_IS_CREATED.FIND-FUNC">sfti_IS_CREATED</a>(Vector_a))    {        <font color="#6920ac">/* HISR is not defined */</font>        Status = <a href="SFTI_ERR_NOT_DEFINED.FIND-DEF">SFTI_ERR_NOT_DEFINED</a>;        <a href="CRTX_EXCEPTION.FIND-DEF">CRTX_EXCEPTION</a> ErrorProtected_Exc;    }    Mask = ~<a href="sfti_Mask.FIND-FUNC">sfti_Mask</a>(Vector_a);    sfti_Environ_g.Enabled &amp;= Mask;    sfti_Environ_g.Defined &amp;= Mask;    sfti_Environ_g.Pending &amp;= Mask;    sfti_Environ_g.Active  &amp;= Mask;    HisrOld = sfti_HISRs_g[Vector_a];    sfti_HISRs_g[Vector_a] = HisrNew;    <a href="#sfti_GlobalPermit">sfti_GlobalPermit</a>();    <b>if</b> (HisrOld.Flags &amp; <a href="SFTI_FLAG_STACK_ALLOC.FIND-DEF">SFTI_FLAG_STACK_ALLOC</a>)    {        <font color="#6920ac">/* release internally allocated stack */</font>        <a href="dmem_Free.FIND-FUNC">dmem_Free</a>(HisrOld.Attr.Segment, (<i>crtx_Void_t</i>*)HisrOld.Attr.pStack,                  HisrOld.Attr.StackSize);    }    <b>return</b> Status;<font color="#6920ac">/************************ *  EXCEPTION HANDLING  * ************************/</font><font color="blue">ErrorProtected_Exc:</font>    <font color="#6920ac">/* restore interrupts */</font>    <a href="#sfti_GlobalPermit">sfti_GlobalPermit</a>();    <b>return</b> Status;}<font color="#6920ac">/* forbid global software interrupts */</font><font size="+1"><i>crtx_Void_t</i> <b><font color="azure1"><a name="sfti_GlobalForbid">sfti_GlobalForbid</a></font></b>(    <i>crtx_Void_t</i>){</font><font color="#6920ac">/********************* *  LOCAL VARIABLES  * *********************/</font>    <font color="#6920ac">/* None */</font><font color="#6920ac">/********************* *  PROCEDURE LOGIC  * *********************/</font>

⌨️ 快捷键说明

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