?? test.c
字號:
/*this code is a demo of dining pholospher problem in UCOS-II
copyright Zengzhi Wang 2008.6.11
note:compile and run in TC3.0 with Graphics Functions on
*/
#include <GRAPHICS.H>
#include <MATH.H>
#include "includes.h"
#define pi 3.141592653
#define CenterX 400 /*桌子的圓心坐標(biāo)*/
#define CenterY 250
#define r 100 /*桌子的半徑*/
#define TASK_STK_SIZE 512 //任務(wù)堆棧長度
OS_STK StartTaskStk[TASK_STK_SIZE]; //定義任務(wù)堆棧區(qū)
OS_STK PhilosStk[5][TASK_STK_SIZE];
INT8U PhilosID[]={1,2,3,4,5}; /*哲學(xué)家編號1-5*/
OS_FLAGS ChopGrp[]={3,6,12,24,17}; /*每個哲學(xué)家申請的筷子標(biāo)志位,用移位方法亦可*/
INT16S key; //用于退出uCOS_II的鍵
INT8U err; /*存儲錯誤信息*/
INT8U x=0,y=0,z=0; //字符顯示位置
INT8U i=0; /*計(jì)數(shù)器*/
int driver=0,mode=0; /*顯示驅(qū)動和模式 CGA*/
int philosx[5],philosy[5]; /*哲學(xué)家坐標(biāo)*/
int x1[5],y1[5]; /*筷子外端坐標(biāo)*/
int x2[5],y2[5]; /*筷子里端坐標(biāo)*/
OS_FLAG_GRP *WFlag; /*筷子的事件標(biāo)志組*/
OS_FLAGS Chops=31; /*標(biāo)志組初始值,所有筷子有效*/
void StartTask(void *data); /*初始化任務(wù),運(yùn)行完畢后將自己掛起*/
void Philos(void *data); /*哲學(xué)家進(jìn)程,5個均相同*/
void PickChop(INT8U id); /*拿起筷子-畫黑線將白線覆蓋*/
void PutChop(INT8U id); /*放下筷子-畫白線再次顯示筷子*/
void Thinking(INT8U id); /*覆蓋原來的圖形(Eating),再次畫圓*/
void Hungry(INT8U id); /*將圓填充為Wide_DOT模式*/
void Eating(INT8U id); /*將圓填充為實(shí)心*/
void Quitkey(void); /*檢測退出*/
/************************主函數(shù)*********************************************/
void main (void)
{
OSInit(); //初始化uCOS_II
PC_DOSSaveReturn(); //保存Dos環(huán)境
PC_VectSet(uCOS, OSCtxSw); //安裝uCOS_II中斷
/*哲學(xué)家坐標(biāo)和筷子坐標(biāo)初始化計(jì)算*/
for(i=0;i<5;i++)
{
philosx[i]=(int)(CenterX+r*sin(pi*(72*i)/180));
philosy[i]=(int)(CenterY-r*cos(pi*(72*i)/180));
x1[i]=(int)(CenterX+(r+20)*sin(pi*(72*i-36)/180));
y1[i]=(int)(CenterY-(r+20)*cos(pi*(72*i-36)/180));
x2[i]=(int)(CenterX+(r-20)*sin(pi*(72*i-36)/180));
y2[i]=(int)(CenterY-(r-20)*cos(pi*(72*i-36)/180));
}
WFlag=OSFlagCreate((OS_FLAGS)31,&err); /*創(chuàng)建事件標(biāo)志組并檢驗(yàn)是否創(chuàng)建成功*/
if(err==OS_NO_ERR)
PC_DispStr(20,24,"Flag create no error",DISP_BGND_BLACK+DISP_FGND_YELLOW);
OSTaskCreate(StartTask,0,&StartTaskStk[TASK_STK_SIZE - 1],5);
OSStart();
}
/************************************************************************************
哲學(xué)家及筷子顯示算法:
O
O O
O O
每兩個哲學(xué)家之間的夾角為72度,
取圓心到每個哲學(xué)家半徑和圓心到第一個(最上面的)哲學(xué)家的半徑之間的夾角計(jì)算每個哲學(xué)家的位置
筷子的位置其實(shí)是哲學(xué)家逆時針旋轉(zhuǎn)36度的位置。
哲學(xué)家在坐標(biāo)處畫圓即可
筷子頭尾坐標(biāo)分別是一個圍著大桌的哲學(xué)家逆時針36度,和一個小桌的哲學(xué)家逆時針36度的結(jié)果
*/
//*****************************StartTask********************************************
void StartTask(void *pdata)
{
char temp[50];
pdata=pdata;
OS_ENTER_CRITICAL();
PC_VectSet(0x08, OSTickISR);
PC_SetTickRate(OS_TICKS_PER_SEC);
OS_EXIT_CRITICAL();
// OSStatInit();
/*創(chuàng)建哲學(xué)家進(jìn)程并檢測*/
for(i=0;i<5;i++)
{
err=OSTaskCreate(Philos,(void *)&PhilosID[i],&PhilosStk[i][TASK_STK_SIZE - 1],i+6);
//需用OutText顯示
// if(err==OS_NO_ERR)
// //test if task is created successfully
// {
// sprintf(temp,"Philosopher %d create error",PhilosID[i]);
// PC_DispStr(0,20+i,temp,DISP_BGND_BLACK+DISP_FGND_YELLOW);
// sprintf(temp,"%d",err);
// PC_DispStr(30,20+i,temp,DISP_BGND_BLACK+DISP_FGND_WHITE);
// }
}
initgraph(&driver,&mode,"d:\\TCPP30E\\BGI"); /*初始化圖形模式*/
/*顯示標(biāo)題*/
setcolor(YELLOW);
outtextxy(150,30,"Demo of Dining Philosphy in Ucos-II");
outtextxy(190,40,"by Zengzhi Wang 2008.6.10");
/*demo of 三種狀態(tài)*/
setcolor(WHITE);
outtextxy(20,80,"Thinking...");
circle(120,85,10);
/**/
outtextxy(20,110,"Hungry...");
circle(120,115,10);
setfillstyle(WIDE_DOT_FILL,WHITE);
floodfill(120,115,WHITE);
/**/
outtextxy(20,140,"Eating...");
circle(120,145,10);
setfillstyle(SOLID_FILL,WHITE);
floodfill(120,145,WHITE);
/*圖像顯示初始化,所有哲學(xué)家思考狀態(tài),筷子全部有效*/
for(i=0;i<5;i++)
{
circle(philosx[i],philosy[i],20);
line(x1[i],y1[i],x2[i],y2[i]);
}
OSTimeDly(1000); /*延時防止程序進(jìn)入后馬上開始吃而看不到效果*/
OSTaskSuspend(OS_PRIO_SELF);
}
//*****************************Philos********************************************
//the Philosopher first has to pick up the chopstick on his left hand then right
void Philos(void *pdata)
{
INT8U PhID;
char temp[50];
PhID = *(INT8U *)pdata; /*讀取哲學(xué)家編號*/
for (;;)
{
Quitkey();
/*哲學(xué)家開始Hungry*/
Hungry(PhID-1);
OSTimeDly(400);
/*申請筷子并開始吃*/
OSFlagPend(WFlag,ChopGrp[PhID-1], OS_FLAG_WAIT_SET_ALL + OS_FLAG_CONSUME,0,&err);
PickChop(PhID-1); /*拿右筷子*/
PickChop(PhID%5); /*拿左筷子*/
Eating(PhID-1);
OSTimeDly(400);
/*吃完放筷子繼續(xù)思考*/
PutChop(PhID%5);
PutChop(PhID-1);
Thinking(PhID-1);
OSFlagPost(WFlag,ChopGrp[PhID-1],OS_FLAG_SET,&err);
/**/
OSTimeDly(400);
Quitkey();
}
}
//***************************PickChop()********************************************
void PickChop(INT8U id)
{
setcolor(BLACK);
line(x1[id],y1[id],x2[id],y2[id]);
}
//***************************PutChop()********************************************
void PutChop(INT8U id)
{
setcolor(WHITE);
line(x1[id],y1[id],x2[id],y2[id]);
}
//***************************Thinking()********************************************
void Thinking(INT8U id)
{
setfillstyle(SOLID_FILL,BLACK);
floodfill(philosx[id],philosy[id],BLACK);
setcolor(WHITE);
circle(philosx[id],philosy[id],20);
}
//***************************Hungry()********************************************
void Hungry(INT8U id)
{
setfillstyle(WIDE_DOT_FILL,WHITE);
floodfill(philosx[id],philosy[id],WHITE);
}
//***************************Eating()********************************************
void Eating(INT8U id)
{
setfillstyle(SOLID_FILL,WHITE);
floodfill(philosx[id],philosy[id],WHITE);
}
//*****************************Quitkey()********************************************
void Quitkey(void)
{
if(PC_GetKey(&key)==TRUE)
{
if(key==0x1B)
{restorecrtmode();PC_DOSReturn();}
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -