📄 test.c
字号:
}
/*$PAGE*/
/*
*********************************************************************************************************
* UPDATE THE DISPLAY
*********************************************************************************************************
*/
static void TaskStartDisp (void)
{
char s[80];
sprintf(s, "%5d", OSTaskCtr); /* Display #tasks running */
PC_DispStr(18, 22, s, DISP_FGND_YELLOW + DISP_BGND_BLUE);
sprintf(s, "%3d", OSCPUUsage); /* Display CPU usage in % */
PC_DispStr(36, 22, s, DISP_FGND_YELLOW + DISP_BGND_BLUE);
sprintf(s, "%5d", OSCtxSwCtr); /* Display #context switches per second */
PC_DispStr(18, 23, s, DISP_FGND_YELLOW + DISP_BGND_BLUE);
sprintf(s, "V%4.2f", (float)OSVersion() * 0.01); /* Display uC/OS-II's version number */
PC_DispStr(75, 24, s, DISP_FGND_YELLOW + DISP_BGND_BLUE);
switch (_8087) { /* Display whether FPU present */
case 0:
PC_DispStr(71, 22, " NO FPU ", DISP_FGND_YELLOW + DISP_BGND_BLUE);
break;
case 1:
PC_DispStr(71, 22, " 8087 FPU", DISP_FGND_YELLOW + DISP_BGND_BLUE);
break;
case 2:
PC_DispStr(71, 22, "80287 FPU", DISP_FGND_YELLOW + DISP_BGND_BLUE);
break;
case 3:
PC_DispStr(71, 22, "80387 FPU", DISP_FGND_YELLOW + DISP_BGND_BLUE);
break;
}
}
/*$PAGE*/
/*
*********************************************************************************************************
* CREATE TASKS
*********************************************************************************************************
*/
static void TaskStartCreateTasks (void)
{
OSTaskCreateExt(Task1,
(void *)0,
&Task1Stk[TASK_STK_SIZE - 1],
TASK_1_PRIO,
TASK_1_ID,
&Task1Stk[0],
TASK_STK_SIZE,
(void *)0,
OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);
OSTaskCreateExt(Task2,
(void *)0,
&Task2Stk[TASK_STK_SIZE - 1],
TASK_2_PRIO,
TASK_2_ID,
&Task2Stk[0],
TASK_STK_SIZE,
(void *)0,
OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);
OSTaskCreateExt(Task3,
(void *)0,
&Task3Stk[TASK_STK_SIZE - 1],
TASK_3_PRIO,
TASK_3_ID,
&Task3Stk[0],
TASK_STK_SIZE,
(void *)0,
OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);
OSTaskCreateExt(Task4,
(void *)0,
&Task4Stk[TASK_STK_SIZE-1],
TASK_4_PRIO,
TASK_4_ID,
&Task4Stk[0],
TASK_STK_SIZE,
(void *)0,
OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);
OSTaskCreateExt(Task5,
(void *)0,
&Task5Stk[TASK_STK_SIZE-1],
TASK_5_PRIO,
TASK_5_ID,
&Task5Stk[0],
TASK_STK_SIZE,
(void *)0,
OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);
}
/*$PAGE*/
/*
*********************************************************************************************************
* TASK #1-#5
*
* Description: These tasks simulate the philosophers'state,thinking,being hungry,trying to take chopsticks
* eating and putting chopsticks.Of course,we can not implement the five states reality,we
* replace them with numbers.0 is instead of thinking,while 1 is hungry and 2 is eating.
*********************************************************************************************************
*/
void Task1 (void *pdata)
{
INT8U i;
INT8U err;
pdata = pdata;
for (;;) {
PC_DispChar(60, 7, state[TASK_1_ID], DISP_FGND_YELLOW + DISP_BGND_BLUE);
i=random(2);
OSTimeDlyHMSM(0, 0, i, 0); //thinking,随机的思考一定的时间
Take_chopsticks(TASK_1_ID);
PC_DispChar(60, 7, state[TASK_1_ID], DISP_FGND_YELLOW + DISP_BGND_BLUE);
OSSemPend(RandomSem[0], 0, &err);
OSTimeDlyHMSM(0, 0,1 , 0); //eating,delay one second。
OSSemPost(RandomSem[0]);
Put_chopsticks(TASK_1_ID);
}
}
void Task2 (void *pdata)
{
INT8U i;
INT8U err;
pdata = pdata;
for (;;) {
PC_DispChar(55, 10, state[TASK_2_ID], DISP_FGND_YELLOW + DISP_BGND_BLUE);
i=random(2);
OSTimeDlyHMSM(0, 0, i, 100);
Take_chopsticks(TASK_2_ID);
PC_DispChar(55, 10, state[TASK_2_ID], DISP_FGND_YELLOW + DISP_BGND_BLUE);
OSSemPend(RandomSem[1], 0, &err);//如果是在饥饿状态就等待
OSTimeDlyHMSM(0, 0, 1, 0);
OSSemPost(RandomSem[1]);
Put_chopsticks(TASK_2_ID);
}
}
void Task3 (void *pdata)
{
INT8U i;
INT8U err;
pdata = pdata;
for (;;) {
PC_DispChar(58, 15, state[TASK_3_ID], DISP_FGND_YELLOW + DISP_BGND_BLUE);
i=random(2);
OSTimeDlyHMSM(0, 0, i, 30);
Take_chopsticks(TASK_3_ID);
PC_DispChar(58, 15, state[TASK_3_ID], DISP_FGND_YELLOW + DISP_BGND_BLUE);
OSSemPend(RandomSem[2], 0, &err);
OSTimeDlyHMSM(0, 0, 1, 100);
OSSemPost(RandomSem[2]);
Put_chopsticks(TASK_3_ID);
}
}
void Task4 (void *pdata)
{
INT8U i;
INT8U err;
pdata = pdata;
for (;;) {
PC_DispChar(63, 15, state[TASK_4_ID], DISP_FGND_YELLOW + DISP_BGND_BLUE);
i=random(2);
OSTimeDlyHMSM(0, 0, i, 400);
Take_chopsticks(TASK_4_ID);
PC_DispChar(63, 15, state[TASK_4_ID], DISP_FGND_YELLOW + DISP_BGND_BLUE);
OSSemPend(RandomSem[3], 0, &err);
OSTimeDlyHMSM(0, 0, 1, 0);
OSSemPost(RandomSem[3]);
Put_chopsticks(TASK_4_ID);
}
}
void Task5 (void *pdata)
{
INT8U i;
INT8U err;
pdata = pdata;
for (;;) {
PC_DispChar(65, 10, state[TASK_5_ID], DISP_FGND_YELLOW + DISP_BGND_BLUE);
i=random(2);
OSTimeDlyHMSM(0, 0, i, 500);
Take_chopsticks(TASK_5_ID);
PC_DispChar(65, 10, state[TASK_5_ID], DISP_FGND_YELLOW + DISP_BGND_BLUE);
OSSemPend(RandomSem[4], 0, &err);
OSTimeDlyHMSM(0, 0, 1, 100);
OSSemPost(RandomSem[4]);
Put_chopsticks(TASK_5_ID);
//OSTimeDlyHMSM(0, 0, 5, 0);
}
}
/*$PAGE*/
/*
*********************************************************************************************************
* CLOCK TASK
*********************************************************************************************************
*/
void Take_chopsticks(int i)
{
INT8U err;
OSMutexPend(Mutex,0,&err);
state[i]='1';
Test(i);
OSMutexPost(Mutex);
OSSemPend(RandomSem[i], 0, &err);
}
void Put_chopsticks(int i)
{
INT8U err;
OSMutexPend(Mutex,0,&err);
state[i]='0'+THINKING;
Test((i-1)%N);
Test((i+1)%N);
OSMutexPost(Mutex);
}
void Test(int i)
{
if(state[i]=='1'&& state[(i-1)%N]!='2' && state[(i+1)%N]!='2')
{
state[i]='2';
OSSemPost(RandomSem[i]);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -