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

📄 test0319.cpp

📁 应用小程序
💻 CPP
字号:
#include "vxWorks.h"
#include "msgQLib.h"
#include "taskLib.h"
#include "stdio.h"

#define NUM_CLIENT 4
#define STACK_SIZE 20000
#define DELAY_TICKS 50
#define MAX_MSGS 10
#define MAX_MSG_LEN 20
#define MID_CLIENT(id) id
#define MID_SERVER NUM_CLIENT

typedef struct _MESSAGE
{
	int midSend;
	int midReceive;
	int data;
}MESSAGE;

int tidServer;
int tidClient[NUM_CLIENT];
MSG_Q_ID msgQIdServer;
MSG_Q_ID msgQIdClient[NUM_CLIENT];

STATUS progStart();
STATUS progStop();
STATUS server();
STATUS client(int id);

STATUS progStart()
{
	int id;

	msgQIdServer = msgQCreate( MAX_MSGS, MAX_MSG_LEN, MSG_Q_PRIORITY );
	if( msgQIdServer == NULL )
	{
		return ERROR;
	}

	for( id = 0; id < NUM_CLIENT; id++ )
	{
		msgQIdClient[id] = msgQCreate( MAX_MSGS, MAX_MSG_LEN, MSG_Q_PRIORITY );
        if( msgQIdServer == NULL )
		{
			return ERROR;
		}
	}
	
	tidServer = taskSpawn( "tServer", 220, 0, STACK_SIZE, (FUNCPTR)server,
							0, 0, 0, 0, 0, 0, 0, 0, 0, 0 );
	for( id = 0; id < NUM_CLIENT; id++ )
	{
		char tempName[20];
		sprintf( tempName, "tClient%d", id );

		tidClient[id] = taskSpawn( tempName, 200, 0, STACK_SIZE, (FUNCPTR)client,
									id, 0, 0,  0, 0, 0, 0, 0, 0, 0 );
	}
	
	return OK;
} 

STATUS server()
{
	MESSAGE rxMsg;
	MESSAGE txMsg;
	
	FOREVER
	{
		if( msgQReceive( msgQIdServer, (char *)&rxMsg, MAX_MSG_LEN, WAIT_FOREVER)
				== ERROR )
		{
			return ERROR;
		}
		if( rxMsg.midReceive != MID_SERVER )
		{
			return ERROR;
		}
		if( rxMsg.midSend < MID_CLIENT(0) || rxMsg.midSend > MID_CLIENT(NUM_CLIENT - 1 ) )
		{
			return ERROR;
		}
		printf( "\ntServer: receive a data %d from tClient %d\n", rxMsg.data, rxMsg.midSend );
		
		txMsg.midSend = MID_SERVER;
		txMsg.midReceive = rxMsg.midSend;
		txMsg.data = rxMsg.data;
		if( msgQSend( msgQIdClient[rxMsg.midSend], (char *)&txMsg, sizeof(MESSAGE), WAIT_FOREVER,
				MSG_PRI_NORMAL ) == ERROR )
		{
			return ERROR;
		}
	}
	return OK;
}

STATUS client( int id )
{
	MESSAGE rxMsg;
	MESSAGE txMsg;

	FOREVER
	{
		txMsg.midSend = MID_CLIENT( id );
		txMsg.midReceive = MID_SERVER;
		txMsg.data = rand();
		if( msgQSend( msgQIdServer, (char *)&txMsg, sizeof(MESSAGE), WAIT_FOREVER,
				MSG_PRI_NORMAL ) == ERROR )
		{
			return ERROR;
		} 
		printf("\ntClient%d: transmit a data %d to tServer\n", id, txMsg.data );

		if( msgQReceive( msgQIdClient[id], (char *)&rxMsg, MAX_MSG_LEN, 20 ) == ERROR )
		{
			printf("\ntClient%d: wait  ACK timeout!!!\n", id);
			return ERROR;
		}

		printf("\ntClient%d: receive the ACK from tServer", id);
		if( txMsg.data == rxMsg.data )
		{
			printf(", and data check OK!\n");
		}
		else
		{
			printf(", but data check ERROR!!!\n");
			printf("txdata(%d) != ACKdata(%d)\n", txMsg.data, rxMsg.data);
		}

		taskDelay( DELAY_TICKS + txMsg.data % DELAY_TICKS );
	}
	
	return OK;
}

STATUS progStop()
{
	int id;

	taskDelete( tidServer );
	for( id = 0; id < NUM_CLIENT; id++ )
	{
		taskDelete( tidClient[id] );
	}

	msgQDelete( msgQIdServer );
	for( id = 0; id < NUM_CLIENT; id++ )
	{
		msgQDelete( msgQIdClient[id] );
	}

	printf("Bye bye!!!\n");
	return OK;
}
	

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -