rdwr.c

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

C
320
字号
<HTML><HEAD><TITLE>/home/asysweb/public_html/cortex/examples/exmpl8/src/rdwr.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="cortex.h.FIND-INC"><font color="blue">"cortex.h"</font></a><b><font color='DarkGreen'>#include</font></b> <a href="plt_defs.h.FIND-INC"><font color="blue">"plt_defs.h"</font></a><b><font color='DarkGreen'>#include</font></b> <a href="prn_defs.h.FIND-INC"><font color="blue">"prn_defs.h"</font></a><b><font color='DarkGreen'>#include</font></b> <a href="stdlib.h.FIND-INC"><font color="blue">"stdlib.h"</font></a><font color="#6920ac">/* the number of readers */</font><b><font color='DarkGreen'>#ifndef</font></b><font color="maroon"> RDWR_READERS_NUMBER</font><b><font color='DarkGreen'># define</font></b> <font color="maroon"><a name="RDWR_READERS_NUMBER">RDWR_READERS_NUMBER</a></font> 5<b><font color='DarkGreen'>#endif</font></b><font color="maroon"></font><font color="#6920ac">/* the number of readers must not be less than 1 */</font><b><font color='DarkGreen'>#if</font></b><font color="maroon"> (RDWR_READERS_NUMBER &lt; 1)</font><b><font color='DarkGreen'># error</font></b><font color="maroon"> Wrong number of readers</font><b><font color='DarkGreen'># undef</font></b><font color="maroon"> RDWR_READERS_NUMBER</font><b><font color='DarkGreen'># define</font></b> <font color="maroon"><a name="RDWR_READERS_NUMBER">RDWR_READERS_NUMBER</a></font> 1<b><font color='DarkGreen'>#endif</font></b><font color="maroon"></font><font color="#6920ac">/* the number of writers */</font><b><font color='DarkGreen'>#ifndef</font></b><font color="maroon"> RDWR_WRITERS_NUMBER</font><b><font color='DarkGreen'># define</font></b> <font color="maroon"><a name="RDWR_WRITERS_NUMBER">RDWR_WRITERS_NUMBER</a></font> 3<b><font color='DarkGreen'>#endif</font></b><font color="maroon"></font><font color="#6920ac">/* the number of writers must not be less than 1 */</font><b><font color='DarkGreen'>#if</font></b><font color="maroon"> (RDWR_WRITERS_NUMBER &lt; 1)</font><b><font color='DarkGreen'># error</font></b><font color="maroon"> Wrong number of writers</font><b><font color='DarkGreen'># undef</font></b><font color="maroon"> RDWR_WRITERS_NUMBER</font><b><font color='DarkGreen'># define</font></b> <font color="maroon"><a name="RDWR_WRITERS_NUMBER">RDWR_WRITERS_NUMBER</a></font> 1<b><font color='DarkGreen'>#endif</font></b><font color="maroon"></font><font color="#6920ac">/* time to print trace */</font><b><font color='DarkGreen'>#define</font></b> <font color="maroon"><a name="RDWR_PRINT_TIME">RDWR_PRINT_TIME</a></font>         TICK_SECS_TO_TICKS(5)<font color="#6920ac">/* the sleep constant for readers */</font><b><font color='DarkGreen'>#define</font></b> <font color="maroon"><a name="RDWR_READER_SLEEP_CONST">RDWR_READER_SLEEP_CONST</a></font> 200<font color="#6920ac">/* the sleep constant for writers */</font><b><font color='DarkGreen'>#define</font></b> <font color="maroon"><a name="RDWR_WRITER_SLEEP_CONST">RDWR_WRITER_SLEEP_CONST</a></font> 100<font color="#6920ac">/* read constant */</font><b><font color='DarkGreen'>#define</font></b> <font color="maroon"><a name="RDWR_READ_TIME">RDWR_READ_TIME</a></font>          30<font color="#6920ac">/* write constant */</font><b><font color='DarkGreen'>#define</font></b> <font color="maroon"><a name="RDWR_WRITE_TIME">RDWR_WRITE_TIME</a></font>         50<font color="#6920ac">/* structure to collect info about readers or writers */</font><i><a name="rdwr_Info_t">typedef</a></i> <i>struct</i>{    <i>crtx_Int32_t</i>    SleepTime;    <i>crtx_Int32_t</i>    AccessTime;    <i>crtx_Int32_t</i>    Cycles;} <i><font color='DarkBlue'>rdwr_Info_t</font></i>;<font color="#6920ac">/* info about readers */</font><i>rdwr_Info_t</i> rdwr_RInfo[<a href="#RDWR_READERS_NUMBER">RDWR_READERS_NUMBER</a>];<font color="#6920ac">/* info about writers */</font><i>rdwr_Info_t</i> rdwr_WInfo[<a href="#RDWR_READERS_NUMBER">RDWR_READERS_NUMBER</a>];<font color="#6920ac">/* a number of readers reading data the same time */</font><i>crtx_Int_t</i>          ReadersCounter;<font color="#6920ac">/* the mutex control block to protect data to be read and read the */</font><font color="#6920ac">/* same time */</font><i>mutx_Mutex_t</i>        *pRdwrMutex;<font color="#6920ac">/* the condition on mutex to activate writers when there is no a reader */</font><font color="#6920ac">/* reading data */</font><i>mutx_Condition_t</i>    *pRdwrCondition;<font color="#6920ac">/* process/task reader */</font><font size="+1"><i>crtx_Void_t</i> <b><font color="azure1"><a name="rdwr_Reader">rdwr_Reader</a></font></b>(<i>int</i> ReaderNum_a){</font>    <i>crtx_Int32_t</i>    DeltTime;        <b>while</b> ( 1 )    {        rdwr_RInfo[ReaderNum_a].Cycles++;        <font color="#6920ac">/* a reader goes to sleep a bit */</font>        DeltTime = <a href="rand.FIND-FUNC">rand</a>()%(<a href="#RDWR_READER_SLEEP_CONST">RDWR_READER_SLEEP_CONST</a>);        <a href="task_Sleep.FIND-FUNC">task_Sleep</a>(<a href="TICK_MS_TO_TICKS.FIND-DEF">TICK_MS_TO_TICKS</a>(DeltTime));        rdwr_RInfo[ReaderNum_a].SleepTime += DeltTime;        <font color="#6920ac">/* a reader takes the mutex to increase the number of readers */</font>        <font color="#6920ac">/* reading data */</font>        <a href="mutx_Lock.FIND-FUNC">mutx_Lock</a>(pRdwrMutex);                ReadersCounter++;        <a href="mutx_Unlock.FIND-FUNC">mutx_Unlock</a>(pRdwrMutex);        <font color="#6920ac">/* a reader reads a bit */</font>        DeltTime = <a href="rand.FIND-FUNC">rand</a>()%(<a href="#RDWR_READ_TIME">RDWR_READ_TIME</a>);        <a href="task_Sleep.FIND-FUNC">task_Sleep</a>(<a href="TICK_MS_TO_TICKS.FIND-DEF">TICK_MS_TO_TICKS</a>(DeltTime));        rdwr_RInfo[ReaderNum_a].AccessTime += DeltTime;        <font color="#6920ac">/* a reader takes the mutex to decrease the number of readers */</font>        <font color="#6920ac">/* reading data and to signal to writers that they can */</font>        <font color="#6920ac">/* write new data if a reader was last */</font>        <a href="mutx_Lock.FIND-FUNC">mutx_Lock</a>(pRdwrMutex);                ReadersCounter--;        <font color="#6920ac">/* a reader signales to writers if it was the last reader of data */</font>        <b>if</b> (ReadersCounter == 0)        {            <a href="mutx_Signal.FIND-FUNC">mutx_Signal</a>(pRdwrCondition);        }        <a href="mutx_Unlock.FIND-FUNC">mutx_Unlock</a>(pRdwrMutex);    }}<font color="#6920ac">/* process/task writer */</font><font size="+1"><i>crtx_Void_t</i> <b><font color="azure1"><a name="rdwr_Writer">rdwr_Writer</a></font></b>(<i>int</i> WriterNum_a){</font>    <i>crtx_Int32_t</i>    DeltTime;        <b>while</b> ( 1 )    {        rdwr_WInfo[WriterNum_a].Cycles++;        <font color="#6920ac">/* a writer sleeps a bit */</font>        DeltTime = <a href="rand.FIND-FUNC">rand</a>()%(<a href="#RDWR_WRITER_SLEEP_CONST">RDWR_WRITER_SLEEP_CONST</a>);        <a href="task_Sleep.FIND-FUNC">task_Sleep</a>(<a href="TICK_MS_TO_TICKS.FIND-DEF">TICK_MS_TO_TICKS</a>(DeltTime));        rdwr_WInfo[WriterNum_a].SleepTime += DeltTime;        <font color="#6920ac">/* a writer locks the mutex and waits on condition until */</font>        <font color="#6920ac">/* possibility to write data */</font>        <a href="mutx_Lock.FIND-FUNC">mutx_Lock</a>(pRdwrMutex);                <b>while</b> ( 1 )        {            <b>if</b> (ReadersCounter == 0)            {                <font color="#6920ac">/* a writer is the only owner of data */</font>                <b>break</b>;            }            <a href="mutx_Wait.FIND-FUNC">mutx_Wait</a>(pRdwrCondition, <a href="CRTX_NULL.FIND-DEF">CRTX_NULL</a>);            <font color="#6920ac">/* despite a reader got a condition it should */</font>            <font color="#6920ac">/* check that condition was not changed, therefore */</font>            <font color="#6920ac">/* repeat testing of ReadersCounter on 0 */</font>        }

⌨️ 快捷键说明

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