📄 嵌入式系统vxworks介绍及编程.htm
字号:
<P style="LINE-HEIGHT: 150%"><FONT lang=ZH-CN face=宋体
size=3><STRONG>抢占调度</STRONG></FONT><FONT lang=ZH-CN
face=System>:真实世界的事件具有继承的优先级,在分配<FONT lang=ZH-CN
face=宋体>CPU</FONT>的时候要注意到这些优先级。基于优先级的抢占调度,任务都被指定了优先级,在能够执行的任务(没有被挂起或正在等待资源)中,优先级最高的任务被分配<FONT
lang=ZH-CN
face=宋体>CPU</FONT>资源。换句话说,当一个高优先级的任务变为可执行态,它会立即抢占当前正在运行的较低优先级的任务。<FONT
lang=ZH-CN face=宋体> </P></FONT></FONT>
<P style="LINE-HEIGHT: 150%"><FONT lang=ZH-CN face=宋体
size=3><STRONG>任务间的通讯与同步</STRONG></FONT><FONT lang=ZH-CN
face=System>:在一个实时系统中,可能有许多任务作为一个应用的一部分执行。系统必须提供这些任务间的快速且功能强大的通信机制。内核也要提供为了有效地共享不可抢占的资源或临界区所需的同步机制。</P></FONT>
<P style="LINE-HEIGHT: 150%"><FONT lang=ZH-CN face=宋体
size=3><STRONG>任务与中断之间的通信</STRONG></FONT><FONT lang=ZH-CN
face=System>:尽管真实世界的事件通常作为中断方式到来,但为了提供有效的排队、优先化和减少中断延时,我们通常希望在任务级处理相应的工作。所以需要杂任务级和中断级之间存在通信。</P></FONT>
<P style="LINE-HEIGHT: 150%" align=right> </P></BLOCKQUOTE>
<P style="LINE-HEIGHT: 150%"><FONT lang=ZH-CN face=宋体
size=5><STRONG>二.系统编程方法</STRONG></FONT></P>
<P style="LINE-HEIGHT: 150%"><FONT lang=ZH-CN
face=宋体>了解系统编程对程序员来说尤为重要。根据Drew个人的经验基本上操作系统编程都是类似的,认真读懂一种,就很容易的理解另一种。</FONT></P>
<P style="LINE-HEIGHT: 150%"><FONT lang=ZH-CN face=宋体>下面是Drew翻的VxWorks
programmer guide中的基本内容,有一些内容是Drew个人的理解。理解这些内容对实时操作编程非常重要。</FONT></P><FONT
lang=ZH-CN face=System>
<P style="LINE-HEIGHT: 150%">实时系统主要包括</FONT><FONT lang=ZH-CN
face=宋体>:</FONT><FONT lang=ZH-CN
face=System>多任务调度(采用优先级抢占方式),任务间的同步和进程间通信机制</FONT><FONT lang=ZH-CN
face=宋体>。</FONT></P><FONT lang=ZH-CN face=System>
<BLOCKQUOTE>
<P
style="LINE-HEIGHT: 150%">一个多任务环境允许实时应用程序以一套独立任务的方式构筑,每个任务拥有独立的执行线程和它自己的一套系统资源。进程间通信机制使得这些任务的行为同步、协调。</FONT>
<FONT lang=ZH-CN
face=System>wind使用中断驱动和优先级的方式。它缩短了上下文转换的时间开销和中断的时延。在</FONT> <FONT
lang=ZH-CN face=System>VxWorks
中,任何例程都可以被启动为一个单独的任务,拥有它自己的上下文和堆栈。还有一些其它的任务机制可以使任务挂起、继续、删除、延时或改变优先级。</FONT>
</P><FONT lang=ZH-CN face=System>
<P
style="LINE-HEIGHT: 150%">另一个重要内容是:硬件中断处理。硬件产生中断,统治系统调用相应的中断历程(ISR),位是系统得到尽快的响应,ISR在它自己独立的上下文和堆栈中运行.它的优先级高于任何任务优先级.</P>
<H4 class=EntityTitle><A name=93407><FONT class=sans
face="Helvetica, sans-serif" size=-1>Task State
Transitions</FONT></A></H4>
<DL class=margin>
<DIV class=Anchor><A name=93492></A><IMG class=figure height=265
src="嵌入式系统VxWorks介绍及编程.files/c-basica4.gif" width=310 border=0>
</DIV></DL>
<P style="LINE-HEIGHT: 150%"> </P></BLOCKQUOTE>
<P style="LINE-HEIGHT: 150%"> </P></FONT>
<BLOCKQUOTE>
<P style="LINE-HEIGHT: 150%"><STRONG><FONT lang=ZH-CN face=宋体
size=4>中断延迟</FONT><FONT lang=ZH-CN face=System>(Interrupt Latency)
</FONT></STRONG><FONT lang=ZH-CN
face=System>中断延迟是指从硬件中断发生到开始执行中断处理程序第一条指令之间的这段时间。 </P></FONT>
<P style="LINE-HEIGHT: 150%"><STRONG><FONT lang=ZH-CN face=宋体
size=4>优先级驱动</FONT><FONT lang=ZH-CN face=System>(Priority-Driven)
</FONT></STRONG><FONT lang=ZH-CN
face=System>优先级驱动是指多任务系统中,当前运行任务总是具有最高优先级的就绪任务。 </FONT></P></BLOCKQUOTE>
<UL>
<LI>
<P style="LINE-HEIGHT: 150%"><STRONG><FONT lang=ZH-CN
size=5>多任务调度</FONT></STRONG> </P></LI></UL><FONT lang=ZH-CN face=System>
<BLOCKQUOTE>
<P style="LINE-HEIGHT: 150%">两种方式: 优先抢占和轮转调度(Preemptive
Priority,Round-Robin Scheduling).</P></BLOCKQUOTE></FONT><STRONG>
<BLOCKQUOTE>
<P style="LINE-HEIGHT: 150%"><FONT lang=ZH-CN>优先抢占</FONT></STRONG><FONT
lang=ZH-CN face=System>(Preemptive Priority):
每一个任务都有一个优先级,系统核心保证优先级最高的任务运行于CPU.如果有任务优先级高于当前的任务优先级,系统立刻保存当前任务的上下文,切换到优先级高的上下文.
</FONT></P>
<H4 class=EntityTitle><A name=83848><FONT class=sans
face="Helvetica, sans-serif" size=-1>Priority Preemption</FONT></A></H4>
<DL class=margin>
<DIV class=Anchor><A name=83845></A><IMG class=figure height=141
src="嵌入式系统VxWorks介绍及编程.files/c-basic10.gif" width=360 border=0>
</DIV></DL>
<P style="LINE-HEIGHT: 150%"> </P>
<P style="LINE-HEIGHT: 150%"> </P></BLOCKQUOTE>
<BLOCKQUOTE><B>
<BLOCKQUOTE>
<P style="LINE-HEIGHT: 150%"><FONT
lang=ZH-CN>抢占(Preemptive):</FONT><FONT lang=ZH-CN face=System>
</FONT></B><FONT lang=ZH-CN>抢占是指当系统处于核心态运行时,
允许任务的重新调度。换句话说就是指正在执行的任务可以被打断,让另一个任务运行。抢占提高了应用对异步事件的响应性能力。操作系统内核可抢占,并不是说任务调度在任何时候都可以发生。例如当一个任务正在通过一个系统调用访问共享数据时,重新调度和中断都被禁止.</FONT></P></BLOCKQUOTE>
<BLOCKQUOTE>
<P style="LINE-HEIGHT: 150%"><STRONG><FONT lang=ZH-CN>任务上下文(Task
Context):</FONT></STRONG><B><FONT lang=ZH-CN face=System>
</FONT></B><FONT
lang=ZH-CN>任务上下文是指任务运行的环境。例如,针对x86的CPU,任务上下文可包括程序计数器、堆栈指针、通用寄存器的内容.</FONT></P></BLOCKQUOTE>
<BLOCKQUOTE>
<P style="LINE-HEIGHT: 150%"><FONT lang=ZH-CN><STRONG>上下文切换(Context
Switching):</STRONG>
多任务系统中,上下文切换是指CPU的控制权由运行任务转移到另外一个就绪任务时所发生的事件,当前运行任务转为就绪(或者挂起、删除)状态,另一个被选定的就绪任务成为当前任务。上下文切换包括保存当前任务的运行环境,恢复将要运行任务的运行环境。上下文的内容依赖于具体的CPU.</FONT></P><FONT
lang=ZH-CN face=System>
<P style="LINE-HEIGHT: 150%"> </P></FONT>
<P style="LINE-HEIGHT: 150%"><FONT
lang=ZH-CN><STRONG><BIG>轮转调度(</BIG>Round-Robin
Scheduling):</STRONG>使所有相同优先级,状态为ready的任务公平分享CPU(分配一定的时间间隔,使个任务轮流享有CPU).</FONT></P>
<H4 class=EntityTitle><A name=83915><FONT class=sans
face="Helvetica, sans-serif" size=-1>Round-Robin
Scheduling</FONT></A></H4>
<DL class=margin>
<DIV class=Anchor style="WIDTH: 423px; HEIGHT: 137px"><A
name=83912></A><IMG class=figure height=137
src="嵌入式系统VxWorks介绍及编程.files/c-basic13.gif" width=360 border=0>
</DIV></DL>
<P style="LINE-HEIGHT: 150%"> </P><FONT lang=ZH-CN face=System>
<P style="LINE-HEIGHT: 150%">系统由256个优先级,从0到255,0为最高,255为最低.
任务在被创建时设定了优先级.也可用<BIG><B><I>taskPrioritySet</I> ( )</B></BIG>
来改变任务优先级.</P>
<P style="LINE-HEIGHT: 150%">任务的主要状态:
READY,PEND,DELAY,SUSPEND...</P></BLOCKQUOTE></BLOCKQUOTE></FONT>
<DIR>
<DIR>
<BLOCKQUOTE><PRE class=Code style="LINE-HEIGHT: 100%"><BIG><SPAN class=Code><FONT lang=ZH-CN><STRONG>ready-------->pended -----------</STRONG><B><I>semTake</I>( )/<I>msgQReceive</I>( )-</B>其他任务</FONT></SPAN></BIG></PRE></BLOCKQUOTE>
<BLOCKQUOTE><PRE class=Code style="LINE-HEIGHT: 100%"><BIG><SPAN class=Code><FONT lang=ZH-CN><STRONG>ready-------->delayed-----------</STRONG><B><I>taskDelay</I>( )</B></FONT></SPAN></BIG></PRE></BLOCKQUOTE>
<BLOCKQUOTE><PRE class=Code style="LINE-HEIGHT: 100%"><BIG><SPAN class=Code><FONT lang=ZH-CN><STRONG>ready-------->suspended---------</STRONG><B><I>taskSuspend</I>( )</B></FONT></SPAN></BIG></PRE></BLOCKQUOTE>
<BLOCKQUOTE><PRE class=Code style="LINE-HEIGHT: 100%"><BIG><SPAN class=Code><FONT lang=ZH-CN><STRONG>pended------->ready-------------</STRONG><B><I>semaGive</I>( )/<I>msgQSend</I>( )-</B>其他任务</FONT></SPAN></BIG></PRE></BLOCKQUOTE>
<BLOCKQUOTE><PRE class=Code style="LINE-HEIGHT: 100%"><BIG><SPAN class=Code><FONT lang=ZH-CN><STRONG>pended------->suspended---------</STRONG><B><I>taskSuspend</I>( )</B></FONT></SPAN></BIG></PRE></BLOCKQUOTE>
<BLOCKQUOTE><PRE class=Code style="LINE-HEIGHT: 100%"><BIG><SPAN class=Code><FONT lang=ZH-CN><STRONG>delayed------>ready-------------</STRONG><B><I>expired delay</I></B></FONT></SPAN></BIG></PRE></BLOCKQUOTE>
<BLOCKQUOTE><PRE class=Code style="LINE-HEIGHT: 100%"><BIG><SPAN class=Code><FONT lang=ZH-CN><STRONG>delayed------>suspended---------</STRONG><B><I>taskSuspend</I>( )</B></FONT></SPAN></BIG></PRE></BLOCKQUOTE>
<BLOCKQUOTE><PRE class=Code style="LINE-HEIGHT: 100%"><BIG><SPAN class=Code><FONT lang=ZH-CN><STRONG>suspended---->ready-------------</STRONG><B><I>taskResume</I>( )/<I>taskActivate</I>( )</B></FONT></SPAN></BIG></PRE></BLOCKQUOTE>
<BLOCKQUOTE><PRE class=Code style="LINE-HEIGHT: 100%"><BIG><SPAN class=Code><FONT lang=ZH-CN><STRONG>suspended---->pended------------</STRONG><B><I>taskResume</I>( )</B></FONT></SPAN></BIG></PRE></BLOCKQUOTE>
<BLOCKQUOTE><PRE class=Code style="LINE-HEIGHT: 100%"><BIG><FONT lang=ZH-CN><SPAN class=Code><STRONG>suspended---->delayed-----------</STRONG><B><I>taskResume</I>( )</B></SPAN></FONT></BIG></PRE>
<P class=Code style="LINE-HEIGHT: 150%"> </P></BLOCKQUOTE><FONT lang=ZH-CN
face=System><STRONG>
<BLOCKQUOTE>
<P style="LINE-HEIGHT: 150%">轮转调度</STRONG></FONT> <FONT lang=ZH-CN
face=System>(Round-Robin):
轮转调度可以扩充到优先抢占方式中,当多个任务优先级相同的情况下,轮转调度算法使任务按平等的时间片运行于CPU,共享CPU.避免一个任务长时间占用CPU,而导致其他任务不能运行.可以用</FONT>
<FONT lang=ZH-CN face=System><B><I>kernelTimeSlice</I>( )</B>
来定义时间长度.</P></BLOCKQUOTE><B><I>
<BLOCKQUOTE>
<P style="LINE-HEIGHT: 150%">taskLock</I> ( )</B>和</FONT> <FONT
lang=ZH-CN face=System><B><I>taskUnlock</I> ( )</B> 用来取消优先抢占方式</FONT>
<FONT lang=ZH-CN face=System>和恢复优先抢占方式.</P></BLOCKQUOTE>
<BLOCKQUOTE>
<P style="LINE-HEIGHT: 150%">注意: 一个任务可以调用<B><I>taskDelete</I> ( )</B>
删除另一个任务,但是如果一个当前正在运行的任务被删除后,该任务的内存没有释放,而其他任务不知道,依然在等待,结果导致系统stop.用</FONT>
<FONT lang=ZH-CN face=System><B><I>taskSafe</I> ( )</B> 和</FONT> <FONT
lang=ZH-CN face=System><B><I>taskUnsafe</I> ( )</B>
来保证正在运行的任务不被删除.</P></BLOCKQUOTE>
<BLOCKQUOTE>
<P style="LINE-HEIGHT: 150%">用法如下:</P></FONT><B><FONT
face="Courier New">
<P style="LINE-HEIGHT: 150%">taskSafe (); <BR>semTake (semId,
WAIT_FOREVER);<BR>/* Block until semaphore available */ <BR>.
.</FONT><FONT lang=ZH-CN face=System> </FONT><FONT face="Courier New">.
.</FONT><FONT lang=ZH-CN face=System> </FONT><FONT
face="Courier New"><I>critical region </I>. <BR>semGive
(semId);</FONT><FONT lang=ZH-CN face=System> </FONT><FONT
face="Courier New">semGive (semId);</FONT><FONT lang=ZH-CN
face=System> <BR></FONT><FONT face="Courier New">/* Release semaphore
*/ <BR><A name=BM84245>taskUnsafe ();</A></FONT></P>
<P style="LINE-HEIGHT: 150%"> </P></BLOCKQUOTE></B></DIR></DIR>
<UL>
<LI>
<P style="LINE-HEIGHT: 150%"><BIG><BIG><STRONG><FONT
lang=ZH-CN>任务间的同步和进程间协调</FONT></STRONG> </BIG></BIG></P></LI></UL><FONT
lang=ZH-CN face=System>
<BLOCKQUOTE>
<P style="LINE-HEIGHT: 150%">信号量作为任务间同步和互斥的机制。在</FONT> <FONT lang=ZH-CN
face=System>wind 核中有几种类型的信号量,它们分别针对不同的应用需求:二进制信号量、计数信号量、互斥信号量和</FONT>
<FONT lang=ZH-CN face=System>POSIX
信号量。所有的这些信号量是快速和高效的,它们除了被应用在开发设计过程中外,还被广泛地应用在VxWorks
高层应用系统中。对于进程间通信,wind 核也提供了诸如消息队列、管道、套接字和信号等机制。</FONT>
</P></BLOCKQUOTE><FONT lang=ZH-CN face=System>
<BLOCKQUOTE>
<P style="LINE-HEIGHT: 150%">任务间的同步和进程间协调的几种方式:</P></BLOCKQUOTE>
<OL>
<OL>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -