bit_core.c

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

C
920
字号
<HTML><HEAD><TITLE>/home/asysweb/public_html/cortex/kernel/src/bit_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 * *      bit_core.c * * SYSTEM COMPONENT * *      Bit Vector * * DESCRIPTION * *      Core services for Bit Vector component * * SERVICES * *      vbit_Create  - allocate and initialise bit vector *      vbit_Destroy - deallocate and clear bit vector created by *                     vbit_Create service *      vbit_ClrAll  - set all bits to zero *      vbit_Clear   - set bits within range to zero *      vbit_SetAll  - set all bits to one *      vbit_Set     - set bits within range to one *      vbit_NotAll  - inverts all bits *      vbit_Not     - inverts bits within range *      vbit_Get     - return specified bit from bit vector *      vbit_Put     - set specified bit and retutn the previous value * * SCCS HISTORY * *      @(#)bit_core.c  1.8, 01/25/99, 00:30:13 * * AUTHOR * *      Vadim N. Azarovsky * * CREATED * *      22-Mar-1997         by Vadim N. Azarovsky * * REVISION HISTORY * *      NAME                DATE                    REMARKS * **************************************************************************/</font><b><font color='DarkGreen'>#include</font></b> <a href="bit_defs.h.FIND-INC"><font color="blue">"bit_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><a href="CRTX_PRIVATE.FIND-DEF">CRTX_PRIVATE</a> <i>vbit_Unit_t</i> lsbMask[] = {    0x01, 0x03, 0x07, 0x0f, 0x1f, 0x3f, 0x7f, 0xff<b><font color='DarkGreen'>#if</font></b><font color="maroon"> VBIT_BTU&gt;8</font>   ,0x01ff, 0x03ff, 0x07ff, 0x0fff, 0x1fff, 0x3fff, 0x7fff, 0xffff<b><font color='DarkGreen'>#endif</font></b><font color="maroon"> <font color="#6920ac">/* VBIT_BTU&gt;8 */</font></font><b><font color='DarkGreen'>#if</font></b><font color="maroon"> VBIT_BTU&gt;16</font>   ,0x0001ffffUL, 0x0003ffffUL, 0x0007ffffUL, 0x000fffffUL   ,0x001fffffUL, 0x003fffffUL, 0x007fffffUL, 0x00ffffffUL   ,0x01ffffffUL, 0x03ffffffUL, 0x07ffffffUL, 0x0fffffffUL   ,0x1fffffffUL, 0x3fffffffUL, 0x7fffffffUL, 0xffffffffUL<b><font color='DarkGreen'>#endif</font></b><font color="maroon"> <font color="#6920ac">/* VBIT_BTU&gt;16 */</font></font><b><font color='DarkGreen'>#if</font></b><font color="maroon"> VBIT_BTU&gt;32</font><b><font color='DarkGreen'># error</font></b><font color="maroon"> <font color="DarkGreen">"bit unit storage too large"</font></font><b><font color='DarkGreen'>#endif</font></b><font color="maroon"> <font color="#6920ac">/* VBIT_BTU&gt;32 */</font></font>};<a href="CRTX_PRIVATE.FIND-DEF">CRTX_PRIVATE</a> <i>vbit_Unit_t</i> msbMask[] = {<b><font color='DarkGreen'>#if</font></b><font color="maroon"> VBIT_BTU&lt;=8</font>    0xff, 0xfe, 0xfc, 0xf8, 0xf0, 0xe0, 0xc0, 0x80<b><font color='DarkGreen'>#elif</font></b><font color="maroon"> VBIT_BTU&lt;=16</font>    0xffff, 0xfffe, 0xfffc, 0xfff8, 0xfff0, 0xffe0, 0xffc0, 0xff80,    0xff00, 0xfe00, 0xfc00, 0xf800, 0xf000, 0xe000, 0xc000, 0x8000<b><font color='DarkGreen'>#elif</font></b><font color="maroon"> VBIT_BTU&lt;=32</font>    0xffffffffUL, 0xfffffffeUL, 0xfffffffcUL, 0xfffffff8UL,    0xfffffff0UL, 0xffffffe0UL, 0xffffffc0UL, 0xffffff80UL,    0xffffff00UL, 0xfffffe00UL, 0xfffffc00UL, 0xfffff800UL,    0xfffff000UL, 0xffffe000UL, 0xffffc000UL, 0xffff8000UL,    0xffff0000UL, 0xfffe0000UL, 0xfffc0000UL, 0xfff80000UL,    0xfff00000UL, 0xffe00000UL, 0xffc00000UL, 0xff800000UL,    0xff000000UL, 0xfe000000UL, 0xfc000000UL, 0xf8000000UL,    0xf0000000UL, 0xe0000000UL, 0xc0000000UL, 0x80000000UL<b><font color='DarkGreen'>#else</font></b><font color="maroon"></font><b><font color='DarkGreen'># error</font></b><font color="maroon"> <font color="DarkGreen">"bit unit storage too large"</font></font><b><font color='DarkGreen'>#endif</font></b><font color="maroon"> <font color="#6920ac">/* VBIT_BTU&gt;32 */</font></font>};<font color="#6920ac">/************************************************************************** * * SERVICE NAME * *      vbit_Create * * SYNOPSIS * *      #include "bit_defs.h" *      vbit_t   *pVbit; *      pVbit = vbit_Create(NUM_OF_BITS,CRTX_NULL,CRTX_NULL,CRTX_NULL); * * DESCRIPTION * *      Creates and returns a new bit vector of Length_a bits. *      All bits set to zero. * * ARGUMENTS * *      o number of bits in the vector; *      o pointer to optional vector control block *      o pointer to optional bit array *      o vector attributes * * RETURN VALUE * *      Pointer to created bit vector control block. Memory *      allocation exception can be raised if there is no memory *      avaialable * * USAGE * *      o system level *      o application level; * * CONSTAINS * *      not allowed from within interrupt sevice routine; * * AUTOR * *    Vadim N. Azarovsky * * REVISION HISTORY * *      NAME                DATE                    REMARKS *      VA                  22-Mar-1997             Created initial version * **************************************************************************/</font><font size="+1">vbit_t *<b><font color="azure1"><a name="vbit_Create">vbit_Create</a></font></b>(    <i>crtx_Int_t</i>  Length_a,       <font color="#6920ac">/* number of bits */</font>    vbit_t      *pVbit_a,       <font color="#6920ac">/* bit vector control block */</font>    <i>vbit_Unit_t</i> *pUnits_a,      <font color="#6920ac">/* storage buffer */</font>    <i>vbit_Attr_t</i> *pAttr_a        <font color="#6920ac">/* bit vector attributes */</font>){</font><font color="#6920ac">/********************* *  LOCAL VARIABLES  * *********************/</font>    vbit_t      *pVbit;    <i>vbit_Unit_t</i> *pUnits;    <i>crtx_Int_t</i>  i;<font color="#6920ac">/********************* *  PROCEDURE LOGIC  * *********************/</font>    <font color="#6920ac">/* this asert may only occure if ENVI_VBIT_BITS_PER_UNIT incorect */</font>    <a href="CRTX_ASSERT.FIND-DEF">CRTX_ASSERT</a>(<a href="VBIT_BPU.FIND-DEF">VBIT_BPU</a>&lt;=<i>sizeof</i>(<i>vbit_Unit_t</i>)*<a href="CHAR_BIT.FIND-DEF">CHAR_BIT</a>)    <a href="CRTX_ASSERT.FIND-DEF">CRTX_ASSERT</a>(Length_a)    <b>if</b> (pAttr_a == <a href="CRTX_NULL.FIND-DEF">CRTX_NULL</a>)        pAttr_a = &amp;vbit_AttrDefault_g; <font color="#6920ac">/* use defult attributes */</font>    <font color="#6920ac">/* prepare control block */</font>    <b>if</b> (pVbit_a == <a href="CRTX_NULL.FIND-DEF">CRTX_NULL</a>)    {        <font color="#6920ac">/* allocate memory storage for control block and bit array */</font>        pVbit = (vbit_t*)<a href="dmem_Alloc.FIND-FUNC">dmem_Alloc</a>(pAttr_a-&gt;Segment,                                    <i>sizeof</i>(vbit_t),                                    <i>sizeof</i>(<i>crtx_Unsigned_t</i>));        <b>if</b> ((<i>crtx_Void_t</i>*)pVbit == (<i>crtx_Void_t</i>*)<a href="DMEM_ILLEGAL.FIND-DEF">DMEM_ILLEGAL</a>)        {   <font color="#6920ac">/* memory allocation error */</font>            <a href="CRTX_EXCEPTION.FIND-DEF">CRTX_EXCEPTION</a> MemAllocError1_Exc;        }        pVbit-&gt;Flags = <a href="VBIT_FLAG_INIT.FIND-DEF">VBIT_FLAG_INIT</a> | <a href="VBIT_FLAG_VBIT_ALLOC.FIND-DEF">VBIT_FLAG_VBIT_ALLOC</a>;    }    <b>else</b>    {        pVbit = pVbit_a;        pVbit-&gt;Flags = <a href="VBIT_FLAG_INIT.FIND-DEF">VBIT_FLAG_INIT</a>;    }    <font color="#6920ac">/* prepare bit array */</font>    <b>if</b> (pUnits_a == <a href="CRTX_NULL.FIND-DEF">CRTX_NULL</a>)    {        pUnits = (<i>vbit_Unit_t</i>*)<a href="dmem_Alloc.FIND-FUNC">dmem_Alloc</a>(pAttr_a-&gt;Segment,                                      <a href="VBIT_UNITS.FIND-DEF">VBIT_UNITS</a>(Length_a)*<i>sizeof</i>(<i>vbit_Unit_t</i>),                                      <i>sizeof</i>(<i>crtx_Unsigned_t</i>));        <b>if</b> ((<i>crtx_Void_t</i>*)pUnits == (<i>crtx_Void_t</i>*)<a href="DMEM_ILLEGAL.FIND-DEF">DMEM_ILLEGAL</a>)        {   <font color="#6920ac">/* memory allocation error */</font>            <a href="CRTX_EXCEPTION.FIND-DEF">CRTX_EXCEPTION</a> MemAllocError2_Exc;        }        pVbit-&gt;Flags |= <a href="VBIT_FLAG_ARRAY_ALLOC.FIND-DEF">VBIT_FLAG_ARRAY_ALLOC</a>;    }    <b>else</b>    {        pUnits = pUnits_a;    }    pVbit-&gt;Segment = pAttr_a-&gt;Segment;<b><font color='DarkGreen'>#if</font></b><font color="maroon"> ENVI_CRTX_ERR_CHECK_LEVEL &gt; 0</font>    <a href="VBIT_SET_VBIT_ID.FIND-DEF">VBIT_SET_VBIT_ID</a>(pVbit);<b><font color='DarkGreen'>#endif</font></b><font color="maroon"> <font color="#6920ac">/* ENVI_CRTX_ERR_CHECK_LEVEL &gt; 0 */</font></font>    pVbit-&gt;Length = Length_a;    pVbit-&gt;pUnits = pUnits;    <b>for</b> (i=0; i&lt;<a href="VBIT_UNITS.FIND-DEF">VBIT_UNITS</a>(Length_a); i++)        *pUnits++ = 0;    <b>return</b> pVbit;<font color="blue">MemAllocError2_Exc:</font>         <font color="#6920ac">/* control block allocation error */</font>    <font color="#6920ac">/* FALL-THROUGH */</font><font color="blue">MemAllocError1_Exc:</font>         <font color="#6920ac">/* bit array allocation error */</font>    <b>if</b> (pVbit-&gt;Flags &amp; <a href="VBIT_FLAG_VBIT_ALLOC.FIND-DEF">VBIT_FLAG_VBIT_ALLOC</a>)        <a href="dmem_Free.FIND-FUNC">dmem_Free</a>(pAttr_a-&gt;Segment, (<i>crtx_Void_t</i>*)pVbit, <i>sizeof</i>(vbit_t));    <b>return</b> <a href="CRTX_NULL.FIND-DEF">CRTX_NULL</a>;}<font color="#6920ac">/************************************************************************** * * SERVICE NAME * *      vbit_Destroy * * SYNOPSIS * *      #include "bit_defs.h" *      vbit_t *pBitVector; *      pBitVector=vbit_Create(NUM_OF_BITS, CRTX_NULL, CRTX_NULL, CRTX_NULL); *      . *      . *      vbit_Destroy(&amp;pBitVector); * * DESCRIPTION * *      Destroy bit vector previously created by vbit_Create * * ARGUMENTS * *      o pointer to bit vector control block; * * RETURN VALUE * *      None * * USAGE * *      o system level *      o application level * * CONSTAINS * *      None * * AUTOR * *      Vadim N. Azarovsky * * REVISION HISTORY * *      NAME                DATE                    REMARKS *      VA                  22-Mar-1997             Created initial version * **************************************************************************/</font><font size="+1"><i>crtx_Void_t</i> <b><font color="azure1"><a name="vbit_Destroy">vbit_Destroy</a></font></b>(vbit_t **ppVbit_a){</font><font color="#6920ac">/********************* *  LOCAL VARIABLES  * *********************/</font>    <a href="CRTX_REG_1.FIND-DEF">CRTX_REG_1</a> vbit_t *pVbit;<font color="#6920ac">/********************* *  PROCEDURE LOGIC  * *********************/</font>    <a href="CRTX_ASSERT.FIND-DEF">CRTX_ASSERT</a>(ppVbit_a)    pVbit = *ppVbit_a;    <a href="CRTX_ASSERT.FIND-DEF">CRTX_ASSERT</a>(pVbit)<b><font color='DarkGreen'>#if</font></b><font color="maroon"> ENVI_CRTX_ERR_CHECK_LEVEL &gt; 0</font>    <a href="CRTX_ASSERT.FIND-DEF">CRTX_ASSERT</a>(<a href="VBIT_CHECK_VBIT_ID.FIND-DEF">VBIT_CHECK_VBIT_ID</a>(pVbit))<b><font color='DarkGreen'>#endif</font></b><font color="maroon"> <font color="#6920ac">/* ENVI_CRTX_ERR_CHECK_LEVEL &gt; 0 */</font></font>    <b>if</b> (pVbit-&gt;Flags &amp; <a href="VBIT_FLAG_ARRAY_ALLOC.FIND-DEF">VBIT_FLAG_ARRAY_ALLOC</a>)    {        <a href="dmem_Free.FIND-FUNC">dmem_Free</a>(pVbit-&gt;Segment,                  (<i>crtx_Void_t</i>*)pVbit-&gt;pUnits,

⌨️ 快捷键说明

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