📄 event.c
字号:
/*
该实验是一个任务间通信的事件通信实验程序,用来说明如何注册、发送、接受事件。
progStart()、progStop()分别用来停止、启动本演示程序。
progStop()只是事件接受任务TeventReceiver()发送一个事件,然后将停止演示的工作交给TeventReceiver()来具体实施。
TeventReceiver()任务将在信号量上进行注册,并完成事件注册的工作(包括来自信号量的事件与来自progStop()的事件)。
tSemHandler为信号量处理任务。它通过反复释放、获取信号量来使得信号量周期性地发出事件。
通过progStart()来启动实例程序。启动过程中,先创建信号量资源,
再创建任务,以保证资源在被任务使用之前已经创建。
eventReceiver()完成事件接受工作。EventReceiver()在信号量上的注册工作,然后通过eventReceiver()来接受事件,当无事件到来时阻塞等待。本实例杂中eventReceiver()处理了两类事件:VXEV01VXEV02.VXEV01为来自信号量的事件,说明信号量变为可用,eventReceiver()将打印一些简单的信息。VEXV02为progStop()发出的事件,说明用户发出了停止实例程序的指令,eventReceiver()将完成停止演示程序的工作。
SemHandler()完成信号量的处理工作。SemHandler通过反复释放、获取信号量,制造出信号量反复由不可用变为可用的情形,使得信号量周期性地释放事件。
progStop()只是向事件接受任务TeventReceiver()发送特定的事件VEXV02,将停止演示程序的工作交给了TeventReceiver()。
*/
#include "vxworks.h"
#include "semLib.h"
#include "eventLib.h"
/* 定义任务堆栈大小*/
#define STACK_SIZE 20000
/*定义任务延迟时间*/
#define DELAY_TICKS 50
/*定义任务ID*/
int tidEventReceiver;
int tidSemHandler;
/*定义信号量ID*/
SEM_ID semIdEventSender;
STATUS progStart(void);
void semHandler(void);
STATUS eventReceiver(void);
void progStop(void);
STATUS progStart(void)
{
/*创建信号量,信号量初始为0*/
semIdEventSender = semBCreate(SEM_Q_FIFO, SEM_EMPTY);
if (semIdEventSender == NULL)
{
return(ERROR);
}
/*创建任务*/
tidEventReceiver = taskSpawn("tEventReceiver", 200 , 0, STACK_SIZE, (FUNCPTR)eventReceiver, 0,0,0,0,0,0,0,0,0,0);
tidSemHandler = taskSpawn("tSemHandler", 220 , 0, STACK_SIZE, (FUNCPTR)semHandler, 0,0,0,0,0,0,0,0,0,0);
return OK;
}
STATUS eventReceiver(void)
{
int result;
UINT32 eventReceiverd;
/*向信号量semIdEventSender注册*/
result = semEvStart(semIdEventSender, VXEV01, EVENTS_OPTIONS_NONE);
if (result == OK)
{
printf("\n Event Receiver: SemEvStart() succ! \n");
}
else
{
printf("\n Event Receiver: SemEvStart() error! \n");
return ERROR;
}
FOREVER
{
/*接受时间。其中第一个参数参数规定了需要接受的事件号,
第二个参数的用法比较复杂,涉及到EVENTS_WAIT_ANY、EVENTS_WAIT_ALL、EVENTS_RETURN_ALL以及EVENTS_FETCH四种取值,
此处取值表示只要有一个事件发生就响应事件
第三个参数即timeout,其含义与信号量、消息队列等章节中含义相同,
第四个用来指向保存ecentReceiver()接受到的信号的变量。
*/
result = eventReceive(VXEV01 | VXEV02, EVENTS_WAIT_ANY, WAIT_FOREVER, &eventReceiverd);
if (result == OK)
{
printf("\n EventReceiver: receive events (VXEV%02d)!\n" , eventReceiverd);
/*若接收到的事件为VXEV01,输出信息*/
if (eventReceiverd == VXEV01)
{
printf("\n tEventReceiver: semphone free! \n");
}
/*若接收到的事件为VXEV02,终止任务运行*/
if (eventReceiverd == VXEV02)
{
/*停止信号量事件通知进程*/
result = semEvStop(semIdEventSender);
if (result == OK)
{
printf("\n tEventReceiver: semEvstop succ !\n");
}
else
{
printf("\n tEventReceiver: semEvstop fail !\n");
printf("\n terrno = %d\n", errnoGet());
}
/*删除任务*/
taskDelete(tidSemHandler);
taskDelete(semIdEventSender);
taskDelete(tidEventReceiver);
}
}
}
return OK;
}
void semHandler(void)
{
FOREVER
{
/*释放信号量,将信号量变为可用,此处事件通知进程将向注册的任务发送通知*/
semGive(semIdEventSender);
/*获取信号量,信号量不可用*/
semTake(semIdEventSender, NO_WAIT);
/*任务延迟*/
taskDelay(DELAY_TICKS);
}
return ;
}
void progStop(void)
{
/*向tidEventReceiver任务发送VXEV02事件*/
eventSend(tidEventReceiver, VXEV02);
printf("\n BYE \n");
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -