当前位置:首页 >> 农林牧渔 >>

哲学家就餐


哲 学 家 就 餐 问 题 , uc/OS 16:11/****************************************Copyright (c)**************************************************

II2010-12-20

**-------------文 件 信 息 -

------------------------------------------------------------------------------**文 件 名: **创 建 人: 张海涛 **最后修改日期: 2009 年 11 月 10 日 **描 述: 嵌入式实时操作系统实验 5"信号量:哲学家就餐问题的实现" 实验目的: 掌握在基于嵌入式实时操作系统 uC/OS-II 的应用中, 任务使用信号量的一般 原理。通过 经典的哲学家就餐实验,了解如何利用信号量来对共享资源进行互斥访问。 五个哲学家任务(ph1、ph2、ph3、ph4、ph5)主要有两种过程:思考(即睡眠一段时间) 和就餐。 每个哲学家任务在就餐前必须申请并获得一左一右两支筷子,就餐完毕后释放这两支筷 子。五个哲 学家围成一圈,每两人之间有一支筷子。一共有五支筷子,在该实验中用了五个互斥信 号量来代表。 ** **-------------历 史 版 本 信 息 ---------------------------------------------------------------------------** 创建人: ** 版 本: v1.0 ** 日 期: 2009 年 11 月 10 日 ** 描 述: 原始版本 ** **-------------当 前 版 本 修 订 -----------------------------------------------------------------------------** 修改人: ** 日 期: ** 描 述: ** **----------------------------------------------------------------------------------------------------******************************************************************************** ************************/ #include "config.h" #define THINK_TIME 500

#define OS_STK OS_STK OS_STK OS_STK OS_STK OS_STK

TASK_STK_SIZE 64 /* 堆栈大小 */ TaskStartStk[TASK_STK_SIZE]; /* TaskStart 任务堆栈 */ Ph1Stk[TASK_STK_SIZE]; /* Ph1 任务堆栈 */ Ph2Stk[TASK_STK_SIZE]; /* Ph2 任务堆栈 */ Ph3Stk[TASK_STK_SIZE]; /* Ph3 任务堆栈 */ Ph4Stk[TASK_STK_SIZE]; /* Ph4 任务堆栈 */ Ph5Stk[TASK_STK_SIZE]; /* Ph5 任务堆栈 */

void TaskStart(void *data); void Ph1(void *data); 家 1 */ void Ph2(void *data); void Ph3(void *data); 家 3 */ void Ph4(void *data); 家 4 */ void Ph5(void *data); 家 5 */

/* Ph1 任务堆栈,代表哲学 /* Ph2 任务堆栈,代表哲学家 2 */ /* Ph3 任务堆栈,代表哲学 /* Ph4 任务堆栈,代表哲学 /* Ph5 任务堆栈,代表哲学

/******************************************************************************* ************************** ** 函数名称: fputc ** 功能描述: 将 fputc 函数重定向到串口 0 ** 输 入: ** 输 出: 无 ** 全局变量: 无 ** 调用模块: ** ** 作 者: 张海涛 ** 日 期: 2008 年 11 月 18 日 **-----------------------------------------------------------------------------------------------------** 修改人: ** 日 期: **----------------------------------------------------------------------------------------------------******************************************************************************** ************************/ int fputc(int ch,FILE *f){ extern void UART0_SendByte(uint8 data); char tempch = ch; UART0_SendByte(tempch);

return ch; } /******************************************************************************* ************************** ** 函数名称: DelayTime ** 功能描述: 延时程序 ** 输 入: t 延时时间参数 ** 输 出: 无 ** 全局变量: 无 ** 调用模块: ** ** 作 者: 张海涛 ** 日 期: 2008 年 11 月 18 日 **-----------------------------------------------------------------------------------------------------** 修改人: ** 日 期: **----------------------------------------------------------------------------------------------------******************************************************************************** ************************/ void DelayTime(uint32 t){ uint32 i; while(t--){ i = 100; while(i--); } } /******************************************************************************* ************************** ** 函数名称: main ** 功能描述: c 语言的主函数,由它启动多任务环境 ** 输 入: 无 ** 输 出: 无 ** 全局变量: 无 ** 调用模块: OSInit,OSTaskCreate,OSStart ** ** 作 者: 张海涛 ** 日 期: 2008 年 11 月 18 日 **-----------------------------------------------------------------------------------------------------** 修改人:

** 日 期: **----------------------------------------------------------------------------------------------------******************************************************************************** ************************/ OS_EVENT *sem1,*sem2,*sem3,*sem4,*sem5; /*定义互斥信号量,代表筷子*/ int main (void){ OSInit(); sem1 sem2 sem3 sem4 sem5 = = = = = OSSemCreate(1); OSSemCreate(1); OSSemCreate(1); OSSemCreate(1); OSSemCreate(1); /* 初始化 uC/OS-II 操作系统 */ /* /* /* /* /* 创建一个互斥信号量*/ 创建一个互斥信号量*/ 创建一个互斥信号量*/ 创建一个互斥信号量*/ 创建一个互斥信号量*/

OSTaskCreate(TaskStart, (void *)0, &TaskStartStk[TASK_STK_SIZE - 1], 0); /* 创 建任务 TaskStart,优先级为 0*/ OSStart(); /* 启动多任务 */ return 0; } /******************************************************************************* ************************** ** 函数名称: TaskStart ** 功能描述: μCOS-II 的起始任务,通常由它初始化目标板和建立其它任务,这里建立了 五个应用任务 Ph1、Ph2、Ph3、Ph4、 Ph5。 ** 输 入: 无 ** 输 出: 无 ** 全局变量: 无 ** 调用模块: OSTaskCreate() uC/OS-II 创建任务函数 TargetInit() 启动时间节拍,初始化串口函数 OSTaskSuspend() uC/OS-II 中挂起指定优先级任务函数 ** ** 作 者: 张海涛 ** 日 期: 2008 年 11 月 18 日 **-----------------------------------------------------------------------------------------------------** 修改人: ** 日 期:

**----------------------------------------------------------------------------------------------------******************************************************************************** ************************/ void TaskStart(void *pdata){ uint8 i; uint8 TaskData[5]; for (i = 0; i < 5; i++){ TaskData[i] = i + 1; } printf("uC/OS-II is Started\n==============================\n"); TargetInit(); /* 目标板 初始化 */ OSTaskCreate(Ph1, (void *)&TaskData[0], &Ph1Stk[TASK_STK_SIZE - 1], 5); /* 创 建任务 Ph1 */ OSTaskCreate(Ph2, (void *)&TaskData[1], &Ph2Stk[TASK_STK_SIZE - 1], 6); /* 创建任务 Ph2 */ OSTaskCreate(Ph3, (void *)&TaskData[2], &Ph3Stk[TASK_STK_SIZE - 1], 7); /* 创建任务 Ph3 */ OSTaskCreate(Ph4, (void *)&TaskData[3], &Ph4Stk[TASK_STK_SIZE - 1], 8); /* 创建任务 Ph4 */ OSTaskCreate(Ph5, (void *)&TaskData[4], &Ph5Stk[TASK_STK_SIZE - 1], 9); /* 创建任务 Ph5 */ for(;;){ OSTaskSuspend(0); 身*/ } } /******************************************************************************* ************************** ** 函数名称: Ph1 ** 功能描述: μCOS-II 的第一个任务,代表哲学家 1 ** 输 入: 无 ** 输 出: 无 ** 全局变量: 无 ** 调用模块: ** ** 作 者: 张海涛

/* 挂起优先级为 0 的任务, 即为 TaskStart 任务本

** 日 期: 2009 年 11 月 10 日 **-----------------------------------------------------------------------------------------------------** 修改人: ** 日 期: **----------------------------------------------------------------------------------------------------******************************************************************************** ************************/ void Ph1(void *pdata){ uint8 err,id; id = *(int *)pdata; for(;;){ printf("Philosopher %d is thinking.\n",id); OSTimeDly(THINK_TIME); /* 延时 200 个时钟节拍 */ printf("Philosopher %d is hungry.\n",id); OSSemPend(sem5,0,&err); switch(err){ case OS_NO_ERR: break; default: break; } OSSemPend(sem1,0,&err); switch(err){ case OS_NO_ERR: break; default: break; } printf("Philosopher %d is eating.\n",id); OSTimeDly(THINK_TIME); */ OSSemPost(sem5); OSSemPost(sem1); } } /* Release mutex */ /* 请求互斥信号量 sem1 */ /* 请求互斥信号量 sem5 */

/* Delay 200 clock tick

/******************************************************************************* ************************** ** 函数名称: Ph2 ** 功能描述: μCOS-II 的第二个任务,代表哲学家 2 ** 输 入: 无 ** 输 出: 无 ** 全局变量: 无 ** 调用模块: ** ** 作 者: 张海涛 ** 日 期: 2009 年 11 月 10 日 **-----------------------------------------------------------------------------------------------------** 修改人: ** 日 期: **----------------------------------------------------------------------------------------------------******************************************************************************** ************************/ void Ph2(void *pdata){ uint8 err,id; id = *(int *)pdata; for(;;){ printf("Philosopher %d is thinking.\n",id); OSTimeDly(THINK_TIME); /* 延时 300 个时钟节拍 */ printf("Philosopher %d is hungry.\n",id); OSSemPend(sem1,0,&err); switch(err){ case OS_NO_ERR: break; default: break; } OSSemPend(sem2,0,&err); switch(err){ case OS_NO_ERR: break; default: /* 请求互斥信号量 sem2 */ /* 请求互斥信号量 sem1 */

break; } printf("Philosopher %d is eating.\n",id); OSTimeDly(THINK_TIME); */ OSSemPost(sem1); OSSemPost(sem2); } } /******************************************************************************* ************************** ** 函数名称: Ph3 ** 功能描述: μCOS-II 的第三个任务,代表哲学家 3 ** 输 入: 无 ** 输 出: 无 ** 全局变量: 无 ** 调用模块: ** ** 作 者: 张海涛 ** 日 期: 2009 年 11 月 10 日 **-----------------------------------------------------------------------------------------------------** 修改人: ** 日 期: **----------------------------------------------------------------------------------------------------******************************************************************************** ************************/ void Ph3(void *pdata){ uint8 err,id; id = *(int *)pdata; for(;;){ printf("Philosopher %d is thinking.\n",id); OSTimeDly(THINK_TIME); /* 延时 400 个时钟节拍 */ printf("Philosopher %d is hungry.\n",id); /* Release mutex */

/* Delay 200 clock tick

OSSemPend(sem2,0,&err); switch(err){

/* 请求互斥信号量 sem2 */

case OS_NO_ERR: break; default: break; } OSSemPend(sem3,0,&err); switch(err){ case OS_NO_ERR: break; default: break; } printf("Philosopher %d is eating.\n",id); OSTimeDly(THINK_TIME); */ OSSemPost(sem2); OSSemPost(sem3); } } /******************************************************************************* ************************** ** 函数名称: Ph4 ** 功能描述: μCOS-II 的第四个任务,代表哲学家 4 ** 输 入: 无 ** 输 出: 无 ** 全局变量: 无 ** 调用模块: ** ** 作 者: 张海涛 ** 日 期: 2009 年 11 月 10 日 **-----------------------------------------------------------------------------------------------------** 修改人: ** 日 期: **----------------------------------------------------------------------------------------------------******************************************************************************** ************************/ void Ph4(void *pdata){ uint8 err,id; /* Release mutex */ /* 请求互斥信号量 sem3 */

/* Delay 200 clock tick

id = *(int *)pdata; for(;;){ printf("Philosopher %d is thinking.\n",id); OSTimeDly(THINK_TIME); /* 延时 500 个时钟节拍 */ printf("Philosopher %d is hungry.\n",id);

OSSemPend(sem3,0,&err); switch(err){ case OS_NO_ERR: break; default: break; } OSSemPend(sem4,0,&err); switch(err){ case OS_NO_ERR: break; default: break; } printf("Philosopher %d is eating.\n",id); OSTimeDly(THINK_TIME); */ OSSemPost(sem3); OSSemPost(sem4); } }

/* 请求互斥信号量 sem3 */

/* 请求互斥信号量 sem4 */

/* Delay 200 clock tick /* Release mutex */

/******************************************************************************* ************************** ** 函数名称: Ph5 ** 功能描述: μCOS-II 的第五个任务,代表哲学家 5 ** 输 入: 无 ** 输 出: 无 ** 全局变量: 无 ** 调用模块: ** ** 作 者: 张海涛 ** 日 期: 2009 年 11 月 10 日 **------------------------------------------------------------------------------

------------------------** 修改人: ** 日 期: **----------------------------------------------------------------------------------------------------******************************************************************************** ************************/ void Ph5(void *pdata){ uint8 err,id; id = *(int *)pdata; for(;;){ printf("Philosopher %d is thinking.\n",id); OSTimeDly(THINK_TIME); /* 延时 400 个时钟节拍 */ printf("Philosopher %d is hungry.\n",id);

OSSemPend(sem4,0,&err); switch(err){ case OS_NO_ERR: break; default: break; } OSSemPend(sem5,0,&err); switch(err){ case OS_NO_ERR: break; default: break; } printf("Philosopher %d is eating.\n",id); OSTimeDly(THINK_TIME); */ OSSemPost(sem4); OSSemPost(sem5); } }

/* 请求互斥信号量 sem4 */

/* 请求互斥信号量 sem5 */

/* Delay 200 clock tick /* Release mutex */

/*******************************************************************************

************************** ** End Of File ******************************************************************************** ************************/


相关文章:
哲学家就餐问题
哲学家就餐问题_计算机软件及应用_IT/计算机_专业资料。(2013-2014 学年 第二学期) 重庆理工大学研究生课程论文课程论文题目:基于 ucos-ii 操作系统解决哲学家就餐...
哲学家就餐问题解释
哲学家就餐问题解释_信息与通信_工程科技_专业资料。关于哲学家就餐问题的解释哲学家就餐问题是在计算机科学中的一个经典问题,用来演示在并行计算中多线程同步(Synchron...
哲学家就餐问题
哲学家就餐问题_计算机软件及应用_IT/计算机_专业资料。操作系统哲学家就餐问题实验一一、实验名称:哲学家就餐问题的实现 二、实验学时:2 三、实验内容和目的:实验...
哲学家就餐问题报告
哲学家就餐问题报告_计算机软件及应用_IT/计算机_专业资料。操作系统实验操作系统实验报告实验名称:哲学家就餐问题 班级:信卓 1201 班 姓名:钟远维 学号:U201213500...
哲学家就餐问题代码2
哲学家就餐问题代码2_计算机软件及应用_IT/计算机_专业资料。哲学家就餐问题#include <iostream> #include <iomanip> #include <ctime> #include <cstdlib> using ...
哲学家就餐论文
哲学家就餐论文_计算机硬件及网络_IT/计算机_专业资料。原创实践报告,代码200%无错!选题:哲学家就餐问题是一种典型的同步问题,它是由 Dijkstra 提出并解决的。 该...
哲学家就餐问题
计算机操作系统哲学家进餐问题的研究 姓学 名: 号: 陆文静 1310750012 杨婷婷 指导老师: 专业班级: 软件工程 1301 班 完成时间: 2015 年 5 月 4 日 哲学家...
哲学家就餐
18页 5财富值 JAVA实现哲学家就餐问题 2页 5财富值如要投诉违规内容,请到百度文库投诉中心;如要提出功能问题或意见建议,请点击此处进行反馈。 ...
哲学家就餐问题代码
#include <iostream> #include <iomanip> #include <ctime> #include <cstdlib> using namespace std; enum State {THINK,WAIT,EAT,END};//哲学家所处状态 ...
哲学家就餐问题
哲学家就餐问题_理学_高等教育_教育专区。哲学家就餐问题模拟 数学与计算机学院 课程设计说明书课 程名称: 课程代码: 题目: 年级/专业/班: 学生姓名: 学开始时间...
更多相关标签:
哲学家就餐问题 | 哲学家进餐问题 | 哲学家 | 银行家算法 | 哲学家就餐 java | 哲学家就餐问题 c | 拜占庭将军问题 | 哲学家就餐问题代码 |