EventLib в VxWorks похож на signal () в unix - он может указывать другому потоку, что что-то произошло. Если вам нужно передать данные вместе с событием, вы можете вместо этого использовать очереди сообщений.
События являются «глобальными» между отправителем и получателем. Поскольку каждый отправитель указывает, для какой задачи предназначено событие, в системе может быть несколько масок событий, причем каждая пара отправитель / получатель имеет свою собственную интерпретацию.
Базовый пример:
#define EVENT1 0x00000001
#define EVENT2 0x00000002
#define EVENT3 0x00000004
...
#define EVENT_EXIT 0x80000000
/* Spawn the event handler task (event receiver) */
rcvTaskId = taskSpawn("tRcv",priority,0,stackSize,handleEvents,0,0,0,0,0,0,0,0,0,0);
...
/* Receive thread: Loop to receive events */
STATUS handleEvents(void)
{
UINT32 rcvEventMask = 0xFFFFFFFF;
while(1)
{
UINT32 events = 0;
if (eventReceive(rcvEventMask. EVENTS_WAIT_ANY, WAIT_FOREVER, &events) == OK)
{
/* Process events */
if (events & EVENT1)
handleEvent1();
if (events & EVENT2)
handleEvent2();
...
if (events & EVENT_EXIT)
break;
}
}
return OK;
}
Отправителем события обычно является аппаратный драйвер (BSP) или другой поток. Когда происходит желаемое действие, драйвер создает маску всех соответствующих событий и отправляет их в задачу получателя.
Отправителю необходимо получить идентификатор задачи получателя. TaskID может быть глобальным,
int RcvTaskID = ERROR;
...
eventSend(RcvTaskID, eventMask);
может быть зарегистрирован получателем в задаче водителя / отправителя,
static int RcvTaskID = ERROR;
void DRIVER_setRcvTaskID(int rcvTaskID)
{
RcvTaskID = rcvTaskID;
}
...
eventSend(RcvTaskID, eventMask);
или задача «драйвер / отправитель» может вызвать метод API получателя для отправки события (оболочки).
static int RcvTaskID;
void RECV_sendEvents(UINT32 eventMask)
{
eventSend(RcvTaskID, eventMask);
}