欢迎关注VxWorks567
如转发,请标明出处!
Event是一种高效的任务间同步机制,其实它还可以与某些资源同步(信号量与消息队列)。
使用xxEvStart()可以将当前任务注册到相应的资源上,当这个资源变为有效,且没有其它任务阻塞在这个资源上,系统就会给这个注册的任务发送Event。再结合Event的基本操作,就可以实现任务同时与多种资源的同步操作。
代码语言:javascript复制/* resource-related options */
#define EVENTS_OPTIONS_NONE 0x00
#define EVENTS_SEND_ONCE 0x01 /* unregister events after eventSend */
#define EVENTS_ALLOW_OVERWRITE 0x02 /* can overwrite previous registration */
#define EVENTS_SEND_IF_FREE 0x04 /* send events in xxxEvStart() */
STATUS semEvStart(SEM_ID semId, UINT32 events, UINT8 options);
STATUS semEvStop (SEM_ID semId);
STATUS msgQEvStart(MSG_Q_ID msgQId, UINT32 events, UINT8 options);
STATUS msgQEvStop (MSG_Q_ID msgQId);
看一个例子
代码语言:javascript复制/* Copyright 2020 VxWorks567 */
#include <stdio.h> /* printf() */
#include <eventLib.h> /* eventReceive() */
#include <semEvLib.h> /* semEvStart() */
#include <msgQEvLib.h>/* msgQEvStart() */
#define MSGS_NUM 5
#define MSG_LEN 5
static SEM_ID semId;
static MSG_Q_ID msgQId;
void testEvent()
{
_Vx_event_t eventsReceived;
/* 用二进制信号量表示一种资源 */
semId = semBCreate(SEM_Q_FIFO, SEM_EMPTY);
/* 将当前任务注册到该信号量 */
semEvStart(semId, VXEV01, EVENTS_OPTIONS_NONE);
/* 用消息队列表示一种资源 */
msgQId = msgQCreate(MSGS_NUM, MSG_LEN, MSG_Q_FIFO);
/* 将当前任务注册到该消息队列 */
msgQEvStart(msgQId, VXEV02, EVENTS_OPTIONS_NONE);
while(1)
{
/* 任一资源有效时,即进行处理 */
eventReceive(VXEV01|VXEV02, EVENTS_WAIT_ANY, WAIT_FOREVER, &eventsReceived);
if(eventsReceived&VXEV01)
{
/* 信号量有效,且无其它任务申请信号量 */
printf("ntsemphore is freen");
semTake(semId, WAIT_FOREVER);
}
else if(eventsReceived&VXEV02)
{
/* 新消息达到,且无其它任务读取消息 */
printf("ntmsgQ is freen");
msgQReceive(msgQId, NULL, 0, WAIT_FOREVER);
}
}
}
void freeSem()
{
/* 释放信号量,表示对应资源有效 */
semGive(semId);
}
void freeMsgQ()
{
/* 发送消息,表示对应资源有效 */
msgQSend(msgQId, 0, 0, 0, 0);
}
执行效果
我是泰山 专注VX 0x10年