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

📄 multitask.txt

📁 多任务及任务间通信。由任务得到consle的命令
💻 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 + -