📄 multitask.txt
字号:
#include "vxWorks.h"
#include "stdio.h"
#include "stdlib.h"
#include "semLib.h"
#include "taskLib.h"
#include "sysLib.h"
#include "msgQLib.h"
#include "logLib.h"
/* defines */
#define STACK_SIZE 20000
#define MAX_MSGS (10)
#define MAX_MSG_LEN 400
#define DELAY_TICKS 50
/* typedefs */
/* globals */
SEM_ID dataSemId;
MSG_Q_ID msgQId1;
MSG_Q_ID msgQId2;
MSG_Q_ID msgQId3;
int tidtask1;
int tidtask2;
int tidtask3; /* Task IDs */
/* forward declarations */
int progStart (void);
int task1 (void);
int task2 (void);
int task3 (void);
void progStop (void);
/*************************************************************************
*
* progStart - start the sample program.
*
* Create various semaphores and spawn various tasks, while doing
* incredibly little error checking.
*
* RETURNS: OK
*/
int progStart (void)
{
dataSemId = semBCreate (SEM_Q_PRIORITY, SEM_EMPTY); /*创建二值常量*/
msgQId1 = msgQCreate(MAX_MSGS,MAX_MSG_LEN,MSG_Q_PRIORITY); /*创建task1的消息队列*/
if(msgQId1 == NULL)
{
return(ERROR);
}
msgQId2 = msgQCreate(MAX_MSGS,MAX_MSG_LEN,MSG_Q_PRIORITY); /*创建task2的消息队列*/
if(msgQId2 == NULL)
{
return(ERROR);
}
msgQId3 = msgQCreate(MAX_MSGS,MAX_MSG_LEN,MSG_Q_PRIORITY); /*创建task3的消息队列*/
if(msgQId3 == NULL)
{
return(ERROR);
}
/* get started */
tidtask1 = taskSpawn ("ttask1", 200, 0, STACK_SIZE, /*创建task1*/
(FUNCPTR) task1,0,0,0,0,0,0,0,0,0,0);
tidtask2 = taskSpawn ("ttask2", 200, 0, STACK_SIZE, /*创建task2*/
(FUNCPTR) task2,0,0,0,0,0,0,0,0,0,0);
tidtask3 = taskSpawn ("ttask3", 200, 0, STACK_SIZE, /*创建task3*/
(FUNCPTR) task3,0,0,0,0,0,0,0,0,0,0);
return;
}
/*************************************************************************
*/
int task1 (void)
{
char msgBuf1[MAX_MSG_LEN];
ioGlobalStdSet(STD_OUT,3); /*重定向,将输出值打印到Vxmin上*/
taskDelay(100);
semFlush(dataSemId); /*同步启动其他task*/
while(1)
{
memset(msgBuf1,0,MAX_MSG_LEN);
if(msgQReceive(msgQId1,msgBuf1,MAX_MSG_LEN,WAIT_FOREVER) == ERROR)
return (ERROR); /*接收其他task的告警信息*/
if(strcmp(msgBuf1,"End system\n") == 0) /*判断是否是系统退出指令*/
{
printf ("The End\n");
msgQDelete (msgQId1); /*删除消息队列*/
msgQDelete (msgQId2);
msgQDelete (msgQId3);
taskDelete(tidtask2); /*删除task*/
taskDelete(tidtask3);
taskDelete(tidtask1);
}
else
write(STD_OUT,msgBuf1,MAX_MSG_LEN); /*打印其他task传来的告警信息*/
}
return;
}
/*************************************************************************
*/
int task2(void)
{
char msgBuf2[MAX_MSG_LEN];
semTake(dataSemId,WAIT_FOREVER); /*接受task1的同步启动指令*/
while(1)
{
memset(msgBuf2,0,MAX_MSG_LEN);
if(read(STD_IN,msgBuf2,MAX_MSG_LEN) == ERROR) /*从console读进指令*/
return (ERROR);
if(strcmp(msgBuf2,"name\n") == 0) /*判断是否为命令1*/
{
strcpy(msgBuf2,"the name is:libing\n"); /*如果是命令1,则设置要打印的信息1*/
if(msgQSend(msgQId3,msgBuf2,sizeof(msgBuf2),WAIT_FOREVER,MSG_PRI_NORMAL) == ERROR)
return (ERROR); /*向task3发送*/
taskDelay(DELAY_TICKS);
}
else if(strcmp(msgBuf2,"number\n") == 0) /*判断是否为命令2*/
{
strcpy(msgBuf2,"the number is:086650\n"); /*如果是命令2,则设置要打印的信息2*/
if(msgQSend(msgQId3,msgBuf2,sizeof(msgBuf2),WAIT_FOREVER,MSG_PRI_NORMAL) == ERROR)
return (ERROR); /*向task3发送*/
taskDelay(DELAY_TICKS);
}
else if(strcmp(msgBuf2,"room\n") == 0) /*判断是否为命令3*/
{
strcpy(msgBuf2,"the room is:1422\n"); /*如果是命令3,则设置要打印的信息3*/
if(msgQSend(msgQId3,msgBuf2,sizeof(msgBuf2),WAIT_FOREVER,MSG_PRI_NORMAL) == ERROR)
return (ERROR); /*向task3发送*/
taskDelay(DELAY_TICKS);
}
else if(strcmp(msgBuf2,"phone\n") == 0) /*判断是否为命令4*/
{
strcpy(msgBuf2,"the phone is:6071\n"); /*如果是命令4,则设置要打印的信息4*/
if(msgQSend(msgQId3,msgBuf2,sizeof(msgBuf2),WAIT_FOREVER,MSG_PRI_NORMAL) == ERROR)
return (ERROR); /*向task3发送*/
taskDelay(DELAY_TICKS);
}
else if(strcmp(msgBuf2,"age\n") == 0) /*判断是否为命令5*/
{
strcpy(msgBuf2,"the age is:22\n"); /*如果是命令5,则设置要打印的信息5*/
if(msgQSend(msgQId3,msgBuf2,sizeof(msgBuf2),WAIT_FOREVER,MSG_PRI_NORMAL) == ERROR)
return (ERROR); /*向task3发送*/
taskDelay(DELAY_TICKS);
}
else if(strcmp(msgBuf2,"End system\n") == 0) /*判断是否为系统终止命令*/
{
if(msgQSend(msgQId1,msgBuf2,sizeof(msgBuf2),WAIT_FOREVER,MSG_PRI_NORMAL) == ERROR)
return (ERROR); /*向task1发送*/
taskDelay(DELAY_TICKS);
}
else if(strcmp(msgBuf2,"\n") == 00) /*判断指令是否为空*/
{
if(msgQSend(msgQId3,msgBuf2,sizeof(msgBuf2),WAIT_FOREVER,MSG_PRI_NORMAL) == ERROR)
return (ERROR); /*向task3转发*/
taskDelay(DELAY_TICKS);
}
else if(strlen(msgBuf2) > 25) /*判断指令是否超长*/
{
if(msgQSend(msgQId3,msgBuf2,sizeof(msgBuf2),WAIT_FOREVER,MSG_PRI_NORMAL) == ERROR)
return (ERROR); /*向task3转发*/
taskDelay(DELAY_TICKS);
}
else
{
strcpy(msgBuf2,"task2 command is wrong!\n"); /*如果不是以上情况,则task2接受的命令是错误的*/
if(msgQSend(msgQId1,msgBuf2,sizeof(msgBuf2),WAIT_FOREVER,MSG_PRI_NORMAL) == ERROR)
return (ERROR); /*向task1发送task2的错误命令*/
taskDelay(DELAY_TICKS);
}
}
return;
}
/*************************************************************************
*
* schlep - collect data into a sample to be processed
*
* Repeatedly, wait for and place NUM_SAMPLE data onto the list,
* then awaken the cruncher.
*/
int task3(void)
{
char msgBuf3[MAX_MSG_LEN];
char msgBuf[MAX_MSG_LEN];
semTake(dataSemId,WAIT_FOREVER); /*接受task1的同步启动指令*/
while(1)
{
memset(msgBuf3,0,MAX_MSG_LEN);
if(msgQReceive(msgQId3,msgBuf3,MAX_MSG_LEN,WAIT_FOREVER) == ERROR)
return (ERROR); /*接受来自task2的指令*/
if(strlen(msgBuf3) < 2 || strlen(msgBuf3)>25) /*判断指令是否超长或为空*/
{
strcpy(msgBuf,"task3 command is wrong!\n");
if(msgQSend(msgQId1,msgBuf,sizeof(msgBuf),WAIT_FOREVER,MSG_PRI_NORMAL) == ERROR)
return (ERROR); /*向task1发送出错信息*/
taskDelay(DELAY_TICKS);
}
else
{
write(STD_OUT,msgBuf3,MAX_MSG_LEN); /*如果没有错误,则将信息从console打印出来*/
}
}
return;
}
/*************************************************************************
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -