⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 test.c

📁 基于UCOS2开源的程序
💻 C
📖 第 1 页 / 共 2 页
字号:
}

/*$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 + -