📄 efl_core.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->Enter = (<i>elfg_Enter_t</i>)mutx_Lock; pEvents->Exit = (<i>elfg_Exit_t</i>)mutx_Unlock; pEvents->Signal = (<i>elfg_Signal_t</i>)mutx_BroadcastByKey; pEvents->Wait = (<i>elfg_Wait_t</i>)mutx_Wait; pEvents->MutexDelete = (<i>eflg_MutexDelete_t</i>)mutx_Delete; pEvents->CondDelete = (<i>eflg_CondDelete_t</i>)mutx_CondDelete; CondCreate = (<i>eflg_CondCreate_t</i>)mutx_CondCreate; <b>if</b> ((pEvents->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->Enter = (<i>elfg_Enter_t</i>)mntr_Enter; pEvents->Exit = (<i>elfg_Exit_t</i>)mntr_Exit; pEvents->Signal = (<i>elfg_Signal_t</i>)mntr_BroadcastByKey; pEvents->Wait = (<i>elfg_Wait_t</i>)mntr_Wait; pEvents->MutexDelete = (<i>eflg_MutexDelete_t</i>)mntr_Delete; pEvents->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->Mutex=(<i>eflg_Mutex_t</i>)<a href="mntr_Create.FIND-FUNC">mntr_Create</a>(<a href="CRTX_NULL.FIND-DEF">CRTX_NULL</a>,&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->And = <a href="CondCreate.FIND-FUNC">CondCreate</a>(<a href="CRTX_NULL.FIND-DEF">CRTX_NULL</a>, pEvents->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->Or = <a href="CondCreate.FIND-FUNC">CondCreate</a>(<a href="CRTX_NULL.FIND-DEF">CRTX_NULL</a>, pEvents->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->Flags = InitFlags_a; <b>return</b> pEvents;<font color="#6920ac">/************************ * EXCEPTION HANDLING * ************************/</font><font color="blue">Condition_OR_CreateFailed_Exc:</font> pEvents-><a href="CondDelete.FIND-FUNC">CondDelete</a>(pEvents->And); <font color="#6920ac">/* FALL-THROUGH */</font><font color="blue">Condition_AND_CreateFailed_Exc:</font> pEvents-><a href="MutexDelete.FIND-FUNC">MutexDelete</a>(pEvents->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-><a href="CondDelete.FIND-FUNC">CondDelete</a>(pEvents_a->And); pEvents_a-><a href="CondDelete.FIND-FUNC">CondDelete</a>(pEvents_a->Or); pEvents_a-><a href="MutexDelete.FIND-FUNC">MutexDelete</a>(pEvents_a->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-><a href="Enter.FIND-FUNC">Enter</a>(pEvents_a->Mutex); pEvents_a->Flags |= Flags_a; pEvents_a-><a href="Signal.FIND-FUNC">Signal</a>(pEvents_a->And, eflg_CompareKeyAnd, pEvents_a->Flags); pEvents_a-><a href="Signal.FIND-FUNC">Signal</a>(pEvents_a->Or, eflg_CompareKeyOr, pEvents_a->Flags); pEvents_a-><a href="Exit.FIND-FUNC">Exit</a>(pEvents_a->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-><a href="Enter.FIND-FUNC">Enter</a>(pEvents_a->Mutex); Flags = pEvents_a->Flags; pEvents_a->Flags &= ~Flags_a; pEvents_a-><a href="Exit.FIND-FUNC">Exit</a>(pEvents_a->Mutex); <b>return</b> Flags & 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-><a href="Enter.FIND-FUNC">Enter</a>(pEvents_a->Mutex); <b>while</b>((pEvents_a->Flags & Flags_a) != Flags_a) { <b>if</b> (!pEvents_a-><a href="Wait.FIND-FUNC">Wait</a>(pEvents_a->And, pTimeout_a, Flags_a)) { pEvents_a-><a href="Exit.FIND-FUNC">Exit</a>(pEvents_a->Mutex); <b>return</b> <a href="CRTX_FALSE.FIND-DEF">CRTX_FALSE</a>; } } <b>if</b> (pReceived_a) *pReceived_a = pEvents_a->Flags & Flags_a; pEvents_a-><a href="Exit.FIND-FUNC">Exit</a>(pEvents_a->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-><a href="Enter.FIND-FUNC">Enter</a>(pEvents_a->Mutex); <b>while</b>((pEvents_a->Flags & Flags_a) == 0) { <b>if</b> (!pEvents_a-><a href="Wait.FIND-FUNC">Wait</a>(pEvents_a->Or, pTimeout_a, Flags_a)) { pEvents_a-><a href="Exit.FIND-FUNC">Exit</a>(pEvents_a->Mutex); <b>return</b> <a href="CRTX_FALSE.FIND-DEF">CRTX_FALSE</a>; } } <b>if</b> (pReceived_a) *pReceived_a = pEvents_a->Flags & Flags_a; pEvents_a-><a href="Exit.FIND-FUNC">Exit</a>(pEvents_a->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 & 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 & 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 + -