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

📄 hear.h

📁 这是嵌入式系统中关于理发师问题的源程序
💻 H
字号:
#include <vxWorks.h>
#include <sysLib.h>
#include <stdioLib.h> 
#include <msgQLib.h>
#define MAX_MESSAGES 5
#define MAX_MESSAGE_LENGTH 20
MSG_Q_ID msgCustomer;

/*定义一个消息结构体,用于向消息队列发送和从消息队列接收顾客的ID号*/
struct msg
{ 
 int CustomerID;
};

int currentCustomerID=0;                  /*表示当前正在理发的顾客的ID          */
int CustomerID=0;                       /*   表示光临的顾客的ID                */

/*理发师的任务*/  
void Barber()
{
  struct msg CustomerIDbuf;
  FOREVER
  {
	printf("*********************************************\n");
/*从消息队列接收消息,即从排队的顾客中挑选最前面的顾客进行服务                */
/*如果消息队列为空,表示没有顾客在等待                                        */
/*服务完一位顾客后就马上为第一位等待的顾客服务,并将相应的信息打印输出        */
/*假设一位顾客服务的时间为200 ticks                                            */
if(msgQReceive(msgCustomer,(char*)&CustomerIDbuf,sizeof(struct msg),NO_WAIT)==ERROR)
  	  { printf("No Customer here!\n"); }
  	else
  	  {
          if(currentCustomerID!=0)
             {printf("Customer %d left and ",currentCustomerID);}           
          currentCustomerID=CustomerIDbuf.CustomerID;
          printf("the current served Customer is Customer %d\n",CustomerIDbuf.CustomerID);
      }
 	printf("*********************************************\n");
    taskDelay(200);
  }
}

/*顾客的任务*/
void Customer()
{     
struct msg msgCustomerID;
	FOREVER
	{
/*顾客光临的时间间隔是随机的                                                 */
/*每来一位新顾客就使CustomerID加1,同时打印输出                             */
/*把进入排队的顾客的ID号作为一个消息发送到消息队列                          */
/*计算出消息队列里面的消息数目,即等待的顾客数目                             */
		taskDelay((rand())%500); 
		printf("*********************************************\n");
        printf("Customer %d is coming\n",++CustomerID);
        msgCustomerID.CustomerID=CustomerID;
if(msgQSend(msgCustomer,(char*)&msgCustomerID,sizeof(struct msg),NO_WAIT,0)==ERROR)
	          printf("a new Customer came but the waiting room was full,so he left\n");   
        printf("%d Customers are waiting\n",msgQNumMsgs(msgCustomer));
		printf("*********************************************\n");
    }
}

/*主程序,创建了一个消息队列,同时创建了Barber和Customer两个任务               */
int go()
{
       msgCustomer=msgQCreate(MAX_MESSAGES,MAX_MESSAGE_LENGTH,MSG_Q_FIFO);
       taskSpawn("Barber",105,0,5000,Barber,0,0,0,0,0,0,0,0,0,0);
       taskSpawn("Customer",105,0,5000,Customer,0,0,0,0,0,0,0,0,0,0);
}

⌨️ 快捷键说明

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