📄 test.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 + -