📄 tasks.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 + -