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

📄 tasks.c

📁 练习多任务实时操作系统下Task 调度、Task 间主要通信手段、I/O 子系统基本应用 等内容
💻 C
字号:
#include "vxWorks.h"
#include "msgQLib.h"
#include "logLib.h"
#include "stdio.h"
#include "semLib.h"


/* 定义 */
#define MAX_MSGS	(10)
#define MAX_MSG_LEN	sizeof(MESSAGE)
#define STACK_SIZE	20000
#define DELAY_TICKS	50
#define MAX_LOG_MSGS 100

#define EXIT_STAT "$$EXIT$$"
#define FIRST_RUN "$$FIRST$$"
#define ACK "$$ACK$$"
#define INPUT_ERROR "Input error!\n"
#define LEN_ERROR "length error!\n"


#define MID_TASK1 1
#define MID_TASK2 2
#define MID_TASK3 3



#ifdef INCLUDE_LOGGING
logInit(consolefd, MAX_LOG_MSGS);
#endif

static int count = 1;

/*消息结构*/

typedef struct _MESSAGE
{
	int mSendId;
	int mRecvId;
	char *mData;
} MESSAGE;

/*消息队列*/

MSG_Q_ID msgQIdTask1;
MSG_Q_ID msgQIdTask2;
MSG_Q_ID msgQIdTask3;


/*信号量*/
SEM_ID semId = NULL;

/* task标识 */
int tidTask1;
int tidTask2;
int tidTask3;


/* 函数声明 */
STATUS progStart(void);
STATUS task1(void);
STATUS task2(void);
STATUS task3(void);
char *task2_toupper(char *);
char *task2_tolower(char *);
char *task2_toinvert(char *);
char invert(char);
void get_key(char *);
char *task2_calc(char *);

/**********************************************************************/
/**************************** 函数部分 ********************************/
/**********************************************************************/


/********************  系统初始化及运行 progStart() *******************/

STATUS progStart(void)
{

	semId = semBCreate(SEM_Q_PRIORITY,SEM_EMPTY);						/*创建同步信号量*/

	msgQIdTask1 = msgQCreate(MAX_MSGS, MAX_MSG_LEN, MSG_Q_PRIORITY);	/*创建Task1消息队列*/
	if(msgQIdTask1 == NULL)
		return (ERROR);

	msgQIdTask2 = msgQCreate(MAX_MSGS, MAX_MSG_LEN, MSG_Q_PRIORITY);	/*创建Task2消息队列*/
	if(msgQIdTask2 == NULL)
		return (ERROR);

	msgQIdTask3 = msgQCreate(MAX_MSGS, MAX_MSG_LEN, MSG_Q_PRIORITY);	/*创建Task3消息队列*/
	if(msgQIdTask3 == NULL)
		return (ERROR);


	tidTask2 = taskSpawn("tTask2", 200, 0, STACK_SIZE, (FUNCPTR)task2,	/*创建Task2进程 优先级200*/
		0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
	tidTask3 = taskSpawn("tTask3", 210, 0, STACK_SIZE, (FUNCPTR)task3,	/*创建Task3进程 优先级210*/
		0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
	tidTask1 = taskSpawn("tTask1", 220, 0, STACK_SIZE, (FUNCPTR)task1,	/*创建Task1进程 优先级220*/
		0, 0, 0, 0, 0, 0, 0, 0, 0, 0);

	return (OK);
}

/************************* 管理任务 Task1 ****************************/
/**************** console命令行接收任务 Task2 *******************/

STATUS task1(void)
{
	MESSAGE rxMsg;							/* 创建接收消息对象 */
	MESSAGE txMsg;							/* 创建发送消息对象 */

	/* 初始化发送消息(To Task2)*/
	txMsg.mSendId = MID_TASK1;				
	txMsg.mRecvId = MID_TASK2;
	txMsg.mData = FIRST_RUN;	

	/*           */ 
	msgQSend(msgQIdTask2, (char*)&txMsg, sizeof(MESSAGE), WAIT_FOREVER, MSG_PRI_NORMAL);
	printf("tTask1 activated,Flush Sem.\n");
	/* 初始化结束,发送信号量 */
	semFlush(semId);

	/* Task1循环体 */
	FOREVER
	{
		/* 对接收消息的合法性分析 */
		if(msgQReceive(msgQIdTask1, (char*)&rxMsg, MAX_MSG_LEN,	WAIT_FOREVER) == ERROR)
		{
			return (ERROR);
		}

		if(rxMsg.mRecvId != MID_TASK1)
		{
			return (ERROR);
		}

		if((rxMsg.mSendId < MID_TASK2) || (rxMsg.mSendId > MID_TASK3))
		{
			return (ERROR);
		}

		/* 若接收告警来自Task2 */
		if(rxMsg.mSendId == MID_TASK2)
		{
			if(rxMsg.mData == EXIT_STAT)
			{
				printf("tTask1: system is going to exit.\n");
				semDelete(semId);
				printf("tTask1: Delete SemId Success.\n");
				msgQDelete(msgQIdTask2);
				printf("tTask1: msgQIdTask2 deleted.\n");
				msgQDelete(msgQIdTask3);
				printf("tTask1: msgQIdTask3 deleted.\n");
				msgQDelete(msgQIdTask1);
				printf("tTask1: msgQIdTask1 deleted.\n");	

				taskDelete(tidTask2);
				printf("tTask1: Delete Task2 Success.\n");
				taskDelete(tidTask3);
				printf("tTask1: Delete Task3 Success.\n");
				taskDelete(tidTask1);
				printf("tTask1: Delete Task1 Success.\n");
				printf("BYE!~~\n");
			} 

			/* 一般警告 */
			if(rxMsg.mData == INPUT_ERROR)
			{
				printf("tTask1: receive the warnning from tTask2.\n#%d:",count);
      	 			logMsg(INPUT_ERROR,0,0,0,0,0,0); 
				++count;
				/* 给tTask2发送ACK信号 */
				txMsg.mData = ACK;
				if(msgQSend(msgQIdTask2, (char*)&txMsg, sizeof(MESSAGE), WAIT_FOREVER, MSG_PRI_NORMAL) == ERROR)
				{
					printf("tTask1: System failure!!\n");
					return (ERROR);
				}
			}
		}

		/* 若接收告警来自Task3 */
		if(rxMsg.mSendId == MID_TASK3)
		{
			printf("tTask1: receive the warnning from tTask3.\n#%d:",count);
			logMsg(LEN_ERROR,0,0,0,0,0,0); 
			++count;

			/* 给tTask2发送ACK信号 */
			txMsg.mData = ACK;
			if(msgQSend(msgQIdTask2, (char*)&txMsg, sizeof(MESSAGE), WAIT_FOREVER, MSG_PRI_NORMAL) == ERROR)
			{
				printf("tTask1: System failure!!\n");
				return (ERROR);
			}    
		}
	}
}


STATUS task2(void)
{
	
	MESSAGE rxMsg;							/* 创建接收消息对象 */
	MESSAGE txMsg;							/* 创建发送消息对象 */

	/* 初始化发送消息 */
	txMsg.mSendId = MID_TASK2;

	printf("tTask2 Initialized.\n");
	semTake(semId, WAIT_FOREVER);
	printf("tTask2 Activated!\n");
	taskDelay(5);
	FOREVER
	{
		char stat[128] = "";
		if(msgQReceive(msgQIdTask2, (char*)&rxMsg, MAX_MSG_LEN,	DELAY_TICKS * 2) == ERROR)
		{
			printf("tTask2: No response!\n");
		} else {
			if(rxMsg.mSendId == MID_TASK1 && rxMsg.mData == FIRST_RUN)
				printf("%s\n",FIRST_RUN);
			if(rxMsg.mSendId == MID_TASK1 && rxMsg.mData == ACK)
				printf("\ntTask2: receive ACK from tTask1\n");
			if(rxMsg.mSendId == MID_TASK3 && rxMsg.mData == ACK)
				printf("\ntTask2: receive ACK from tTask3\n");

			printf("tTask2: Please input the statment:(hello/upper/lower/invert/calc/exit)\n");
			get_key(stat);
			printf("tTask2: command received: %s\n", stat); 

			if (stat[0] == 'h'){
				txMsg.mData = "This is the introduction of the tasks...";
				txMsg.mRecvId = MID_TASK3;
				if(msgQSend(msgQIdTask3, (char*)&txMsg, sizeof(MESSAGE),
					WAIT_FOREVER, MSG_PRI_NORMAL) == ERROR)
				{
					printf("tTask2: System Error!\n");
					return (ERROR);
				}
			}
			else if (stat[0] == 'u'){
				printf("Please input a sentence to upper:\n");
				txMsg.mData = task2_toupper(stat);
				txMsg.mRecvId = MID_TASK3;
				if(msgQSend(msgQIdTask3, (char*)&txMsg, sizeof(MESSAGE),
					WAIT_FOREVER, MSG_PRI_NORMAL) == ERROR)
				{
					printf("tTask2: System Error!\n");
					return (ERROR);
				}
				fflush(stdin);
			}
			else if (stat[0] == 'l'){
				printf("Please input a sentence to lower:\n");
				txMsg.mData = task2_tolower(stat);
				txMsg.mRecvId = MID_TASK3;
				if(msgQSend(msgQIdTask3, (char*)&txMsg, sizeof(MESSAGE),
					WAIT_FOREVER, MSG_PRI_NORMAL) == ERROR)
				{
					printf("tTask2: System Error!\n");
					return (ERROR);
				}
				fflush(stdin);
			}
			else if (stat[0] == 'i'){
				printf("Please input a sentence to lnvert:\n");
				txMsg.mData = task2_toinvert(stat);
				txMsg.mRecvId = MID_TASK3;
				if(msgQSend(msgQIdTask3, (char*)&txMsg, sizeof(MESSAGE),
					WAIT_FOREVER, MSG_PRI_NORMAL) == ERROR)
				{
					printf("tTask2: System Error!\n");
					return (ERROR);
				}
				fflush(stdin);
			}

			else if(stat[0] == 'c') {
				prinft("tTask2: Please input a statment to calc:(eg. 15.1514+2516.24)\n");
				if((txMsg.mData = task2_calc(stat)) == INPUT_ERROR)
				{
					txMsg.mRecvId = MID_TASK1;
					if(msgQSend(msgQIdTask1, (char*)&txMsg, sizeof(MESSAGE),WAIT_FOREVER, MSG_PRI_NORMAL) == ERROR)
					{
						printf("tTask2: System Error!\n");
						return (ERROR);
					}
				} else {
					txMsg.mRecvId = MID_TASK3;
					if(msgQSend(msgQIdTask3, (char*)&txMsg, sizeof(MESSAGE),
					WAIT_FOREVER, MSG_PRI_NORMAL) == ERROR)
					{
						printf("tTask2: System Error!\n");
						return (ERROR);
					}
				}
				fflush(stdin);
			}

			else if (stat[1] == 'e'){
				printf("tTask2: System is going to EXIT\n");
				txMsg.mData = EXIT_STAT;
				txMsg.mRecvId = MID_TASK1;
				if(msgQSend(msgQIdTask1, (char*)&txMsg, sizeof(MESSAGE),WAIT_FOREVER, MSG_PRI_NORMAL) == ERROR)
				{
					printf("tTask2: System Error!\n");
					return (ERROR);
				}
			}
			else {
				txMsg.mData = INPUT_ERROR;
				txMsg.mRecvId = MID_TASK1;
				if(msgQSend(msgQIdTask1, (char*)&txMsg, sizeof(MESSAGE),WAIT_FOREVER, MSG_PRI_NORMAL) == ERROR)
				{
					printf("tTask2: System Error!\n");
					return (ERROR);
				}
				printf("tTask2: Input error!transmit a warnning to tTask1\n");
			}

		}
		taskDelay(DELAY_TICKS); 
	}
	return (OK);
}

STATUS task3(void)
{
	MESSAGE rxMsg;
	MESSAGE txMsg;

	txMsg.mSendId = MID_TASK3;
	txMsg.mRecvId = MID_TASK1;

	printf("tTask3 initialized.\n");
	semTake(semId, WAIT_FOREVER);
	printf("tTask3 activated.\n");

	FOREVER
	{
		if(msgQReceive(msgQIdTask3, (char*)&rxMsg,MAX_MSG_LEN, WAIT_FOREVER) == ERROR)
		{
			return (ERROR);
		}

		if(strlen(rxMsg.mData) == 0)
		{
			txMsg.mData = LEN_ERROR;
			txMsg.mRecvId = MID_TASK1;
			msgQSend(msgQIdTask1, (char*)&txMsg, sizeof(MESSAGE),WAIT_FOREVER, MSG_PRI_NORMAL);
			printf("\ntTask3: transmit a warnning to tTask1\n");
		} else {
			printf("tTask3 OUTPUT: %s\n" , rxMsg.mData);
			txMsg.mData = ACK;
			txMsg.mRecvId = MID_TASK2;
			if(msgQSend(msgQIdTask2, (char*)&txMsg, sizeof(MESSAGE),WAIT_FOREVER, MSG_PRI_NORMAL) == ERROR)
			{
				printf("tTask3: System error!\n");
				return (ERROR);
			}
		}
/*		taskDelay(DELAY_TICKS); */
	}

	return (OK);
}

char *task2_toupper(char *stat)
{
	char *s = stat;
	char c;
	while ( (c = getchar()) != '\n' && c != EOF)
	{
		*s++ = ( (c >= 'a' && c <= 'z') ? c - 32 : c);
	}
	*s = '\0';
	return stat;
}

char *task2_tolower(char *stat)
{
	char *s = stat;
	char c;
	while ( (c = getchar()) != '\n' && c != EOF)
	{
		*s++ = ( (c >= 'A' && c <= 'Z') ? c + 32 : c);
	}
	*s = '\0';
	return stat;
}

char *task2_toinvert(char *stat)
{
	char *s = stat;
	char c;
	while ( (c = getchar()) != '\n' && c != EOF)
		*s++ = invert(c);
	*s = '\0';
	return stat;
}

char invert(char c)
{
	if(c >= 'a' && c <='z')
		return c - 32;
	if(c >= 'A' && c <='Z')
		return c + 32;
}

void get_key(char *stat)
{
	char c;
	char *s = stat;
	while ( (c = getchar()) != '\n')
		*s++ = c;
	*s = '\0';
	return;
}

char *task2_calc(char *stat)
{
	double c1,c2;
	char op;
	scanf("%lf%c%lf",c1,op,c2);
	switch (op)	{
	case '+':
		c1 += c2;
		sprintf(stat, "%lf", c1);
		break;
	case '-':
		c1 -= c2;
		sprintf(stat, "%lf", c1);
		break;
	case '*':
		c1 *= c2;
		sprintf(stat, "%lf", c1);
		break;
	case '/':
		if(c2 == 0) { 
			printf("denominator cannot be 0.\n");
			return INPUT_ERROR;
		}
		c1 /= c2;
		sprintf(stat, "%lf", c1);
		break;
	case '%':
		if(c1 < 0 || c2 < 0) {
			printf("Numbers should above 0.\n");
			return INPUT_ERROR;
		}
		c1 %= c2;
		sprintf(stat, "%lf", c1);
		break;
	default:
		printf("Wrong input!\n");
		return INPUT_ERROR;
	}
	return stat;
}

⌨️ 快捷键说明

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