VxWorks中多任务通信的示例分析

小编给大家分享一下VxWorks中多任务通信的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!

创新互联公司长期为1000+客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为迁安企业提供专业的成都网站设计、成都做网站、外贸网站建设迁安网站改版等技术服务。拥有10多年丰富建站经验和众多成功案例,为您定制开发。

VxWorks是一个典型的多任务操作系统。这多个任务之间不可能完全的彼此独立,它们需要一些系统机制来协调彼此的动作。这些机制就属于多任务通信,主要可以分为两类:事件通知、数据传递。

VxWorks系统提供了多种任务间通信机制:中断锁、任务锁、多种信号量、消息队列、管道、VxWorks事件(VxWorks Event)、消息通道。另外,同一内存空间里的任务(都在内核,或在同一RTP里)可以通过访问共享的数据结构,直接进行数据交换。不过,这些共享资源最好由互斥机制进行保护

  • 中断锁 - 可以关闭中断,阻止ISR抢占。这可不是通用机制,一定要谨慎使用

  • 任务锁 - 可以关闭其它任务的抢占。同样也不是通用机制,要谨慎使用

  • 信号量 - 任务同步与互斥的基本方法。VxWorks提供四种信号量,以及POSIX信号量。还可以将信号量创建为公共对象,用于进程间通信

  • 消息队列 - 直接在任务间传递消息(数据)的高级机制。也可以创建为公共对象,用于进程间通信

  • 管道 - 在消息队列上封装的另一种消息机制。通过标准I/O函数和select()来操作

  • VxWorks事件 - 可用于任务-任务、ISR-任务、信号量-任务、消息队列-任务之间的同步与通信

  • 消息通道 - 基于socket的通信机制,可用于任务间、进程间、处理器间通信

另外还有信号(Signal)可以在任务和进程间传递事件,不过一般不把它当作通信机制

共享数据结构

同一内存空间里(都在内核,或在同一RTP里)的任务之间,最显而易见的的通信方式就是访问共享的数据结构,因为它们使用单一线性地址空间

不同的任务可以直接访问全局变量、线性缓冲区、环形缓冲区、链表,以及指针。不过这些共享的数据结构,需要使用互斥机制(例如互斥信号量)来保护

 

中断锁

函数intLock()关闭中断,阻止ISR的抢占。在任务或ISR里都可以调用它。函数intUnLock()重新使能中断。这一对儿函数通常用于保护临界区域

VxWorks中多任务通信的示例分析

当任务去访问ISR也会访问的数据结构时,就使用intLock()来阻止ISR的抢占。很显然,这种操作应该尽可能的简短,甚至不要调用任何函数。否则它直接影响到中断延时,导致系统的不确定性。如果还要阻止任务的抢占,那么同时要使用taskLock()

警告:使用中断锁时,再调用系统函数的话,可以导致中断不定期的重新使能,例如调用的函数发生阻塞,或者激活高优先级任务

任务锁

函数taskLock()关闭任务抢占,仅让当前任务执行,除非当前任务阻塞或挂起。当这个任务解除阻塞、恢复执行后,它会再次禁止任务抢占。函数taskUnlock()恢复其它任务的抢占。这一对儿函数也用于保护临界区域,不过不能在ISR中使用

VxWorks中多任务通信的示例分析

任务锁可以嵌套使用,其内部有计数器,因此同等数量的taskUnlock()被调用后,才能真正的重新使能任务抢占

注意: 任务锁可能影响系统的实时响应时间,因为它阻止了高优先级任务的执行,通常互斥信号量是个更好的选择。另外,任务锁不会阻止中断。想要同时阻止中断抢占的话,就同时使用intLock()

看完了这篇文章,相信你对“VxWorks中多任务通信的示例分析”有了一定的了解,如果想了解更多相关知识,欢迎关注创新互联行业资讯频道,感谢各位的阅读!


当前题目:VxWorks中多任务通信的示例分析
分享网址:http://scyanting.com/article/pphpji.html