#include
#include
#include "vxWorks.h"
#include "msgQLib.h"
#include "taskLib.h"
/*#include "memPartLib.h"*/
#include "memLib.h"
/*宏定义*/
#define MAX_MSGS (10) /* the length of msg*/
#define MAX_MSG_LEN sizeof(MESSAGE) /*the length of message*/
#define STACK_SIZE 20000 /*the stack size of task*/
#define DELAY_TICKS 50 /*the time of sending message*/
#define MAX_point 5 /*用户从系统内存池中获得内存的最大次数*/
#define size_1 30 /*用户分区的分配的大小*/
#define size_2 40
/*全局变量*/
int tidtask1;
int tidtask2;
int tidtask3;
SEM_ID syncSemId;
SEM_ID waitSemId;
MSG_Q_ID myMsgQId1;
MSG_Q_ID myMsgQId2;
MSG_Q_ID myMsgQId3;
typedef struct _MESSAGE
{
int mSendId; /*发送任务 ID*/
int mRecvId; /*接收任务 ID*/
int mData; /*消息中传递的数据*/
char Data[14];
} MESSAGE;
/*内存管理*/
char* usermem1;
char* usermem2;
MESSAGE *point1[MAX_point];
MESSAGE *point2[MAX_point];
MESSAGE *point3[MAX_point];
int point1_index=0;
int point2_index=0;
int point3_index=0;
PART_ID partid1;
PART_ID partid2;
#define MID_MESSAGE(id) (id)
/*函数声明*/
int start(void);
int task1(void);
int task2(void);
int task3(void);
template T* mymalloc(unsigned nBytes);
void myfree(void);
void bye(void);
/***************************************[progStart]*******************************************/
/*启动程序,创建息队例,任务*/
int start(void)
{
tidtask1=taskSpawn("tTask1", 220, 0, STACK_SIZE,
(FUNCPTR)task1,0,0,0,0,0,0,0,0,0,0);
usermem1=malloc(200);
partid1=memPartCreate(usermem1,200);
usermem2=malloc(400);
partid2=memPartCreate(usermem2,400);
return;
}
/**************************************[test_end]********************************************/
/*是否相等,相等返回1*/
int test_end(char *end,char *target)
{
int ret;
if(!strcmp(end,target))
ret=1;
else
ret=0;
return ret;
}
/****************************************[task1]***********************************************/
/*管理Task。负责系统启动时同步系统中其他Task的启动同步,利用信号量的semFlush()完成。同时接收各*/
/*Task的告警信息,告警信息需编号以logmsg方式输出。本task负责系统结束时的Task删除处理*/
int task1(void)
{
int singal;
int message;
MESSAGE *rxMsg=mymalloc(26); /*define messages,and alloc memory*/
memset(rxMsg,0,26);
syncSemId=semBCreate(SEM_Q_FIFO,SEM_EMPTY); /*creat semaphore*/
waitSemId=semBCreate(SEM_Q_PRIORITY,SEM_EMPTY);
myMsgQId1=msgQCreate(MAX_MSGS,MAX_MSG_LEN,MSG_Q_PRIORITY); /*create msgQ*/
myMsgQId2=msgQCreate(MAX_MSGS,MAX_MSG_LEN,MSG_Q_PRIORITY);
myMsgQId3=msgQCreate(MAX_MSGS,MAX_MSG_LEN,MSG_Q_PRIORITY);
tidtask2=taskSpawn("tTask2", 200, 0, STACK_SIZE,
(FUNCPTR)task2,0,0,0,0,0,0,0,0,0,0); /*create task*/
tidtask3=taskSpawn("tTask3", 210, 0, STACK_SIZE,
(FUNCPTR)task3,0,0,0,0,0,0,0,0,0,0);
printf("Please input one of the following commands:add,sub,multiply,divide,testcommand\n");
/*the command we should put into the console*/
semFlush(syncSemId); /*release semaphore*/
semGive(waitSemId);
while(1)
{
singal=1;
msgQReceive(myMsgQId1,(char*)&rxMsg,sizeof(rxMsg),WAIT_FOREVER);
if(rxMsg->mRecvId==MID_MESSAGE(3)) /*receive MsgQ from task3*/
{
singal=test_end(rxMsg->Data,"wrong length")-1;
logMsg("task3 receiveing a:%s\n",rxMsg->Data); /*put the warn from task3*/
logMsg("Please reput the other command!\n");
msgQReceive(myMsgQId1,(char*)&rxMsg,MAX_MSG_LEN,WAIT_FOREVER); /*recive MsgQ from task3*/
}
if(rxMsg->mRecvId==MID_MESSAGE(2)) /*receive MsgQ from task2*/
{
message=test_end(rxMsg->Data,"sysend");
if(message)
{ /*if the message from task2 is "sysend" and did not receive the warn from task3, close the system*/
if(singal)
{
bye();
}
}
else
{/*if the message from task2 is "sysend" and receive the warn from task3, reput the command*/
if(singal)
logMsg("task2 receiveing a %s\n",rxMsg->Data);
logMsg("please reput the correct command!\n");
}
}
}
return;
}
/********************************************************************************************/
int change_buf(char *command)
{
int ret;
if(!strcmp(command,"add"))
ret=1;
else if(!strcmp(command,"sub"))
ret=2;
else if(!strcmp(command,"multiply"))
ret=3;
else if(!strcmp(command,"divide"))
ret=4;
else if(!strcmp(command,"testcommand"))
ret=5;
else
ret=0;
return ret;
}
/****************************************[task2]*********************************************/
/*console 命令行接收Task。接收并分析console发来的命令行及参数。自行设置5种以上命令,并根据命*/
/*令的内容向Task3发送激励消息。同时实现系统退出命令,使系统采用适当方式安全退出。收到非法命令*/
/*向Task1告警*/
int task2(void)
{
char buf[100];
int command;
char *str=mymalloc(35);
MESSAGE *txMsg=mymalloc(26);
memset(str,0,35);
memset(txMsg,0,26);
txMsg->mSendId=MID_MESSAGE(2);
txMsg->mRecvId=MID_MESSAGE(2);
FOREVER
{
semTake(syncSemId,WAIT_FOREVER);
semTake(waitSemId,WAIT_FOREVER);
gets(buf);
command=change_buf(buf);/*change the commands into numbers*/
switch(command)
{
case 0:/*receive uncorrect command*/
txMsg->mData=0;
strcpy(txMsg->Data,"wrong command");/*send warn to task1*/
msgQSend(myMsgQId1,(char*)&txMsg,sizeof(txMsg),WAIT_FOREVER,MSG_PRI_NORMAL);
break;
case 1:/*receive add command*/
strcpy(str,"This an add caculate!\0");
txMsg->mData=1;
break;
case 2:/*receive sub command*/
strcpy(str,"This a sub caculate!\0");
txMsg->mData=2;
break;
case 3:/*receive multiply command*/
strcpy(str,"This a multiply caculate!\0");
txMsg->mData=3;
break;
case 4:/*receive divide command*/
strcpy(str,"This a divide caculate!\0");
txMsg->mData=4;
break;
case 5:/*receive testcommand,send a long string to task3*/
strcpy(str,"This a testcommand to warn task1!\0");
txMsg->mData=5;
break;
default:
break;
}
if(txMsg->mData!=0)
{/*send along string to task3,and send a message to taks3*/
msgQSend(myMsgQId3,(char*)&str,sizeof(str),WAIT_FOREVER,MSG_PRI_NORMAL);
msgQSend(myMsgQId3,(char*)&txMsg,sizeof(txMsg),WAIT_FOREVER,MSG_PRI_NORMAL);
}
semGive(waitSemId);
semGive(syncSemId);
taskDelay(DELAY_TICKS);
if(txMsg->mData!=0)
{/*send sysend to task1 to let task1 close system*/
strcpy(txMsg->Data,"sysend");
msgQSend(myMsgQId1,(char*)&txMsg,sizeof(txMsg),WAIT_FOREVER,MSG_PRI_NORMAL);
}
}
return;
}
/****************************************[task3]********************************************/
/*console输出Task。接收需打印输出的字串消息(命令),输出到console。收到长度为0或超常字串向*/
/*Task1告警*/
int task3(void)
{
int firstData=100;
int secondData=10;
MESSAGE *rxMsg=mymalloc(26);
MESSAGE *txMsg=mymalloc(26);
char *rstr=mymalloc(35);
memset(txMsg,0,26);
memset(txMsg,0,26);
memset(rstr,0,35);
txMsg->mSendId=MID_MESSAGE(3);
txMsg->mRecvId=MID_MESSAGE(3);
while(1)
{
semTake(syncSemId,WAIT_FOREVER);
msgQReceive(myMsgQId3,(char*)&rstr,sizeof(rstr),WAIT_FOREVER);
if(strlen(rstr)=26)
{/*make sure whether the string is too long or short*/
strcpy(txMsg->Data,"wrong length");
msgQSend(myMsgQId1,(char*)&txMsg,sizeof(txMsg),WAIT_FOREVER,MSG_PRI_NORMAL);
/*msgQReceive(myMsgQId3,(char*)&rxMsg,sizeof(rxMsg),WAIT_FOREVER);*/
}
semTake(waitSemId,WAIT_FOREVER);
msgQReceive(myMsgQId3,(char*)&rxMsg,sizeof(rxMsg),WAIT_FOREVER);
if(rxMsg->mData!=5)
{/*when it is not testcommand,printf these*/
printf("%s\n",rstr);
printf("there are two datas!\n");
printf("firstData:100\n");
printf("secondData:10\n");
}
switch(rxMsg->mData)
{
case 1:/*printf add caculate*/
printf("The result is:%d\n",firstData+secondData);
break;
case 2:/*printf sub caculate*/
printf("The result is:%d\n",firstData-secondData);
break;
case 3:/*printf multiply caculate*/
printf("The result is:%d\n",firstData*secondData);
break;
case 4:/*printf divide caculate*/
printf("The result is:%d\n",firstData/secondData);
break;
case 5:
break;
default:
break;
}
semGive(waitSemId);
semGive(syncSemId);
taskDelay(DELAY_TICKS);
}
return;
}
template T* mymalloc(unsigned nBytes)
{
T* point;
int i=0; /*用户分区一是否能分配的标志位*/
int j=0; /*用户分区二是否能分配的标志位*/
if(nBytes=size_1 && nBytes=size_2) && point3_index<MAX_point)
/*若用户分区二不能分配,由系统内存池来分配,且只能从系统内存池中分配MAX_point次*/
{
point=malloc(nBytes);
point3[point3_index]=point;
printf("the number of the point3_index is:%d\n",point3_index);
point3_index++;
}
return point;
}
void myfree(void)
{
int i=0;
for (i=0;i<point1_index;i++)
{
memPartFree(partid1,point1[i]);
}
for (i=0;i<point2_index;i++)
{
memPartFree(partid2,point2[i]);
}
for (i=0;i<point3_index;i++)
{
free(point3[i]);
}
free(usermem1);
free(usermem2);
printf("The memory have freed!\n");
}
void bye(void)
{
myfree();
logMsg("Bye-bye\n");
taskDelete(tidtask2);
taskDelete(tidtask3);
msgQDelete(myMsgQId1);
msgQDelete(myMsgQId2);
msgQDelete(myMsgQId3);
semDelete(syncSemId);
taskDelete(tidtask1);
}