⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 efl_core.c

📁 澳洲人写的Cortex,包括uC_IP协议栈
💻 C
字号:
<HTML><HEAD><TITLE>/home/asysweb/public_html/cortex/examples/exmpl6/src/efl_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><b><font color='DarkGreen'>#include</font></b> <a href="efl_defs.h.FIND-INC"><font color="blue">"efl_defs.h"</font></a><font size="+1"><i>static</i> <i>crtx_Bool_t</i> <a href="eflg_CompareKeyAnd.FIND-FUNC">eflg_CompareKeyAnd</a>(<i>crtx_Uint32_t</i> WaitKey_a,                                       <i>crtx_Uint32_t</i> ArgKey_a);</font><font size="+1"><i>static</i> <i>crtx_Bool_t</i> <a href="eflg_CompareKeyOr.FIND-FUNC">eflg_CompareKeyOr</a> (<i>crtx_Uint32_t</i> WaitKey_a,                                       <i>crtx_Uint32_t</i> ArgKey_a);</font><font color="#6920ac">/* create event flags promitive */</font><font size="+1"><i>eflg_Events_t</i> *<b><font color="azure1"><a name="eflg_Create">eflg_Create</a></font></b>(    <i>crtx_Mask_t</i> InitFlags_a,    <i>eflg_Type_t</i> Type_a,    <i>crtx_Mask_t</i> HisrMask_a){</font><font color="#6920ac">/********************* *  LOCAL VARIABLES  * *********************/</font>    <i>eflg_Events_t</i>       *pEvents;       <font color="#6920ac">/* event flags descriptor */</font>    <i>mntr_Attr_t</i>         MonitorAttr;    <font color="#6920ac">/* monitor attributes */</font>    <i>eflg_CondCreate_t</i>   CondCreate;     <font color="#6920ac">/* condition create routine */</font><font color="#6920ac">/********************* *  PROCEDURE LOGIC  * *********************/</font>    pEvents = (<i>eflg_Events_t</i>*)<a href="dmem_Alloc.FIND-FUNC">dmem_Alloc</a>(<a href="DMEM_STD_SEGMENT.FIND-DEF">DMEM_STD_SEGMENT</a>,                                         <i>sizeof</i>(<i>eflg_Events_t</i>),                                         <i>sizeof</i>(<i>crtx_Uint32_t</i>));    <b>if</b> ((<i>crtx_Void_t</i>*)pEvents == <a href="DMEM_ILLEGAL.FIND-DEF">DMEM_ILLEGAL</a>)        <a href="CRTX_EXCEPTION.FIND-DEF">CRTX_EXCEPTION</a> MemAllocFailed_Exc;    <b>if</b> (Type_a == eflg_TaskEvents)    {        <font color="#6920ac">/* event flags will be used for inter-task synchronisation */</font>        pEvents-&gt;Enter       = (<i>elfg_Enter_t</i>)mutx_Lock;        pEvents-&gt;Exit        = (<i>elfg_Exit_t</i>)mutx_Unlock;        pEvents-&gt;Signal      = (<i>elfg_Signal_t</i>)mutx_BroadcastByKey;        pEvents-&gt;Wait        = (<i>elfg_Wait_t</i>)mutx_Wait;        pEvents-&gt;MutexDelete = (<i>eflg_MutexDelete_t</i>)mutx_Delete;        pEvents-&gt;CondDelete  = (<i>eflg_CondDelete_t</i>)mutx_CondDelete;        CondCreate = (<i>eflg_CondCreate_t</i>)mutx_CondCreate;        <b>if</b> ((pEvents-&gt;Mutex=(<i>eflg_Mutex_t</i>)<a href="mutx_Create.FIND-FUNC">mutx_Create</a>(<a href="CRTX_NULL.FIND-DEF">CRTX_NULL</a>, <a href="CRTX_NULL.FIND-DEF">CRTX_NULL</a>))            == <a href="CRTX_NULL.FIND-DEF">CRTX_NULL</a>)            <a href="CRTX_EXCEPTION.FIND-DEF">CRTX_EXCEPTION</a> MutexCreateFailed_Exc;    }    <b>else</b> <b>if</b> (Type_a == eflg_HisrEvents)    {        <font color="#6920ac">/* event flags will be used to synchronise  tasks and software         * interrupt service routines */</font>        pEvents-&gt;Enter       = (<i>elfg_Enter_t</i>)mntr_Enter;        pEvents-&gt;Exit        = (<i>elfg_Exit_t</i>)mntr_Exit;        pEvents-&gt;Signal      = (<i>elfg_Signal_t</i>)mntr_BroadcastByKey;        pEvents-&gt;Wait        = (<i>elfg_Wait_t</i>)mntr_Wait;        pEvents-&gt;MutexDelete = (<i>eflg_MutexDelete_t</i>)mntr_Delete;        pEvents-&gt;CondDelete  = (<i>eflg_CondDelete_t</i>)mntr_CondDelete;        CondCreate = (<i>eflg_CondCreate_t</i>)mntr_CondCreate;        MonitorAttr = mntr_AttrDefault_g;        MonitorAttr.DeviceFlag = <a href="CRTX_TRUE.FIND-DEF">CRTX_TRUE</a>;        MonitorAttr.DisableMask = HisrMask_a;        <b>if</b> ((pEvents-&gt;Mutex=(<i>eflg_Mutex_t</i>)<a href="mntr_Create.FIND-FUNC">mntr_Create</a>(<a href="CRTX_NULL.FIND-DEF">CRTX_NULL</a>,&amp;MonitorAttr))            == <a href="CRTX_NULL.FIND-DEF">CRTX_NULL</a>)            <a href="CRTX_EXCEPTION.FIND-DEF">CRTX_EXCEPTION</a> MutexCreateFailed_Exc;    }    <b>else</b>         <a href="CRTX_EXCEPTION.FIND-DEF">CRTX_EXCEPTION</a> InvalidArgs_Exc;    <font color="#6920ac">/* Create AND condition object */</font>    <b>if</b> ((pEvents-&gt;And = <a href="CondCreate.FIND-FUNC">CondCreate</a>(<a href="CRTX_NULL.FIND-DEF">CRTX_NULL</a>, pEvents-&gt;Mutex, <a href="CRTX_NULL.FIND-DEF">CRTX_NULL</a>))        == <a href="CRTX_NULL.FIND-DEF">CRTX_NULL</a>)        <a href="CRTX_EXCEPTION.FIND-DEF">CRTX_EXCEPTION</a> Condition_AND_CreateFailed_Exc;    <font color="#6920ac">/* Create OR condition object */</font>    <b>if</b> ((pEvents-&gt;Or = <a href="CondCreate.FIND-FUNC">CondCreate</a>(<a href="CRTX_NULL.FIND-DEF">CRTX_NULL</a>, pEvents-&gt;Mutex, <a href="CRTX_NULL.FIND-DEF">CRTX_NULL</a>))        == <a href="CRTX_NULL.FIND-DEF">CRTX_NULL</a>)        <a href="CRTX_EXCEPTION.FIND-DEF">CRTX_EXCEPTION</a> Condition_OR_CreateFailed_Exc;    pEvents-&gt;Flags = InitFlags_a;    <b>return</b> pEvents;<font color="#6920ac">/************************ *  EXCEPTION HANDLING  * ************************/</font><font color="blue">Condition_OR_CreateFailed_Exc:</font>    pEvents-&gt;<a href="CondDelete.FIND-FUNC">CondDelete</a>(pEvents-&gt;And);    <font color="#6920ac">/* FALL-THROUGH */</font><font color="blue">Condition_AND_CreateFailed_Exc:</font>    pEvents-&gt;<a href="MutexDelete.FIND-FUNC">MutexDelete</a>(pEvents-&gt;Mutex);    <font color="#6920ac">/* FALL-THROUGH */</font><font color="blue">InvalidArgs_Exc:</font>    <font color="#6920ac">/* FALL-THROUGH */</font><font color="blue">MutexCreateFailed_Exc:</font>    <a href="dmem_Free.FIND-FUNC">dmem_Free</a>(<a href="DMEM_STD_SEGMENT.FIND-DEF">DMEM_STD_SEGMENT</a>, (<i>crtx_Void_t</i>*)pEvents,               <i>sizeof</i>(<i>eflg_Events_t</i>));    <font color="#6920ac">/* FALL-THROUGH */</font><font color="blue">MemAllocFailed_Exc:</font>    <b>return</b> <a href="CRTX_NULL.FIND-DEF">CRTX_NULL</a>;}<font color="#6920ac">/* delete event flags promitive */</font><font size="+1"><i>crtx_Void_t</i> <b><font color="azure1"><a name="eflg_Delete">eflg_Delete</a></font></b>(<i>eflg_Events_t</i> *pEvents_a){</font><font color="#6920ac">/********************* *  LOCAL VARIABLES  * *********************/</font>    <font color="#6920ac">/* None */</font><font color="#6920ac">/********************* *  PROCEDURE LOGIC  * *********************/</font>    pEvents_a-&gt;<a href="CondDelete.FIND-FUNC">CondDelete</a>(pEvents_a-&gt;And);    pEvents_a-&gt;<a href="CondDelete.FIND-FUNC">CondDelete</a>(pEvents_a-&gt;Or);    pEvents_a-&gt;<a href="MutexDelete.FIND-FUNC">MutexDelete</a>(pEvents_a-&gt;Mutex);        <b>return</b>;<font color="#6920ac">/************************ *  EXCEPTION HANDLING  * ************************/</font>    <font color="#6920ac">/* None */</font>}<font color="#6920ac">/* set event flags */</font><font size="+1"><i>crtx_Void_t</i> <b><font color="azure1"><a name="eflg_Set">eflg_Set</a></font></b>(    <i>eflg_Events_t</i>   *pEvents_a,     <i>crtx_Mask_t</i>     Flags_a){</font><font color="#6920ac">/********************* *  LOCAL VARIABLES  * *********************/</font>    <font color="#6920ac">/* None */</font><font color="#6920ac">/********************* *  PROCEDURE LOGIC  * *********************/</font>    pEvents_a-&gt;<a href="Enter.FIND-FUNC">Enter</a>(pEvents_a-&gt;Mutex);    pEvents_a-&gt;Flags |= Flags_a;    pEvents_a-&gt;<a href="Signal.FIND-FUNC">Signal</a>(pEvents_a-&gt;And, eflg_CompareKeyAnd, pEvents_a-&gt;Flags);    pEvents_a-&gt;<a href="Signal.FIND-FUNC">Signal</a>(pEvents_a-&gt;Or,  eflg_CompareKeyOr,  pEvents_a-&gt;Flags);    pEvents_a-&gt;<a href="Exit.FIND-FUNC">Exit</a>(pEvents_a-&gt;Mutex);    <b>return</b>;<font color="#6920ac">/************************ *  EXCEPTION HANDLING  * ************************/</font>    <font color="#6920ac">/* None */</font>}<font color="#6920ac">/* clear event flags */</font><font size="+1"><i>crtx_Mask_t</i> <b><font color="azure1"><a name="eflg_Clear">eflg_Clear</a></font></b>(    <i>eflg_Events_t</i> *pEvents_a,     <i>crtx_Mask_t</i> Flags_a){</font><font color="#6920ac">/********************* *  LOCAL VARIABLES  * *********************/</font>    <i>crtx_Mask_t</i> Flags;<font color="#6920ac">/********************* *  PROCEDURE LOGIC  * *********************/</font>    pEvents_a-&gt;<a href="Enter.FIND-FUNC">Enter</a>(pEvents_a-&gt;Mutex);    Flags = pEvents_a-&gt;Flags;    pEvents_a-&gt;Flags &amp;= ~Flags_a;    pEvents_a-&gt;<a href="Exit.FIND-FUNC">Exit</a>(pEvents_a-&gt;Mutex);    <b>return</b> Flags &amp; Flags_a;<font color="#6920ac">/************************ *  EXCEPTION HANDLING  * ************************/</font>    <font color="#6920ac">/* None */</font>}<font color="#6920ac">/* wait for ALL the specified events */</font><font size="+1"><i>crtx_Bool_t</i> <b><font color="azure1"><a name="eflg_All">eflg_All</a></font></b>(    <i>eflg_Events_t</i> *pEvents_a,     <i>crtx_Mask_t</i> Flags_a,    <i>crtx_Mask_t</i> *pReceived_a,    <i>tick_Timeout_t</i> *pTimeout_a){</font><font color="#6920ac">/********************* *  LOCAL VARIABLES  * *********************/</font>    <font color="#6920ac">/* None */</font><font color="#6920ac">/********************* *  PROCEDURE LOGIC  * *********************/</font>    pEvents_a-&gt;<a href="Enter.FIND-FUNC">Enter</a>(pEvents_a-&gt;Mutex);    <b>while</b>((pEvents_a-&gt;Flags &amp; Flags_a) != Flags_a)    {        <b>if</b> (!pEvents_a-&gt;<a href="Wait.FIND-FUNC">Wait</a>(pEvents_a-&gt;And, pTimeout_a, Flags_a))        {            pEvents_a-&gt;<a href="Exit.FIND-FUNC">Exit</a>(pEvents_a-&gt;Mutex);            <b>return</b> <a href="CRTX_FALSE.FIND-DEF">CRTX_FALSE</a>;        }    }    <b>if</b> (pReceived_a)        *pReceived_a = pEvents_a-&gt;Flags &amp; Flags_a;    pEvents_a-&gt;<a href="Exit.FIND-FUNC">Exit</a>(pEvents_a-&gt;Mutex);    <b>return</b> <a href="CRTX_TRUE.FIND-DEF">CRTX_TRUE</a>;<font color="#6920ac">/************************ *  EXCEPTION HANDLING  * ************************/</font>    <font color="#6920ac">/* None */</font>}<font color="#6920ac">/* wait for ANY of the specified events */</font><font size="+1"><i>crtx_Bool_t</i> <b><font color="azure1"><a name="eflg_Any">eflg_Any</a></font></b>(    <i>eflg_Events_t</i> *pEvents_a,     <i>crtx_Mask_t</i> Flags_a,    <i>crtx_Mask_t</i> *pReceived_a,    <i>tick_Timeout_t</i> *pTimeout_a){</font><font color="#6920ac">/********************* *  LOCAL VARIABLES  * *********************/</font>    <font color="#6920ac">/* None */</font><font color="#6920ac">/********************* *  PROCEDURE LOGIC  * *********************/</font>    pEvents_a-&gt;<a href="Enter.FIND-FUNC">Enter</a>(pEvents_a-&gt;Mutex);    <b>while</b>((pEvents_a-&gt;Flags &amp; Flags_a) == 0)    {        <b>if</b> (!pEvents_a-&gt;<a href="Wait.FIND-FUNC">Wait</a>(pEvents_a-&gt;Or, pTimeout_a, Flags_a))        {            pEvents_a-&gt;<a href="Exit.FIND-FUNC">Exit</a>(pEvents_a-&gt;Mutex);            <b>return</b> <a href="CRTX_FALSE.FIND-DEF">CRTX_FALSE</a>;        }    }    <b>if</b> (pReceived_a)        *pReceived_a = pEvents_a-&gt;Flags &amp; Flags_a;    pEvents_a-&gt;<a href="Exit.FIND-FUNC">Exit</a>(pEvents_a-&gt;Mutex);    <b>return</b> <a href="CRTX_TRUE.FIND-DEF">CRTX_TRUE</a>;<font color="#6920ac">/************************ *  EXCEPTION HANDLING  * ************************/</font>    <font color="#6920ac">/* None */</font>}<font size="+1"><i>static</i> <i>crtx_Bool_t</i> <b><font color="azure1"><a name="eflg_CompareKeyAnd">eflg_CompareKeyAnd</a></font></b>(    <i>crtx_Uint32_t</i> WaitKey_a,    <i>crtx_Uint32_t</i> ArgKey_a){</font><font color="#6920ac">/********************* *  LOCAL VARIABLES  * *********************/</font>    <font color="#6920ac">/* None */</font><font color="#6920ac">/********************* *  PROCEDURE LOGIC  * *********************/</font>    <b>return</b> ((ArgKey_a &amp; WaitKey_a) == WaitKey_a) ? <a href="CRTX_TRUE.FIND-DEF">CRTX_TRUE</a> : <a href="CRTX_FALSE.FIND-DEF">CRTX_FALSE</a>;<font color="#6920ac">/************************ *  EXCEPTION HANDLING  * ************************/</font>    <font color="#6920ac">/* None */</font>}<font size="+1"><i>static</i> <i>crtx_Bool_t</i> <b><font color="azure1"><a name="eflg_CompareKeyOr">eflg_CompareKeyOr</a></font></b>(    <i>crtx_Uint32_t</i> WaitKey_a,     <i>crtx_Uint32_t</i> ArgKey_a){</font><font color="#6920ac">/********************* *  LOCAL VARIABLES  * *********************/</font>    <font color="#6920ac">/* None */</font><font color="#6920ac">/********************* *  PROCEDURE LOGIC  * *********************/</font>    <b>return</b> ((ArgKey_a &amp; WaitKey_a) != 0) ? <a href="CRTX_TRUE.FIND-DEF">CRTX_TRUE</a> : <a href="CRTX_FALSE.FIND-DEF">CRTX_FALSE</a>;<font color="#6920ac">/************************ *  EXCEPTION HANDLING  * ************************/</font>    <font color="#6920ac">/* None */</font>}</pre></BODY></HTML>

⌨️ 快捷键说明

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