VxWorks 信号量/消息队列发送事件

本文介绍了使用信号量和消息队列实现任务间通信及同步的机制,详细阐述了任务A、任务B和任务C如何通过注册信号量事件和消息队列事件进行交互,以及任务C如何操作信号量和消息队列完成数据传递。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/*
 * 信号量和消息队列发送事件
 * 任务A接收信号量事件
 * 任务B接收消息队列事件
 * 任务C操作信号量和消息队列
 */
#include<vxworks.h>    
#include<semLib.h>
#include<semEvLib.h>
#include<msgQEvLib.h>
#include<eventLib.h>
#include<taskLib.h>
#include<stdio.h>
#include<unistd.h>
#include<msgQLib.h>
/* 定义任务堆栈大小*/
#define STACK_SIZE 20000
/*定义任务*/
int taskA_ID;
int taskB_ID;
int taskC_ID;
/*定义信号量ID*/
SEM_ID semId;
/*消息队列ID*/
MSG_Q_ID msgId;

void taskA();
void taskB();
void taskC();

STATUS taskDemo(void) {

	/*创建任务*/
	taskA_ID = taskSpawn("EventReceiver", 200, 0, STACK_SIZE, (FUNCPTR)taskA,
			0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
	taskB_ID = taskSpawn("Sem", 200, 0, STACK_SIZE, (FUNCPTR)taskB, 0,
			0, 0, 0, 0, 0, 0, 0, 0, 0);
	taskC_ID = taskSpawn("EventReceiver2", 200, 0, STACK_SIZE, (FUNCPTR)taskC, 0,
				0, 0, 0, 0, 0, 0, 0, 0, 0);

	/*创建信号量,信号量初始为0*/
	semId = semBCreate(SEM_Q_FIFO, SEM_EMPTY);

	if (semId == NULL) {
		return (ERROR);
	}
	/*创建消息队列*/
	msgId=msgQCreate(10,255,MSG_Q_PRIORITY);
	return OK;
}

void taskA() {
	UINT32 eventReceiver;
	/*任务A在资源<二进制信号量semId>上注册,如果资源(信号量)发生变化,则任务会收到相应的事件*/
	semEvStart(semId, VXEV01|VXEV02, EVENTS_OPTIONS_NONE);

	/*接收事件*/
	while(1)
	{
	eventReceive(VXEV01,EVENTS_OPTIONS_NONE,WAIT_FOREVER,&eventReceiver);
	if (eventReceiver == VXEV01) {
		printf("[TaskA]:Receive Event01!\n");
	}
	}

}

void taskB() {
	
	UINT32 eventReceiver;
		/*任务A在资源<二进制信号量semId>上注册,如果资源(信号量)发生变化,则任务会收到相应的事件*/
		msgQEvStart(msgId,VXEV02,EVENTS_OPTIONS_NONE);
		/*接收事件*/
		while(1)
		{
		eventReceive(VXEV02,EVENTS_OPTIONS_NONE,WAIT_FOREVER,&eventReceiver);
		if (eventReceiver == VXEV02) {
			printf("[TaskB]:Receive Event02!\n");
		}
		}
}

void taskC() {

	char buf[]="hello";
	sleep(2);
	
	
	while(1){
		/*释放信号量,二进制信号量在空闲时(无任务占有时)才会发送事件*/
	printf("[SEM]Free semphone!\n");
	semGive(semId);
	sleep(1);
	semTake(semId, WAIT_FOREVER);
	sleep(1);
	/*向消息队列写入消息*/
	printf("[MSG]write to msgQ!\n");
	msgQSend(msgId,buf,sizeof(buf),WAIT_FOREVER,MSG_PRI_NORMAL);
	sleep(1);
	}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值