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 < 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 < 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 + -
显示快捷键?