📄 嵌入式系统vxworks介绍及编程.htm
字号:
<LI>
<P style="LINE-HEIGHT: 150%">内存共享(Shared Memory),对简单的数据共享而言. </P>
<LI>
<P style="LINE-HEIGHT: 150%">信号量(Semaphore),基本的互斥和同步. </P>
<LI>
<P style="LINE-HEIGHT: 150%">消息队列(Message
queues)和管道(Pipe),单个CPU中,任务间的信息传递. </P>
<LI>
<P style="LINE-HEIGHT: 150%">套结字(Socket)和远程调用(Remote procedure
calls),相对于网络任务间的通信. </P>
<LI>
<P style="LINE-HEIGHT: 150%">信号(Signals),出错处理(Exception handling).
</P></LI></OL></OL></FONT>
<P style="LINE-HEIGHT: 150%"> </P>
<P style="LINE-HEIGHT: 150%"> <B><FONT lang=ZH-CN
face=宋体>内存共享(Shared Memory)</FONT></B> <FONT lang=ZH-CN
face=宋体><B> </B></FONT></P>
<BLOCKQUOTE>
<BLOCKQUOTE>
<P style="LINE-HEIGHT: 150%"><FONT lang=ZH-CN
face=宋体>任务间通信最通常的方式是通过共享的数据结构进行通信,因为所有VxWorks的任务存在于一个单一的线性地址空间,<SPAN
style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.0pt; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">任务间共享数据。全局变量、线性队列、环形队列、链表、指针都可被运行在不同上下文的代码所指向。</SPAN></FONT></P>
<H4 class=EntityTitle><A name=84955><FONT class=sans
face="Helvetica, sans-serif" size=-1>Shared Data
Structures</FONT></A></H4>
<DL class=margin>
<DIV class=Anchor><A name=84952></A><IMG class=figure height=129
src="嵌入式系统VxWorks介绍及编程.files/c-basica5.gif" width=299 border=0>
</DIV></DL>
<P style="LINE-HEIGHT: 150%"> </P></BLOCKQUOTE>
<P style="LINE-HEIGHT: 150%"><FONT lang=ZH-CN face=宋体
size=4><STRONG>互斥</STRONG></FONT><FONT lang=ZH-CN face=System
size=4><B>(Mutual Exclusion)</B></FONT></P>
<P style="LINE-HEIGHT: 150%"><FONT lang=ZH-CN
face=System>互斥是用来控制多任务对共享数据进行串行访问的同步机制。在多任务应用中,当两个或多个任务同时访问共享数据时,可能会造成数据破坏。互斥使它们串行地访问数据,从而达到保护数据的目的.</FONT></P>
<P style="LINE-HEIGHT: 150%"><FONT lang=ZH-CN
face=System>解决互斥的几种方法:</FONT></P>
<P style="LINE-HEIGHT: 150%"><FONT lang=ZH-CN face=System>1.
关闭中断的方法(intLock): 能解决任务和中断ISR之间产生的互斥. </FONT></P>
<BLOCKQUOTE><PRE class=Code style="LINE-HEIGHT: 100%"><BIG><A name=84963><B><EM>f</EM>uncA () </B></A></BIG></PRE><PRE class=Code style="LINE-HEIGHT: 100%"><BIG><B><A name=84963>{ int lock = intLock();</A></B></BIG></PRE><PRE class=Code style="LINE-HEIGHT: 100%"><BIG><B><A name=84963>. . <I class=i>critical region that cannot be interrupted</I> .</A></B></BIG></PRE><PRE class=Code style="LINE-HEIGHT: 100%"><BIG><A name=84963><B>intUnlock (lock); }</B></A></BIG></PRE>
<P style="LINE-HEIGHT: 150%"><FONT lang=ZH-CN
face=System>但在实时系统中采取这个办法会影响系统对外部中断及时响应和处理的能力.</FONT></P></BLOCKQUOTE>
<P style="LINE-HEIGHT: 150%"><FONT lang=ZH-CN face=System>2.
关闭系统优先级(taskLock): 关闭系统优先级,这样在当前任务执行时,除了中断外,不会有其他优先级高的任务来抢占CPU,影响当前程序运行.
</FONT></P>
<BLOCKQUOTE><B><A name=84977>
<P style="LINE-HEIGHT: 100%">funcA () </A></B></P>
<P style="LINE-HEIGHT: 100%"><B><A name=84977>{ taskLock
();</A></B></P>
<P style="LINE-HEIGHT: 100%"><B><A name=84977>. . <I
class=i>critical region that cannot be interrupted </I>.</A></B></P>
<P style="LINE-HEIGHT: 100%"><B><A name=84977>taskUnlock ();
}</A></B></P></BLOCKQUOTE>
<P style="LINE-HEIGHT: 150%"><FONT lang=ZH-CN
face=System>这种方法阻止了高优先级的任务抢先运行,在实时系统中也是不适合的,除非关闭优先级的时间特别短.</FONT></P></BLOCKQUOTE>
<P style="LINE-HEIGHT: 150%"><FONT lang=ZH-CN face=System></FONT>
<BLOCKQUOTE>
<P style="LINE-HEIGHT: 150%"><FONT lang=ZH-CN size=4><B><FONT
face=宋体>信号量</FONT></B><FONT face=System><STRONG>(Semaphore):</STRONG>
</FONT></FONT><FONT lang=ZH-CN face=System>信号量是</FONT><FONT
lang=ZH-CN>解决<STRONG>互斥</STRONG></FONT><FONT lang=ZH-CN
face=System>和</FONT><STRONG><FONT lang=ZH-CN>同步协调进程</FONT></STRONG><FONT
lang=ZH-CN face=System>最好的方法</FONT>
<BLOCKQUOTE>
<P class=ae style="LINE-HEIGHT: 150%; tab-stops: 18.0pt"><SPAN
lang=EN-US
style="FONT-FAMILY: 'Courier New'; mso-bidi-font-family: 'Times New Roman'">VxWorks</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'">信号量提供最快速的任务间通信机制,它主要用于解决任务间的互斥和同步。针对不同类型的问题,有以下三种信号量:</SPAN><SPAN
lang=EN-US
style="FONT-FAMILY: 'Courier New'; mso-bidi-font-family: 'Times New Roman'"><O:P>
</O:P></SPAN></P>
<P class=ae
style="MARGIN-LEFT: 0cm; TEXT-INDENT: 0cm; LINE-HEIGHT: 150%; tab-stops: 18.0pt; mso-list: l28 level1 lfo23"><SPAN
lang=EN-US style="FONT-FAMILY: Wingdings">Ÿ<SPAN
style="FONT: 7pt 'Times New Roman'">
</SPAN></SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'">二进制信号量<SPAN
style="FONT-FAMILY: 宋体; mso-hansi-font-family: Times New Roman">(</SPAN><SPAN
lang=EN-US><SPAN style="mso-tab-count: 1"><I class=term>binary)</I>
</SPAN>使用最快捷、最广泛,主要用于同步或互斥;</SPAN></SPAN><SPAN lang=EN-US
style="FONT-FAMILY: 'Courier New'; mso-bidi-font-family: 'Times New Roman'"><O:P>
</O:P></SPAN></P>
<P class=ae
style="MARGIN-LEFT: 0cm; TEXT-INDENT: 0cm; LINE-HEIGHT: 150%; tab-stops: 18.0pt; mso-list: l55 level1 lfo24"><SPAN
lang=EN-US style="FONT-FAMILY: Wingdings">Ÿ<SPAN
style="FONT: 7pt 'Times New Roman'">
</SPAN></SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'">互斥信号量<SPAN
lang=EN-US><SPAN style="mso-tab-count: 2">(<I class=term>mutual
exclusion</I>) </SPAN><SPAN
style="mso-tab-count: 2">特殊的</SPAN></SPAN>二进制信号量,<SPAN
lang=EN-US>主要用于优先级继承、安全删除和回溯;</SPAN></SPAN><SPAN lang=EN-US
style="FONT-FAMILY: 'Courier New'; mso-bidi-font-family: 'Times New Roman'"><O:P>
</O:P></SPAN></P>
<P class=ae
style="MARGIN-LEFT: 0cm; TEXT-INDENT: 0cm; LINE-HEIGHT: 150%; tab-stops: 18.0pt; mso-list: l8 level1 lfo25"><SPAN
lang=EN-US style="FONT-FAMILY: Wingdings">Ÿ<SPAN
style="FONT: 7pt 'Times New Roman'">
</SPAN></SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'">计数器信号量(counting)
和二进制信号量类似,保持信号量被释放(gaven)的次数</SPAN><SPAN lang=EN-US
style="FONT-FAMILY: 'Courier New'; mso-bidi-font-family: 'Times New Roman'"><O:P>
</O:P>,主要用于保护一个资源的多个例程(multiple instances of a resource)</SPAN></P>
<P style="LINE-HEIGHT: 150%"><B><FONT lang=ZH-CN
face=宋体>信号量控制,函数介绍:</FONT></B></P>
<BLOCKQUOTE>
<P style="LINE-HEIGHT: 150%"><B class=routine><I
class=routine>semBCreate</I></B><B>( ) </B>分配并初始化一个<SPAN
style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'">二进制信号量</SPAN></P>
<P style="LINE-HEIGHT: 150%"><B class=routine><I
class=routine>semMCreate</I></B><B>( ) </B>分配并初始化一个互斥<SPAN
style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'">信号量</SPAN></P>
<P style="LINE-HEIGHT: 150%"><B class=routine><I
class=routine>semCCreate</I></B><B>( ) </B>分配并初始化一个<SPAN
style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'">计数信号量</SPAN></P>
<P style="LINE-HEIGHT: 150%"><B class=routine><I
class=routine>semDelete</I></B><B>( ) </B>终止一个自由的信号量</P>
<P style="LINE-HEIGHT: 150%"><B class=routine><I
class=routine>emTake</I></B><B>( ) </B>占有一个信号量</P>
<P style="LINE-HEIGHT: 150%"><B class=routine><I
class=routine>semGive</I></B><B>( ) </B>释放一个信号量</P>
<P style="LINE-HEIGHT: 150%"><B class=routine><I
class=routine>semFlush</I></B><B>( ) </B>解锁所有等待信号量的任务</P>
<P style="LINE-HEIGHT: 150%"><B class=routine><I
class=routine>semBCreate</I></B><B>( )</B>, <B class=routine><I
class=routine>semMCreate</I></B><B>( )</B>, and <B
class=routine><I
class=routine>semCCreate</I></B><B>( )</B>返回一个信号量<B>ID</B>作为其它后续任务使用该信号量的的句柄。当一个信号量被创建,它的队列(queue)类型就被确定。等待信号量的任务队列以优先级的高低排列(<B
class=symbol_UC>SEM_Q_PRIORITY</B>),或者一先到先得的方式排列<B>(SEM_Q_FIFO).</B></P>
<UL>
<LI>
<P style="LINE-HEIGHT: 150%"><FONT lang=ZH-CN
face=System>当一个Semaphore创建时,指定了任务队列的种类</FONT> </P></LI></UL>
<OL type=A>
<LI>
<P style="LINE-HEIGHT: 150%"><FONT lang=ZH-CN
face=System>semBCreat( SEM_Q_PRIORITY, SEM_FULL),
SEM_Q_PRIORITY 指明处于等待状态的任务在等待队列中以优先级的顺序排列</FONT> </P>
<LI>
<P style="LINE-HEIGHT: 150%"><FONT lang=ZH-CN
face=System>semBCreat(SEM_Q_FIFO,SEM_FULL),
SEM_Q_FIFO指明 处于等待状态的任务在等待队列中以先进先出的顺序排列</FONT> </P></LI></OL>
<P style="LINE-HEIGHT: 150%"><B
class=symbol_UC> </B></P></BLOCKQUOTE>
<OL>
<LI>
<P style="LINE-HEIGHT: 150%"><FONT face=宋体><B><SPAN
style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'">二进制信号量<SPAN
style="FONT-FAMILY: 宋体; mso-hansi-font-family: Times New Roman">(</SPAN><SPAN
lang=EN-US style="mso-tab-count: 1"><I
class=term>binary)</I></SPAN></SPAN><FONT
lang=ZH-CN> </FONT></B></FONT> </P></LI></OL>
<DIV class=frame>
<H4 class=EntityTitle><A name=90612><FONT class=sans
face="Helvetica, sans-serif" size=-1>Taking a
Semaphore</FONT></A></H4>
<DL class=margin>
<DIV class=Anchor><A name=90651></A><IMG class=figure height=141
src="嵌入式系统VxWorks介绍及编程.files/c-basica6.gif" width=351 border=0>
</DIV></DL></DIV>
<DIV class=frame>
<H4 class=EntityTitle><A name=90676><FONT class=sans
face="Helvetica, sans-serif" size=-1> Giving a
Semaphore</FONT></A></H4>
<DL class=margin>
<DIV class=Anchor style="WIDTH: 421px; HEIGHT: 151px"><A
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -