📄 c04f_event.c
字号:
/* C04f_event.c P115 */
/* 头文件 */
#include "vxWorks.h"
#include "semLib.h"
#include "eventLib.h"
/* 宏定义 */
#define STACK_SIZE 20000 /* 分配给任务的堆栈大小 */
#define DELAY_TICKS 50 /* 信号量释放事件的间隔时间 */
/* 全局变量 */
int tidEventReceiver; /* 事件接收任务的ID*/
int tidSemHandler; /* 信号量处理任务的ID*/
SEM_ID semIdEventSender; /* 信号量资源ID,用来发送事件*/
/* 函数声明 */
STATUS eventReceiver(void);
void semHandler(void) ;
void progStop(void);
/******************************************************************
*
* progStart - 启动实例程序
*
* 负责创建信号量与任务
*
* RETURNS: OK, ERROR
*/
STATUS progStart(void)
{
/* 创建一个初始状态为空的二进制信号量资源,
* 用于反复释放事件
*/
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);
}
/******************************************************************
*
* eventReceiver - 接收事件
*
* 完成在信号量上的注册工作,
* 并完成接收事件的工作,包括来自信号量的事件与来自progStop()的事件
*
* RETURNS: OK, ERROR
*/
STATUS eventReceiver(void)
{
int result; /* 函数返回结果 */
UINT32 eventsReceived; /* 用来保存接收到的事件 */
/* 向信号量semIdEventSender进行注册 */
result = semEvStart(semIdEventSender, VXEV01,
EVENTS_OPTIONS_NONE);
if (result == OK)
{
printf("\ntEventReceiver: semEvStart() succ!\n");
}
else
{
printf("\ntEventReceiver: semEvStart() failed!\n");
return ERROR;
}
/* 接收、处理事件 */
FOREVER
{
result = eventReceive(VXEV01 | VXEV02, EVENTS_WAIT_ANY,
WAIT_FOREVER,
&eventsReceived);
if (result == OK)
{
printf("\ntEventReceiver: received events(VXEV%02d)!\n",
eventsReceived);
if ((eventsReceived & VXEV01) != 0)
{
/* 收到VXEV01,信号量变为可用 */
printf("\ntEventReceiver: semphone free!\n");
}
if ((eventsReceived & VXEV02) != 0)
{
/* 收到VXEV02,停止实例程序 */
/* 解除注册关系 */
result = semEvStop(semIdEventSender);
if (result == OK)
{
printf("\ntEventReceiver: semEvStop succ!\n");
}
else
{
printf("\ntEventReceiver: semEvStop fail!\n");
printf("\nterrno = %d\n", errnoGet());
}
/* 杀死tSemHandler */
taskDelete(tidSemHandler);
/* 释放信号量 */
semDelete(semIdEventSender);
/* 自杀 */
taskDelete(tidEventReceiver);
}
}
}
return (OK);
}
/******************************************************************
*
* semHandler - 处理信号量
*
* 通过反复释放、获取信号量,使得信号量周期释放事件
*
* RETURNS: N/A
*/
void semHandler(void)
{
FOREVER
{
/* 释放信号量,将信号量变为可用 */
semGive(semIdEventSender);
/* 获取信号量,将信号量变为不可用 */
semTake(semIdEventSender, NO_WAIT);
taskDelay(DELAY_TICKS);
}
return;
}
/******************************************************************
*
* progStop - 停止实例程序
*
* 调用本函数来结束本实例程序.
*
* RETURNS: N/A
*/
void progStop(void)
{
/* 向tEventReceiver发事件VXEV02
* 将结束实例的工作交给tEventReceiver处理
*/
eventSend(tidEventReceiver, VXEV02);
printf("BYE!\n");
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -