logo资料库

哲学家就餐问题.doc

第1页 / 共21页
第2页 / 共21页
第3页 / 共21页
第4页 / 共21页
第5页 / 共21页
第6页 / 共21页
第7页 / 共21页
第8页 / 共21页
资料共21页,剩余部分请下载后查看
uC/OS 哲学家就餐问题 2011-06-25 21:44 #include "includes.h" /*my define*/ #define NUM #define FOOD INT8U id; #define LEFT(x) (x) #define RIGHT(x) (((x)+1)%NUM) OS_FLAG_GRP *Sem_F; //static int food[NUM]; //static int stick[NUM]; 3 /*number of people*/ 5 /*number of food*/ /* identifier of left chops*/ /* identifier of right chops*/ /*发送筷子使用状态*/ /*剩余食物的数量*/ /*记录筷子被那个哲学家拿走*/ /*剩余食物的数量 //这个地方用的全局变量,还可以用共享内存来实现 /*记录筷子被那个哲学家拿走*/ static int food[NUM]={3,3,3}; */ 任务间数据的共享 static int stick[NUM]={-1,-1,-1}; char *s; char *fd1="Task1 number of left foods"; char *fd2="Task2 number of left foods"; char *fd3="Task3 number of left foods"; /*end of my define*/ #define TASK_STK_SIZE 512 //任务堆栈长度 OS_STK OS_STK OS_STK OS_STK INT16S INT8U INT8U StartTaskStk[TASK_STK_SIZE]; Task1Stk[TASK_STK_SIZE]; Task2Stk[TASK_STK_SIZE]; Task3Stk[TASK_STK_SIZE]; key; //定义任务堆栈区 //定义任务堆栈区 //定义任务堆栈区 //定义任务堆栈区 //用于退出 uCOS_II 的键 err; x=0,y=0; //字符显示位置 StartTask(void *data); Task1(void *data); Task2(void *data); Task3(void *data); void void void void /*start of my define*/ //声明任务 //声明任务 //声明任务 //声明任务 /************************主函数 *********************************************/
main (void) void { //char* s_M="M"; //定义要显示的字符 int i; /* //初始化食物的数量和筷子的使/ for(i=0;i
OS_EXIT_CRITICAL(); OSStatInit(); //初始化 uCOS_II 的统计任务 OSTaskCreate(Task1, //创建任务 MyTask (void*)0, &Task1Stk[TASK_STK_SIZE - 1], 2); //给任务传递参数 //设置任务堆栈栈顶指针 OSTaskCreate(Task2, //创建任务 MyTask (void*)0, &Task2Stk[TASK_STK_SIZE - 1], 3); //给任务传递参数 //使任务 MyTask 的优先级别为 2 //设置任务堆栈栈顶指针 OSTaskCreate(Task3, //创建任务 MyTask //给任务传递参数 (void*)0, &Task3Stk[TASK_STK_SIZE - 1], 4); //使任务 MyTask 的优先级别为 2 //设置任务堆栈栈顶指针 for (;;) { //如果按下 Esc 键则退出 uCOS_II if (PC_GetKey(&key) == TRUE) { if (key == 0x1B) { } } PC_DOSReturn(); OSTimeDly(100); //延时 100 个时钟节拍 } } /***********************任务 Task1*******************************************/ Task1 (void *pdata) void { char* T1="i'm the task1"; //定义要显示的字符 #if OS_CRITICAL_METHOD == 3 OS_CPU_SR cpu_sr; #endif pdata = pdata;
for (;;) { PC_DispStr(0, y++, //显示字符的位置 T1, DISP_BGND_BLACK+DISP_FGND_WHITE ); while(food[0]>0) { // OSTimeDly(100); //延时 100 个时钟节拍 OSTimeDlyHMSM(0,0,1,0); // OS_ENTER_CRITICAL(); (OS_FLAGS)1, OSFlagPend( Sem_F, OS_FLAG_WAIT_SET_ALL, 0, ); 边筷子有效 &err stick[0]=0; //左 察现? 0, ); // OSTimeDlyHMSM(0,0,1,0); //可以将这个地方去掉观 OSFlagPend( Sem_F, (OS_FLAGS)2, OS_FLAG_WAIT_SET_ALL, &err stick[1]=1; //右边筷子有效 food[0]--; // OS_EXIT_CRITICAL(); PC_DispStr(0, y, //显示字符的位置 fd1, DISP_BGND_BLACK+DISP_FGND_WHITE ); sprintf(s,"%d",food[0]); PC_DispStr(x+30, y++, //显示字符的位置 s,
DISP_BGND_BLACK+DISP_FGND_WHITE ); OSTimeDlyHMSM(0,0,1,0); stick[0]=-1; //放下左边筷子 //打 OSFlagPost( (OS_FLAGS)1, //打印 &err Sem_F, OS_FLAG_SET, stick[1]=-1; //放下右边筷子 //打印筷子现状 OSFlagPost( (OS_FLAGS)2, }//while() Sem_F, OS_FLAG_SET, &err 印 food 筷子现状 ); ); OSTimeDly(1000); } //延时 100 个时钟节拍 } /************************任务 Task2*****************************************/ void { Task2 (void *pdata) //定义要显示的字符 char* T2="i'm the task2"; #if OS_CRITICAL_METHOD == 3 OS_CPU_SR cpu_sr; #endif pdata = pdata;
for (;;) { PC_DispStr(0, y++, //显示字符的位置 T2, DISP_BGND_BLACK+DISP_FGND_WHITE ); while(food[1]>0) { 节拍 0, &err ); 0, &err ); OSTimeDly(100); //延时 100 个时钟 //OSTimeDlyHMSM(0,0,1,0); OSFlagPend( Sem_F, (OS_FLAGS)2, OS_FLAG_WAIT_SET_ALL, stick[1]=1; //左边筷子有效 //OSTimeDlyHMSM(0,0,1,0); OSFlagPend( Sem_F, (OS_FLAGS)4, OS_FLAG_WAIT_SET_ALL, stick[2]=2; food[1]--; //右边筷子有效 //打印 food PC_DispStr(0, y, fd2, DISP_BGND_BLACK+DISP_FGND_WHITE ); //显示字符的位置 sprintf(s,"%d",food[1]); PC_DispStr(x+30, y++, //显示字符的位置 s, DISP_BGND_BLACK+DISP_FGND_WHITE ); OSTimeDlyHMSM(0,0,1,0); stick[1]=-1; //放下左边筷子
筷子现状 OSFlagPost( (OS_FLAGS)2, //打印 &err Sem_F, OS_FLAG_SET, ); ); stick[2]=-1; //放下右边筷子 //打印筷子现状 OSFlagPost( Sem_F, OS_FLAG_SET, &err (OS_FLAGS)4, } OSTimeDly(1000); //延时 500 个时钟节拍 } } /************************任务 YouTask*****************************************/ void { Task3 (void *pdata) char* T3="i'm the task3"; //定义要显示的字符 #if OS_CRITICAL_METHOD == 3 OS_CPU_SR cpu_sr; #endif pdata = pdata; for (;;) { PC_DispStr(0, y++, //显示字符的位置 T3, DISP_BGND_BLACK+DISP_FGND_WHITE ); while(food[2]>0) { 节拍 OSTimeDly(100); //延时 100 个时钟
//OSTimeDlyHMSM(0,0,1,0); OSFlagPend( Sem_F, (OS_FLAGS)4, OS_FLAG_WAIT_SET_ALL, stick[2]=2; //左边筷子有效 //OSTimeDlyHMSM(0,0,1,0); OSFlagPend( Sem_F, (OS_FLAGS)1, OS_FLAG_WAIT_SET_ALL, stick[0]=0; //右边筷子有效 food[2]--; //打印 food PC_DispStr(0, y, //显示字符的位置 fd3, DISP_BGND_BLACK+DISP_FGND_WHITE ); sprintf(s,"%d",food[2]); PC_DispStr(x+30, y++, //显示字符的位置 s, DISP_BGND_BLACK+DISP_FGND_WHITE ); OSTimeDlyHMSM(0,0,1,0); stick[2]=-1; //放下左边筷子 OSFlagPost( (OS_FLAGS)4, //打印 &err Sem_F, OS_FLAG_SET, 0, &err ); 0, &err ); 筷子现状 );
分享到:
收藏