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>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>8 */</font></font><b><font color='DarkGreen'>#if</font></b><font color="maroon"> VBIT_BTU>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>16 */</font></font><b><font color='DarkGreen'>#if</font></b><font color="maroon"> VBIT_BTU>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>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<=8</font> 0xff, 0xfe, 0xfc, 0xf8, 0xf0, 0xe0, 0xc0, 0x80<b><font color='DarkGreen'>#elif</font></b><font color="maroon"> VBIT_BTU<=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<=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>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><=<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 = &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->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->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->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->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->Flags |= <a href="VBIT_FLAG_ARRAY_ALLOC.FIND-DEF">VBIT_FLAG_ARRAY_ALLOC</a>; } <b>else</b> { pUnits = pUnits_a; } pVbit->Segment = pAttr_a->Segment;<b><font color='DarkGreen'>#if</font></b><font color="maroon"> ENVI_CRTX_ERR_CHECK_LEVEL > 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 > 0 */</font></font> pVbit->Length = Length_a; pVbit->pUnits = pUnits; <b>for</b> (i=0; i<<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->Flags & <a href="VBIT_FLAG_VBIT_ALLOC.FIND-DEF">VBIT_FLAG_VBIT_ALLOC</a>) <a href="dmem_Free.FIND-FUNC">dmem_Free</a>(pAttr_a->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(&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 > 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 > 0 */</font></font> <b>if</b> (pVbit->Flags & <a href="VBIT_FLAG_ARRAY_ALLOC.FIND-DEF">VBIT_FLAG_ARRAY_ALLOC</a>) { <a href="dmem_Free.FIND-FUNC">dmem_Free</a>(pVbit->Segment, (<i>crtx_Void_t</i>*)pVbit->pUnits,
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?