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
);
筷子现状
);