1、Tornado &VxWorks 培训,深圳市微迪软件技术有限公司 培训中心,实时系统概念,实时系统是对外来事件在限定时间内能做出反应的系统。 指标 响应时间 Response Time 生存时间 Survival Time 吞吐量 Throughput,实时系统与普通系统,在实时计算中,系统的正确性不仅仅依赖于计算的逻辑结果而且依赖于结果产生的时间 对于实时系统来说最重要的要求就是实时操作系统必须有满足在一个事先定义好的时间限制中对外部或内部的事件进行响应和处理的能力 此外作为实时操作系统还需要有效的中断处理能力来处理异步事件和高效的I/O能力来处理有严格时间限制的数据收发应用,实时系统分类
2、,根据不同的分类方法可以分为几种。 方法一是分为周期性的和非周期性的(periodic和aperiodic) 方法二是分为硬实时和软实时(hard real_time和soft real_time) 专用系统和开放系统 集中式系统和分布式系统,实时多任务操作系统与分时多任务操作系统,分时操作系统,软件的执行在时间上的要求,并不严格,时间上的错误,一般不会造成灾难性的后果。 实时操作系统,主要任务是对事件进行实时的处理,虽然事件可能在无法预知的时刻到达,但是软件上必须在事件发生时能够在严格的时限内作出响应(系统响应时间),即使是在尖峰负荷下,也应如此,系统时间响应的超时就意味着致命的失败。另外,
3、实时操作系统的重要特点是具有系统的可确定性,即系统能对运行情况的最好和最坏等的情况能做出精确的估计。,实时操作系统中的重要概念,系统响应时间(System response time )系统发出处理要求到系统给出应答信号的时间。 任务换道时间(Context-switching time)是任务之间切换而使用的时间。 中断延迟(Interrupt latency )是计算机接收到中断信号到操作系统作出响应,并完成换道转入中断服务程序的时间。,实时操作系统应具有如下的功能,任务管理(多任务和基于优先级的任务调度) 任务间同步和通信(信号量和共享内存等) 存储器优化管理(含ROM的管理) 实时时钟
4、服务 中断管理服务,硬实时、软实时(一),硬实时要求在规定的时间内必须完成操作,这是在操作系统设计时保证的 软实时则没有那么严,只要按照任务的优先级,尽可能快地完成操作即可 对于软实时系统基于优先级调度的调度算法可以满足要求,提供高速的响应和大的系统吞吐率;而对于硬实时系统则完成timely response是必须的。这两类系统的区别在于调度算法。 实时操作系统是保证在一定时间限制内完成特定功能的操作系统。例如,可以为确保生产线上的机器人能获取某个物体而设计一个操作系统。在“硬”实时操作系统中,如果不能在允许时间内完成使物体可达的计算,操作系统将因错误结束。在“软”实时操作系统中,生产线仍然能
5、继续工作,但产品的输出会因产品不能在允许时间内到达而减慢,这使机器人有短暂的不生产现象。,硬实时、软实时(二),软实时的RTOS一般应用在消费类电子产品,如手持电脑、个人数字助理(PDA)和机顶盒等消费电子类。WinCE。 硬实时的RTOS一般应用于通信、控制和航空航天等实时性强和可靠性高的领域。通信行业使用PSOS、VxWorks、VRTX,航天、航空使用VRTX、VxWorks,工业PC 控制使用QNX 。,实时系统的体系结构设计,实时系统的体系结构必须满足 1.高运算速度 2.高速的中断处理 3.高的I/O吞吐率 4.合理的处理器和I/O设备的拓扑连接 5.高速可靠的和有时间约束的通信
6、6.体系结构支持的出错处理 7.体系结构支持的调度 8.体系结构支持的操作系统 9.体系结构支持的实时语言特性。 10.系统的稳定性和容错也非常重要 11.还要考虑到实时的分布式应用。,实时进程调度算法(一),静态的周期性调度 这种调度算法的基本思想是将处理器的时间分为“帧“。 FIFO 也就是将系统中所有的任务组织成一个队列。先到先服务 优先级队列算法 种算法从FIFO发展而来。给每个任务设定优先级,然后在FIFO中按照优先级排列。这种算法保证了高优先级的任务的完成,但是对于低优先级的任务很可能无法满足时间的正确性。而且对低优先级的任务来说等待的时间是无法预知的。 以上的调度算法都是独占的
7、即任务运行时,不允许别的任务抢先。完成一个任务后才能完成下一个,实时进程调度算法(二),Rate Monatomic/Pacing算法 此算法是基于静态优先级调度协议的方法。此算法给系统中每个任务设置一个静态的优先级。这个优先级的设定是在计算任务的周期性和任务需要满足的deadline的时间的长短的基础上完成的。周期越短,deadline越紧迫,优先级越高。 Deadline Driven算法 Deadline Driven算法提供动态的优先级。因为此算法根据任务满足deadline的紧迫性来修改任务的优先级,以保证最紧迫的任务能够及时完成。 Priority Ceiling算法 这种算法用于
8、抢先式多任务的实时操作系统。该算法的基本思想是在系统中使用优先级驱动的可抢先的调度算法。也就是系统首先调度高优先级的任务运行。低优先级的任务在高优先级的任务运行时不能抢先;CPU由高优先级进程独占。,嵌入式系统概述,嵌入式系统 ( Embedded Systems ) 是指以应用为中心、以计算机技术为基础、软件硬件可裁剪、适应应用系统对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统。是将应用程序和操作系统与计算机硬件集成在一起的系统,嵌入式硬件,嵌入式硬件包括处理器微处理器、存储器及外设器件和IO端口、图形控制器等 特点: 1)对实时多任务有很强的支持能力,能完成多任务并且有较短的中断
9、响应时间,从而使内部的代码和实时内核心的执行时间减少到最低限度。 2)具有功能很强的存储区保护功能。这是由于嵌入式系统的软件结构已模块化,而为了避免在软件模块之间出现错误的交叉作用,需要设计强大的存储区保护功能,同时也有利于软件诊断。 3)可扩展的处理器结构,以能最迅速地开展出满足应用的最高性能的嵌入式微处理器。 4)嵌入式微处理器必须功耗很低,尤其是用于便携式的无线及移动的计算和通信设备中靠电池供电的嵌入式系统更是如此,如需要功耗只有mW甚至W级。,嵌入式系统发展趋势,嵌入式应用软件的开发需要强大的开发工具和操作系统的支持。 联网成为必然趋势 支持小型电子设备实现小尺寸、微功耗和低成本 提供
10、精巧的多媒体人机界面,实时系统内存管理,预先分配内存。 在系统构造或编译时为每个任务指定其使用的内存空间。这种方法对于硬实时系统来说是很合适的。而且嵌入式实时操作系统很多都是在ROM中运行,仅仅只有需要变化的数据才放在RAM中。这种系统在组成上无疑是静态的。 虚拟内存 但必须给实时任务提供方法,以便将实时任务“锁”进内存,也就是系统在管理虚拟内存时,不将“锁”住的内存块换出物理内存。,嵌入式系统和实时系统,嵌入式系统经常被误解为就是实时性系统。其实,多数嵌入式系统并不需要实时性 Linux是嵌入式操作系统,并非实时操作系统。 Vxwork、pSOS、Neculeus和Windowss CE 是
11、嵌入式实时操作系统,一、实时多任务,任务状态,实时系统的一个任务可有多种状态,其中最基本的状态有四种: 就绪态:任务只等待系统分配CPU资源; 悬置态:任务需等待某些不可利用的资源而被阻塞; 休眠态:如果系统不需要某一个任务工作,则这个任务处于休眠状态; 延迟态:任务被延迟时所处状态;,任务状态迁移,任务状态迁移函数(一),就绪态 - 悬置态 semTake()/msgQReceive() 就绪态 - 延迟态 taskDelay() 就绪态 - 休眠态 taskSuspend() 悬置态 - 就绪态 semGive()/msgQSend() 悬置态 - 休眠态 taskSuspend(),任务
12、状态迁移函数(二),延迟态 - 就绪态 expired delay 延迟态 - 休眠态 taskSuspend() 休眠态 - 就绪态 taskResume()/taskActivate() 休眠态 - 悬置态 taskResume() 休眠态 - 延迟态 taskResume(),多任务内核,进行任务管理 任务是竞争系统资源的最小运行单元。任务可以使用或等待CPU、I/O设备及内存空间等系统资源,并独立于其它任务,与它们一起并发运行(宏观上如此)。VxWorks内核使任务能快速共享系统的绝大部分资源,同时有独立的上下文来控制个别线程的执行。 VxWorks实时内核Wind提供了基本的多任务环
13、境,系统内核根据某一调度策略让它们交替运行。 系统调度器使用任务控制块的数据结构(简记为TCB)来管理任务调度功能。,任务控制快(TCB),任务控制块用来描述一个任务,每一任务都与一个TCB关联。 任务控制块里面包含了: 当前状态、优先级、要等待的事件或资源、任务程序码的起始地址、初始堆栈指针 任务的“上下文”(context)。任务的上下文就是当一个执行中的任务被停止时,所要保存的所有信息。通常,上下文就是计算机当前的状态,也即各个寄存器的内容。 VxWorks中,内存地址空间不是任务上下文的一部分。所有的代码运行在同一地址空间。如每一任务需各自的内存空间,需可选产品VxVMI的支持。,内核
14、管理示意图,Kernel,TCB,TCB,TCB,Suspended,Pended,Delayed,Ready,CPU,Executing,任务上下文切换,当前运行的任务的上下文被存入TCB 将要被执行的任务的上下文从它的TCB中取出,放入各个寄存器中。 上下文切换必须很快速的,优先级调度,基于优先级的抢占式调度法作为缺省策略 这种调度方法为每个任务指定不同的优先级。没有处于悬置或休眠态的最高优先级任务将一直运行下去。 当更高优先级的任务由就绪态进入运行时,系统内核立即保存当前任务的上下文,切换到更高优先级的任务。 当有内核调用或有中断到来时,内核重新调度 同时提供了时间片轮转调度,基于优先级
15、的抢占式调度,时间片轮转调度,Time Slice Period (Constant - Programmable),混合调度策略,内核时间片,时间片的长度可由系统调用 KernelTimeSlice(ticks)通过输入参数值来指定。当 ticks为0时,时间片调度被关闭 基于优先级的抢占式调度可以发生在任何时候,时间片轮转调度只能在相同优先级的任务间每隔ticks发生一次。 在VxWorks系统中,可以调用函数kernelTimeSlice来使用时间片轮转调度。,VxWorks任务特性,所有的代码运行在同一地址空间。 任务能快速共享系统的绝大部分资源,同时有自己独立的上下文 所有的任务都运
16、行在特权模式下,共享代码和重入(一),VxWorks提倡单个子程序或子程序库被多个不同的任务调用。例如printf。一个被多个任务调用的单个拷贝称为共享代码。 VxWorks动态链接功能很容易实现代码共享。 共享代码必须是可重入的。 VxWorks的I/O和驱动程序是可重入的。但是要求应用小心设计。对于缓冲(buffer)I/O,VxWorks推荐使用文件指针。,共享代码和重入(二),大部分VxWorks程序使用下面的重入机制 动态堆栈变量 如果程序仅仅是纯代码,除了自己的动态堆栈变量外没有自己的数据,除了调用者以参数传进的数据外,没有其他数据。任务只在自己的堆栈内进行操作。 由信号量保护的全
17、局或静态变量 VxWorks的一些库封装对公共数据的访问。需要借用互斥机制 任务变量 一些程序可能会被多个任务同时调用,这些任务可能要求全局变量和静态变量有不同的值。这种情况下,VxWorks提供了所谓任务变量的机制,这种机制允许在任务上下文中增加4字节的变量,因此每次上下文交换时,改变量的值被保存。 这种机制由taskVarLib库中的函数来提供。,抢占禁止,Wind内核可通过调用taskLock()和taskUnlock()来使调度器起作用和失效。当一个任务调用taskLock()使调度器失效,任务运行时没有基于优先级的抢占发生。然而,如果任务被阻塞或是悬置时,调度器从就绪队列中取出最高优
18、先级的任务运行。当设置抢占禁止的任务解除阻塞,再次开始运行时,抢占又被禁止。这种抢占禁止防止任务的切换,但对中断处理不起作用。,POSIX调度,schedPxLib库提供了POSIX 1003.1b调度函数 POSIX和Wind调度差异 POSIX调度算法应用在进程到进程基础之上的,而Wind调度算法则用于整个系统基础之上的,所有任务即可以使用轮转调度,也可以使用基于优先级的抢占调度。 POSIX的优先级编号方案与Wind的方案相反。POSIX中,优先数越高,优先级越高;Wind方案相反。为了解决这种冲突,用户需要通过将默认的全局变量posixPriorityNumbering的设置改委FAL
19、SE。 使用POSIX调度程序,需要在配置VxWorks时,包含INCLUDE_POSIX_SCHED宏定义,系统将自动包含POSIX调度程序。,VxWorks怎样满足实时性需求,多任务特性 基于抢占式多任务调度 快速的任务上下文切换 快速确定的系统响应 高效的任务间通讯机制,Real-Time Multitasking,Introduction,Task Basics,Task Control,Error Status,System Tasks,Overview,Creating a Task,taskSpawn,Stack,TCBPC,foo () . ,Creating a Task,i
20、nt taskSpawn (name, priority, options,stackSize, entryPt, arg1, ., arg10)name Task name, if NULL gives a default name. priority Task priority, 0-255. options Task options e.g. VX_UNBREAKABLE. stackSize Size of stack to be allocated in bytes. entryPt Address of code to start executing (initial PC) ar
21、g1, ., arg10 Up to 10 arguments to entry point routine.,Task IDs,Task Names,Task Priorities,Task Stacks,Stack Overflows,High-water Mark Indicator (UNIX),Note: In the PC Browser Stack Check Window, the high water makr triangles are not present. Instead, the number displayed inside each stack bar is t
22、hat stacks high water mark. The filled portion of the bar indicates the current stack usage graphically.,Task Options,Task Creation,Task Deletion,exit (code),taskDelete(tid),Resource Reclamation,Real-Time Multitasking,Introduction,Task Basics,Task Control,Error Status,System Tasks,Task Restart,taskR
23、estart (tid),Task Suspend / Resume,taskSuspend (tid),taskResume (tid),Task Delay,STATUS taskDelay (ticks),Reentrancy and Task Variables,Task Hooks,Task Information,ti (taskNameOrId),Task Browser,What is POSIX ?,What does VxWorks support ?,Library DescriptionaioPxLib Asynchornous I/O semPxLib POSIX S
24、emaphores mqPxLib POSIX Message Queues mmanPxLib POSIX Memory Management schedPxLib POSIX Scheduler Interface sigLib POSIX Signals timerLib, clockLib POSIX Timer/Clock Interface dirLib File/Directory Information,Real-Time Multitasking,Introduction,Task Basics,Task Control,Error Status,System Tasks,E
25、rror Status,VxWorks里使用一个全局整型变量errno来描述错误信息 程序执行过程中我们可以设置并调用一些函数例程来检测错误信息,并针对错误信息设置相应的错误号 然后调用一些函数例程检测错误号,当程序执行异常时可以根据错误号发现相应的错误,Errno and Context Switches,At each context switch, the kernel saves and restores the value of errno.,TCBerrorStatus,errno,Setting Errno,Examining Errno,Interpreting Errno,m
26、odule error number,31 15 0,Error Messages,User-Defined Error Codes,To get perror() to print your error messages:1. Modify vwModNum.h to reserve a module number:#define M_myLib (501 16)2. Define error macros in your header file (which mustbe in the wind/target/h directory):#define S_myLib_BAD_STUFF (
27、M_myLib | 1)3. Rebuild the system error table:,4. Rebuild VxWorks with the new error table built in.,Real-Time Multitasking,Introduction,Task Basics,Task Control,Error Status,System Tasks,System Tasks,Task Name Priority FunctiontUsrRoot 0 Initial task. Configures the system, spawns the shell, then e
28、xits.tLogTask 0 Message logging.tExecTask 0 Exeption handling.tWdbTask 3 WDB running agent.tNetTask 50 Task-level network functions.tFtpdTask 55 FTP server.,Summary,Summary,Semaphores,概述,信号量是最早出现的用来解决进程同步与互斥问题的机制,包括一个称为信号量的变量及对它进行的两个原语操作。 信号量作为任务间同步和互斥的机制,是快速和高效的,它们除了被应用在开发设计过程中外,还被广泛地应用在 VxWorks 高层
29、应用系统中。 二进制信号量 计数信号量 互斥信号量POSIX 信号量,信号量的类型定义,每个信号量至少须记录两个信息:信号量的值和等待该信号量的进程队列。它的类型定义如下:(用类PASCAL语言表述) semaphore = record value: integer; queue: PCB; end; 其中PCB是进程控制块,是操作系统为每个进程建立的数据结构。 s.value=0时,s.queue为空; s.value0时,s.value的绝对值为s.queue中等待进程的个数;,PV原语(一),对一个信号量变量可以进行两种原语操作:p操作和v操作,定义如下:procedure p(var
30、 s:samephore); s.value=s.value-1; if (s.value0) asleep(s.queue); procedure v(var s:samephore); s.value=s.value+1; if (s.value=0) wakeup(s.queue); ,PV原语(二),其中用到两个标准过程: asleep(s.queue);执行此操作的进程的PCB进入s.queue尾部,进程变成等待状态 wakeup(s.queue);将s.queue头进程唤醒插入就绪队列 s.value初值为1时,可以用来实现进程的互斥。 p操作和v操作是不可中断的程序段,称为原语。
31、如果将信号量看作共享变量,则pv操作为其临界区,多个进程不能同时执行,一般用硬件方法保证。一个信号量只能置一次初值,以后只能对之进行p操作或v操作。 信号量机制必须有公共内存,不能用于分布式操作系统,这是它最大的弱点。,Semaphores,Overview,Binary Semaphores and Synchronization,Mutual Exclusion,The synchronization Problem,Task,myGetData () requestData ();waitForData ();getData (); ,The Synchronization Soluti
32、on,Binary Semaphores,SEM_ID semBCreate (options, intialState)options Sepcify queue type (SEM_Q_PRIORITY orSEM_Q_FIFO) for tasks pended on thissemaphore.initialState Initialize semaphore to be available(SEM_FULL) or unavailable (SEM_EMPTY).,Taking a Semaphore,STATUS semTake (semId, timeout)semId The
33、SEM_ID returned from semBCreate().timeout Maximum time to wait for semaphore. Valuecan be clock ticks, WAIT_FOREVER, or NO_WAIT.,Taking a Binary Semaphore,semaphore available ?,task pends until sem is given or timeout,timeout,task unpends semTake() returns ERROR,no,task continues semTake() returns O
34、K,yes,task unpends, semTake() returns OK,semaphoregiven,Giving a Semaphores,STATUS semGive (semId),Giving a Binary Semaphore,tasks pended ?,semaphore made available,no,task at front of queue made ready semaphore remains unavailable,yes,Information Leakage,释放信号量图示,信号量可用?,有任务阻塞?,任务继续 信号量变为可用,任务继续 信号量保
35、持不变,等待该信号量的 任务队列的任务 就绪,信号量不 可用,Yes,No,No,Yes,Synchronizing Multiple Tasks,STATUS semFlush (semId),Semaphores,Overview,Binary Semaphores and Synchronization,Mutual Exclusion,Mutual Exclusion Problem,Race Condition Example,tTask1,tTask2,1 char myBuf(BU_SIZE); /* store data here */ 2 int myBufIndex = -
36、1; /* Index of last data */ 3 4 myBufPut (char ch) 5 6 myBufIndex+; 7 myBuf myBufIndex = ch; 8 ,myBufIndex+,myBufIndex+,myBuf myBufIndex = b,myBuf myBufIndex = a,.,Solution Overview,Creating Mutual Exclusion Semaphores,SEM_ID semMCreate (options),Mutex Ownership,Taking a Mutex Semaphore,owner of Sem
37、aphore?,task pends until sem is given or timeout,another task,task continues semTake() returns OK Task becomes owner,no one,task continues semTake() returns OK task ownership count incremented,this task,Giving a Mutex Semaphore,ownership count?,semaphore made available,one,semGive() returns ERROR,no
38、t owner,greater than one,tasks pended?,no,decrement ownership count,task at head of queue is made ready, becomes owner,yes,Code Example - Solution,1 #include ”vxWorks.h” 2 #include ” semLib.h” 3 4 LOCAL char myBufBUF_SIZE; /* Store data here */ 5 LOCAL int myBufIndex = -1; /* Index of last data */ 6
39、 LOCAL SEM_ID mySemId; 7 8 void myBufInit ( ) 9 10 mySemID = semNCreate (SEM_Q_PRIORITY | 11 SEM_INVERSION_SAFE | 12 SEM_DELETE_SAFE ); 13 14 15 void myBufPut (char ch) 16 17 semTake(mySemId, WAIT_OREVER); 18 myBufIndex+; 19 myBufmyBufIndex = ch; 20 semGIve (mySemId); 21 ,Deletion Safety,安全删除,wind内核
40、提供防止任务被意外删除的机制。通常,一个执行在临界区或访问临界资源的任务要被特别保护。 我们设想下面的情况:一个任务获得一些数据结构的互斥访问权,当它正在临界区内执行时被另一个任务删除。由于任务无法完成对临界区的操作,该数据结构可能还处于被破坏或不一致的状态。而且,假想任务没有机会释放该资源,那麽现在其他任何任务现在就不能获得该资源,资源被冻结了。 任何要删除或终止一个设定了删除保护的任务的任务将被阻塞。当被保护的任务完成临界区操作以后,它将取消删除保护以使自己可以被删除,从而解阻塞删除任务。,Priority Inversion,High Priority,Medium Priority,L
41、ow Priority,Pended,tHigh unblocks,tMediumunblocks,semTake( ),Pended,Pended,Ready,semTake( ),Critical Region,Ready,time,优先级逆转/优先级继承,优先级逆转发生在一个高优先级的任务被强制等待一段不确定的时间以便一个较低优先级的任务完成执行。 T1,T2和T3分别是高、中、低优先级的任务。T3通过拥有信号量而获得相关的资源。当T1抢占T3,为竞争使用该资源而请求相同的信号量的时候,它被阻塞。如果我们假设T1仅被阻塞到T3使用完该资源为止,情况并不是很糟。毕竟资源是不可被抢占的。然而
42、,低优先级的任务并不能避免被中优先级的任务抢占,一个抢占的任务如T2将阻止T3完成对资源的操作。这种情况可能会持续阻塞T1等待一段不可确定的时间。这种情况成为优先级逆转,因为尽管系统是基于优先级的调度,但却使一个高优先级的任务等待一个低优先级的任务完成执行。 互斥信号量有一个选项允许实现优先级继承的算法。优先级继承通过在T1被阻塞期间提升T3的优先级到T1解决了优先级逆转引起的问题。这防止了T3,间接地防止T1,被T2抢占。通俗地说,优先级继承协议使一个拥有资源的任务以等待该资源的任务中优先级最高的任务的优先级执行。当执行完成,任务释放该资源并返回到它正常的或标准的优先级。因此,继承优先级的任
43、务避免了被任何中间优先级的任务抢占。,Priority Inheritance,Priority Inversion Safety,High Priority,Medium Priority,Low Priority,Pended,tHigh unblocks,tMediumunblocks,semTake( ),Pended,Pend,Ready,semTake( ),Critical Region,Ready,time,semGive( ),Avoiding Mistakes,Caveat - Deadlocks,INT 6,INT 3,tExcTask,tLogTask,tEvtTask
44、,tWdbTask,tNetTask,tTaskHi,tTaskLow,tPortmapd,tWvSvc,u0,idle,semTake(semId1,-1),semTake(semId1,-1),semTake(semId2,-1),semTake(semId2,-1),Other Caveats,Common Routines,semDelete( ) Destroy the semaphore.semTake( ) calls for all tasks pended on the semaphore return ERROR.,show( ) Display semaphoreinfo
45、rmation.,Semaphore Browser,Attributes,Blocked Tasks,Locking out Preemption,ISRs and Mutual Exclusion,计数器信号量,计数器信号量是实现任务同步的和互斥的另一种方法。计数器信号量出了象二进制信号量那样工作外,他还保持了对信号量释放次数的跟踪。信号量每次释放,计数器加一,每次获取,计数器减一。当计数器减到0,试图获取该信号量的任务被阻塞。 正如二进制信号量,当信号量释放时,如果有任务阻塞在该信号量阻塞队列上,那么任务解除阻塞。然而,不象二进制信号量,如果信号量释放时,没有任务阻塞在该信号量阻塞队列上
46、,那么计数器加一。 计数器信号量适用于保护拥有多个拷贝的资源。,Summary,Binary,Mutual Exclusion,semBCreate,semMCreate,semDelete,semTake, semGive show,Summary,Summary,Summary,Now Have a rest,Chapter 7,Intertask Communication,Intertask Communication,Introduction,Shared Memory,Message Queues,Pipes,Overview,Shared Memory,tTaskA,tTaskB
47、,fooLib.c,LOCAL SEM_ID fooSem; LOCAL FOO_BUF fooBuffer;fooSet ( ) fooGet ( ) .,Message Passing Queues,taskA,taskB,Intertask Communication,Message Queues,Pipes,Shared Memory,Introduction,Overview,Linked Lists,NULL,NULL,List Descriptor,User node 1,User node 2,NODE,NODE,User specific data,User specific
48、 data,head,tail,count = 2,Ring Buffers,reader,writer,Intertask Communication,Shared Memory,Pipes,Introduction,Message Queues,Message Queues,Creating a Message Queue,MSG_Q_ID msgQCreate (maxMsgs, maxMsgLength, options) maxMsgs Maximum number of messages on the queue. maxMsgLength Maximum size in bytes of a message on the queue. options Queue type for pended tasks (MSG_Q_FIFOor MSG_Q_PRIORITY),