⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 event.c

📁 vxworks事件代码
💻 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 + -