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<<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 = &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>) && (Hisr.Attr.StackSize>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 < 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 < <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 >= 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>(&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 & <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>=0 && Vector_a<<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 &= Mask; sfti_Environ_g.Defined &= Mask; sfti_Environ_g.Pending &= Mask; sfti_Environ_g.Active &= 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 & <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 + -
显示快捷键?