预览加载中,请您耐心等待几秒...
1/5
2/5
3/5
4/5
5/5

在线预览结束,喜欢就下载吧,查找使用更方便

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

一.实验原理: 掌握在基于嵌入式实时操作系统μC/OS-II的应用中,任务使用信号量的一般原理。通过哲学家问题实验,了解如何利用信号量来对共享资源进行互斥访问。 二.实验平台: PC、XP操作系统、ADS集成开发环境 三.实验目的 复习对进程同步的机制,并加强学生动手能力,不仅让学生从原理上懂得操作系统,而且让学生实践,让学生自己动手写操作系统部分代码。 四:实验内容: 哲学家动作: thinking hungry eating ph1thinking!ph2thinking!………. ph1hungry!ph2hungry!………. ph1eating!ph2eating!……….. 实现: while(1){ 显示phxthinking;OSTimeDly()随机延时; 显示phxhungry;OSTimeDly()随机延时; 显示phxeating;OSTimeDly()随机延时; } 五:实验要求: 能在屏幕上输出5个哲学家的动作,分别是thinking,hungry,eating,如下所示: 哲学家1thinking,哲学家2thinking,... 哲学家1hungry,哲学家2hungry,... 哲学家1eating,哲学家2eating,... 六:实验代码: 在ADS1.2中先后导入一下文件 最后编写主函数main的程序,代码如下: #include "../ucos-ii/includes.h"/*uC/OSinterface*/ #include"string.h" #include"gui.h" //taskstacksize #ifdefSEMIHOSTED #define TASK_STACK_SIZE (64+SEMIHOSTED_STACK_NEEDS) #else #define TASK_STACK_SIZE 10*1024 #endif ///***********definetask************************/ #defineTASK_PRIO2 #defineTASK_STK_SIZE512 INT8U*err;//用于退出的键 OS_EVENT*SEM[5];//定义对应的信号量指针数组 externcharkeyflag; OS_STKMyTaskStk1[TASK_STK_SIZE];//定义任务堆栈区 OS_STKMyTaskStk2[TASK_STK_SIZE]; OS_STKMyTaskStk3[TASK_STK_SIZE]; OS_STKMyTaskStk4[TASK_STK_SIZE]; OS_STKMyTaskStk5[TASK_STK_SIZE]; voidMytask1(void*pd) { charbuf[128]; while(1) { sprintf(buf,"ph%disthinking\n",(unsignedint)pd+1); armulPrintf(buf); OSSemPend(SEM[0],0,err);//请求一个信号量,没有时间限制 sprintf(buf,"ph%dishungry\n",(unsignedint)pd+1); armulPrintf(buf); OSSemPost(SEM[1]);//发送一个信号量 OSSemPend(SEM[0],0,err);//请求一个信号量,没有时间限制 sprintf(buf,"ph%diseating\n",(unsignedint)pd+1); armulPrintf(buf); OSSemPost(SEM[1]);//发送一个信号量 OSTimeDlyHMSM(0,0,0,200);//等待200ms } } voidMytask2(void*pd) { charbuf[128]; while(1) { sprintf(buf,"ph%disthinking\n",(unsignedint)pd+1); armulPrintf(buf); OSSemPend(SEM[1],0,err);//请求一个信号量,没有时间限制 sprintf(buf,"ph%dishungry\n",(unsignedint)pd+1); armulPrintf(buf); OSSemPost(SEM[2]);//发送一个信号量 OSSemPend(SEM[1],0,err);//请求一个信号量,没有时间限制 sprintf(buf,"ph%diseating\n",(unsignedint)pd+1); armulPrintf(buf); OSSemPost(SEM[2]);//发送一个信号量 OSTimeDlyHMSM(0,0,