VxWorks kernal programmers guide 联系客服

发布时间 : 星期六 文章VxWorks kernal programmers guide更新完毕开始阅读73f45dfea0116c175f0e48a7

7.1 介绍

任务间通讯工具允许任务同步为了协调任务的行为。VxWorks中任务间通讯工具包括中断锁,任务锁,各种类型信号量,消息队列,管道, V xWorks事件和消息通道。

对于进程间和内核进程通信,VxWorks信号量和消息队列,管道和事件(还有POSIX信号量和事件)可以创建为公共对象来提供跨越内存边界的任务间通讯(内核和进程之间,不同进程之间)。另外,消息通道提供基于socket的进程间通讯和进程间通讯机制。

注:这一章提供了VxWorks内核中存在的设备信息。关于实时进程中存在的相关信息,参考VxWorks Application Programmer’s Guide相关章节。

注:这一章提供了通用于UP和SMP VxWorks配置的多任务设施。也提供了具体与UP的相关设施信息。后面,注明了SMP系统相关信息。

正常情况下,VxWorks的SMP和UP配置共享相同的API——仅有一小部分函数不同。注明一些编程实践——隐式同步技术依赖任务优先级取代显式锁——SMP系统不合适。

关于SMP编程更多信息,参考24. VxWorks SMP。关于具体移植相关信息,参考24.17 Migrating Code to VxWorks SMP。

7.2 关于任务间和进程间通讯

VxWorks任务间和进程间设备为不同任务行为和通讯提供了同步机制。最简单的情况,执行在相同内存空间中(内核或进程)的任务可以通过访问共享数据结构轻易实现通讯和数据交换。(相关信息,参考7.3 Shared Data Structures。)然而,它们的访问应该使用设计用于互斥访问一个共享资源的工具,如通用目的二进制信号量。很多专业的同步和互斥机制被提供用于处理更复杂和需要更高性能的场景,还有直接进行数据交换的机制和事件通知机制。

VxWorkst提供的进程间和任务间通讯工具如下: 中断锁

提供禁用中断的方法,防止被ISRs抢占。中断锁不上一个通用目的机制,应该谨慎使用,参考7.4 Interrupt Locks。

任务锁

提供禁用被其它任务抢占的方法。任务锁不上一个通用目的机制,应谨慎使用。参考7.5 Task Locks。

信号量

提供任务同步和互斥的主要方法,如7.6 Semaphores描述。信号量可以用公共对象创建,用于进程间通讯;相关信息,参考7.10 Inter-Process Communication With Public Objects。关于POSIX信号量信息,参考9.13 POSIX Semaphores。

消息队列

为任务间直接消息通讯提供高水平的机制。参考7.7 Message Queues。消息队列创建为公共对象,允许进程间通讯使用;相关信息,参考7.10 Inter-Process Communication With Public

Objects。 管道

提供给消息队列工具的一个可选消息接口。管道操作通过I/O系统操作,考虑用于标准I/O函数和select()。参考7.8 Pipes。

VxWorks事件

提供任务和其它任务间的通讯和同步方法,中断服务程序(ISRs)和任务,信号量和任务,消息队列和任务,参考7.9 VxWorks Events。

关于信号的信息,用于通用目的任务间和进程间通讯,参考8.2 Signals。

关于设计专用于多CPU系统的同步和通讯相关信息,参考see24. VxWorks SMP, 25.

Overview of

VxWorks AMP, 31. Shared-Memory Objects: VxMP和32. Distributed Shared Memory: DSHM和33. Message Channels。

注明:通常情况下,SMP和UP的VxWorks配置为任务间和进程间通讯共享相同的设备——仅很小一部分程序有差别。

这一部分提供了通用两种配置的API信息,和具体与AP配置相关信息。后者也注明了SMP有的信息。关于Vxworks SMP系统配置相关信息,参考24. VxWorks SMP;和移植相关信息,参考24.17 Migrating Code to VxWorks SMP。

7.3 共享数据结构

相同内存空间(一个单一进程或内核中)中不同任务通讯的最基本的方法是通过访问共享数据结构。因为单一进程中或内核中存在的所有任务存在在一个单一线性地址空间,任务间通过共享数据结构通讯;参考Figure 7-1。

全局变量,线性缓存,环形缓存,链表,指针可以通过代码在不同的任务上下文运行。然而,访问共享数据结构可以通过一个互斥体控制,如信号量。(7.6 Semaphores)

关于用于进程间通讯的共享数据域相关信息,参考VxWorks Application Programmer’s Guide。

7.4 中断锁

intLock( )函数禁用中断,因此防止被ISRs抢占。可以在一个任务或ISR上下文中调用。intUnLock( )函数重新使能中断。如下代码用于包含一个临界区域:

foo () {

int lockKey = intLock(); .

. /* critical region of code that cannot be interrupted */ .

intUnlock(lockKey); }

当一个任务和中断共同访问一个变量或数据结构时,使用intLock( )函数防止抢占。保护的代码量要最小化,意味着代码行数少,没有函数调用。若调用太长,会直接影响中断延迟和导致系统变得不确定性。