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

📄 test.c

📁 ucos 实现任务创建
💻 C
字号:
/*
*********************************************************************************************************
*                                                uC/OS-II
*                                          The Real-Time Kernel
*
*                           (c) Copyright 1992-2002, Jean J. Labrosse, Weston, FL
*                                           All Rights Reserved
*
*                                               EXAMPLE #1
*********************************************************************************************************
*/

#include "includes.h"
#include "display.h"

/*
*********************************************************************************************************
*                                               CONSTANTS
*********************************************************************************************************
*/

#define  TASK_STK_SIZE                 512   	/* Size of each task's stacks (# of WORDs)    	*/
#define  N_TASKS					10		/* Number of tasks						*/
#define  N_TASKS_BARBER              1	       /* Number of barber tasks                            	*/
#define  N_TASKS_CUSTOMER		9		/* Number of customer tasks				*/
#define  N_CHAIRS				4		/* Number of chairs(for waiting + for barber	*/
//#define  PRIORITY_MUTEX_BARBER	3		/* Priority of use chair mutex				*/
#define  PRIORITY_MUTEX_CHAIR	2		/* Priority of acquire a chair mutex			*/
#define  DELAY_BARBER			1000		/* Time of Barber working					*/
#define  DELAY_CUSTOMER		2000		/* Time of Customer return					*/
#define  N_CHAIR_FOR_WORK		1	


/*
*********************************************************************************************************
*                                               VARIABLES
*********************************************************************************************************
*/

OS_STK		TaskStartStk[TASK_STK_SIZE];
OS_STK 		Taskstk_Customer[N_TASKS_CUSTOMER][TASK_STK_SIZE];	/* Tasks stacks of customer 		*/
OS_STK		Taskstk_Barber[N_TASKS_BARBER][TASK_STK_SIZE];			/* Tasks stacks of barber		*/
INT8U		TaskData_Customer[N_TASKS_CUSTOMER];					/* Delay of customer			*/
INT8U		TaskData_Barber[N_TASKS_BARBER];						/* Delay of barber				*/

OS_EVENT	*Sem_Customer;											/* Semaphore of customer		*/
OS_EVENT	*Mut_All_Chair;											/* Mutex  of chairs			*/
OS_EVENT	*Sem_Chair;												/* Semaphore of chair			*/
//OS_EVENT      *Mut_Chair;				 								/* Mutex  of chair			*/

INT8S		N_chair = N_CHAIRS;										/* Number of chair				*/

INT8U		Row_Customer = ROW_START;
INT8U		Row_Barber = ROW_START;


/*
*********************************************************************************************************
*                                           FUNCTION PROTOTYPES
*********************************************************************************************************
*/


void  Task_Barber(void *data);              		/* Function prototypes of barber tasks 		*/
void	 Task_Customer(void * data);			/* Function prototypes of customer tasks 		*/
void  TaskStart(void *data);					 /* Function prototypes of Startup task   		*/
static  void  TaskStartCreateTasks(void);
extern  void  TaskStartDispInit(void);
extern  void  Display_Info(INT8U num_ID, TYPE_T type, STATE_T state);
extern  void  Display_Clear_Row(INT8U num_ID, TYPE_T type);


/*$PAGE*/
/*
*********************************************************************************************************
*                                                MAIN
*********************************************************************************************************
*/

void  main (void)
{
    INT8U Error_mutex;   
    PC_DispClrScr(DISP_FGND_WHITE + DISP_BGND_BLACK); 	// Clear the screen       

    OSInit();												// Initialize uC/OS-II 

    // Save environment to return to DOS 
    PC_DOSSaveReturn();	
    // Install uC/OS-II's context switch vector
    PC_VectSet(uCOS, OSCtxSw);			

    //Number of customers semaphore
    Sem_Customer = OSSemCreate(0);	
   // Number of chairs Mutex
    Mut_All_Chair = OSMutexCreate(PRIORITY_MUTEX_CHAIR, &Error_mutex);	
    Sem_Chair = OSSemCreate(N_CHAIR_FOR_WORK);		// semaphore of  chair for work	
   // Mut_Chair = OSMutexCreate(PRIORITY_MUTEX_BARBER, &Error_mutex);

    OSTaskCreate(TaskStart, (void *)0, &TaskStartStk[TASK_STK_SIZE - 1], 0);
    OSStart();                                             /* Start multitasking                       */
}


/*
*********************************************************************************************************
*                                              STARTUP TASK
*********************************************************************************************************
*/
void  TaskStart (void *pdata)
{
#if OS_CRITICAL_METHOD == 3                                /* Allocate storage for CPU status register */
    OS_CPU_SR  cpu_sr;
#endif
    char       s[100];
    INT16S     key;


    pdata = pdata;                                         /* Prevent compiler warning                 */

    TaskStartDispInit();                                   /* Initialize the display                   */

    OS_ENTER_CRITICAL();
    PC_VectSet(0x08, OSTickISR);                           /* Install uC/OS-II's clock tick ISR        */
    PC_SetTickRate(OS_TICKS_PER_SEC);                      /* Reprogram tick rate                      */
    OS_EXIT_CRITICAL();

    OSStatInit();                                          /* Initialize uC/OS-II's statistics         */

    TaskStartCreateTasks();                                /* Create all the application tasks         */

    for (;;) {
        //TaskStartDisp();                                  /* Update the display                       */

        if (PC_GetKey(&key) == TRUE) {                     /* See if key has been pressed              */
            if (key == 0x1B) {                             /* Yes, see if it's the ESCAPE key          */
                PC_DOSReturn();                            /* Return to DOS                            */
            }
        }

        OSCtxSwCtr = 0;                                    /* Clear context switch counter             */
        OSTimeDlyHMSM(0, 0, 1, 0);                         /* Wait one second                          */
    }
}



/*
*********************************************************************************************************
*                                             CREATE TASKS
*********************************************************************************************************
*/

static  void  TaskStartCreateTasks (void)
{
    INT8S	i = 0;
    char	s[80];
	
	// Create N_TASKS_BARBER  identical customer tasks 	
	 for (i = 0; i < N_TASKS_BARBER; i++) {	 
	 	// Each task will display its number  
   		TaskData_Barber[i] =  i + 1;	
    		OSTaskCreate(Task_Barber,
				(void*)&TaskData_Barber[i],
				&Taskstk_Barber[i][TASK_STK_SIZE -1], 
				i + 10);
	 	}

	// Create N_TASKS_CUSTOMER  identical customer tasks 
	 for (i = 0; i < N_TASKS_CUSTOMER; i++) {	
	 	// Each task will display its number 
	 	TaskData_Customer[i] =  i + 1;			
		OSTaskCreate(Task_Customer, 
			(void *)&TaskData_Customer[i], 
			&Taskstk_Customer[i][TASK_STK_SIZE - 1],
			i + 30);
		}
}

/*
*********************************************************************************************************
*                                                  TASKS
*********************************************************************************************************
*/

void  Task_Barber(void * data)
{
	INT8U 	err;
	INT8U 	num_ID =*(INT8U *)data;
	
	for (;;) {
		
		Display_Clear_Row(num_ID, TYPE_BARBER);
		Display_Info(num_ID, TYPE_BARBER, 10);
		Display_Info(num_ID, TYPE_BARBER, STATE_SLEEPING);

		// waking...	
		OSTimeDly((INT16U)(100 + random(100)));		

		//Acquire customer semaphore to start work
		OSSemPend(Sem_Customer, 0, &err);	
		Display_Info(num_ID, TYPE_BARBER, STATE_WORKING);

		OSTimeDly((INT16U)DELAY_BARBER);
	
		// Release Mutex Mut_Chair  
		OSSemPost(Sem_Chair);	
		//OSMutexPost(Mut_Chair);
	}
}
void Task_Customer(void * data)
{
	INT8U 	err;
	INT8U 	num_ID =* (INT8U*)data;
	
	for(; ;) {
		Display_Clear_Row(num_ID, TYPE_CUSTOMER);
		Display_Info(num_ID, TYPE_CUSTOMER, 10);

		// Acquire chair Mutexr  	
		OSMutexPend(Mut_All_Chair, 0, &err);	
		if (N_chair == 0) {	
			// there is no chair, customer go away
			Display_Info(num_ID, TYPE_CUSTOMER, STATE_GO_AWAY);
			OSMutexPost(Mut_All_Chair);
			goto END;
		}
		else if ((N_chair <= 0) || (N_chair > N_CHAIRS)) {	
			// ERROR: Number of chair is invalid	
			Display_Info(num_ID, TYPE_CUSTOMER, STATE_INVALID);
			OSMutexPost(Mut_All_Chair);
			goto END;
		}

		// Decrease the Number of chairs
		N_chair--;								
		Display_Info(num_ID, TYPE_CUSTOMER, STATE_WELCOME);
		// Release the Mutex of Mut_All_Chair 	
		OSMutexPost(Mut_All_Chair);			


		Display_Info(num_ID, TYPE_CUSTOMER, STATE_WAITING);

		// Acquire Mutex of Mut_Chair		
		OSSemPend(Sem_Chair, 0, &err);	
		//OSMutexPend(Mut_Chair, 0, &err);

		//Signals the semaphore Sem_Customer	
		OSSemPost(Sem_Customer);			

		Display_Info(num_ID, TYPE_CUSTOMER, STATE_ENJOY);
		
		// Acquire chair Mutexr  			
		OSMutexPend(Mut_All_Chair, 0, &err);		

		if ((N_chair <= -1) || (N_chair >= N_CHAIRS)) {		
			// ERROR: Number of chair is invalid	
			Display_Info(num_ID, TYPE_CUSTOMER, STATE_INVALID);
			OSMutexPost(Mut_All_Chair);
			goto END;

		}

		// Inecrease the Number of chairs	
		N_chair++;	
		// Release the Mutex of Mut_All_Chair 
		OSMutexPost(Mut_All_Chair);					

		// Barber is working			
		OSTimeDly((INT16U)DELAY_BARBER);			
		//OSMutexPost(Mut_Chair);

		// customer  go away	
		Display_Info(num_ID, TYPE_CUSTOMER, STATE_GOODBYE);		

		// Clear the customer's state	
		OSTimeDly((INT16U)(100 + random(100)));				
		Display_Clear_Row(num_ID, TYPE_CUSTOMER);
		Display_Info(num_ID, TYPE_CUSTOMER, 10);

// Do nothing, After delay, return		
END:
		OSTimeDly((INT16U)DELAY_CUSTOMER);
		
		}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -