事件非常适合于一个任务必须与多个任务进行通信的场合,如任务A必须同时与任务B、任务C、任务D进行通信,其中任务B通过消息队列向任务A发送数据,其发送频率较低,它要求任务A必须及时进行处理;而任务C则只是向任务A指示一种状态。
在5.5版本之前,VxWorks并没有事件这一通信机制。事件(event) 较早出现在pSOS实时操作系统中,在风河公司收购了pSOS之后,从VxWorks 5.5之后,加入了事件机制,并在pSOS事件的基础上做了增强和改进。事件可用于任务和中断服务程序ISR之间、任务和任务之间、任务和VxWorks资源之间进行通信。任务用函数eventReceive()来接收它关心的事件,用eventSend()来向另一个任务发送事件。
VxWorks资源主要是指信号量和消息队列,一个任务要想从VxWorks资源接收到事件,必须先进行注册(register),那么当资源处于FREE状态时,会向注册过的任务发送一个事件。对于每一个VxWorks资源,较多只允许有一个任务注册。如对于消息队列,任务可以使用函数msgQEvStart()来进行注册,那么当有消息到达这个消息队列而又没有任务等待这个消息队列时,会向这个任务发送一个事件,表明消息队列可用。而对于信号量,可以用函数semEvStart()来进行注册。但必须注意的是,一个任务接收到资源发送的事件后,并不能保证这个任务能获取该资源,如获取信号量、从消息队列接收到消息。
在VxWorks中,每一个任务都有一个32位事件寄存器,其中高8位由VxWorks系统保留,***可以使用低24位,其每一位表示一种事件,而事件的意义则完全有任务来定义,因此对于不同的任务,相同的位可能有不同的意义。而VxWorks并不对事件进行计数,而只表示该事件发生过,这与消息队列不同,因此接收事件的任务并不能知道接受到的事件发生的次数。
事件非常适合于一个任务必须与多个任务进行通信的场合,如任务A必须同时与任务B、任务C、任务D进行通信,其中任务B通过消息队列向任务A发送数据,其发送频率较低,它要求任务A必须及时进行处理;而任务C则只是向任务A指示一种状态,但频率很高;而任务D用来通知任务A释放动态申请的资源,并停止运行。在这种场合,事件机制能很好地解决问题。