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

📄 哲学家就餐.c

📁 这个程序演示基本的哲学家就餐问题的解决。程序启动具有五个不同优先级的任务
💻 C
字号:
/**********************************************************************************************************
* 
*				                电子科技大学嵌入式软件工程中心 版权所有
* 					
* 								Copyright (C) 2007 UESTC ESEC
*
**********************************************************************************************************/

/**********************************************************************************************************
* 目的:
*      这个程序演示基本的哲学家就餐问题的解决。程序启动具有五个
*      不同优先级的任务,每个任务对应一个哲学家,完成一系列动作。
**********************************************************************************************************/

#include "../ucos/includes.h"
#include "../bsp/Uart.h"

extern T_UART_PORT uartPort0;
extern void ucBsp_Init(void);
extern void Timer_Start(void);
extern void CPSR_Init(void);
/*
*********************************************************************************************************
*                                               CONSTANTS
*********************************************************************************************************
*/

#define		TASK_STK_SIZE       10240                /* Size of each task's stacks (# of WORDs)       */
#define		TASK_START_ID       0                /* Application tasks                             */
#define		TASK_START_PRIO     0                /* Application tasks priorities                  */
#define		N_TASKS			    5				  /* Number of tasks  */

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

typedef struct
{
	char    TaskName[30];
	INT16U  TaskCtr;
	INT16U  TaskExecTime;
	INT32U  TaskTotExecTime;
} TASK_USER_DATA;

OS_STK			TaskStk[N_TASKS][TASK_STK_SIZE/sizeof(OS_STK)];	      /* Tasks stacks                       */
OS_STK          TaskStartStk[TASK_STK_SIZE];                  /* Startup task stack                 */
TASK_USER_DATA  TaskUserData[7];
OS_EVENT	 	*fork[N_TASKS];                                  /* 5 tasks semaphore                  */

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

		void	Task(void *pdata);                    /* Function prototypes of tasks                  */
		void	TaskStart(void *data);                /* Function prototypes of Startup task           */
static	void	TaskStartCreateTasks(void);
static	void	TASK_Thinking_To_Hungry(INT8U);
static  void	TASK_Eat(INT8U);

INT8U         TaskData[N_TASKS];                    /* Parameters to pass to each task               */


/*
*********************************************************************************************************
*                                                MAIN
*********************************************************************************************************
*/
int  main (void)
{
	//板级初始化
	ucBsp_Init();	
	//open the interrupt bit 'I'
	CPSR_Init();
	//Initialize uC/OS-II
	OSInit();
	
	Uart_PutString(uartPort0,"\t本程序演示uC/OS-II中的哲学家就餐问题: ");
	Uart_PutLine(uartPort0,"程序启动具有五个不同优先级的任务,每个\n\r任务对应一个哲学家,完成一系列动作");
	Uart_PutString(uartPort0,"请按任意键继续......");
	Uart_GetChar(uartPort0);
	Uart_PutLine(uartPort0,"");
	
	OSTaskCreateExt(TaskStart,
	              (void *)0,
	              &TaskStartStk[TASK_STK_SIZE - 1],
	              TASK_START_PRIO,
	              TASK_START_ID,
	              &TaskStartStk[0],
	              TASK_STK_SIZE,
	              &TaskUserData[TASK_START_ID],
	              0);
	
	OSStart();                               /* Start multitasking                       */
	return 1;
}


/*
*********************************************************************************************************
*                                              STARTUP TASK
*********************************************************************************************************
*/

void  TaskStart (void *pdata)
{
	int i;
	pdata = pdata;

	Timer_Start();
	
	for (i=0 ;i<N_TASKS;i++ ) 
	{
		//each create a signal
		fork[i]   = OSSemCreate(1);
	}
	TaskStartCreateTasks();
	OSTaskSuspend(OS_PRIO_SELF);
}

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

void  TaskStartCreateTasks (void)
{
	INT8U  i;
	
	for (i = 0; i <N_TASKS; i++) 
	{                        
		//Create N_TASKS identical tasks
		//Each task will pass its own id
		TaskData[i] = i;
		OSTaskCreate(Task, (void *)&TaskData[i], &TaskStk[i][TASK_STK_SIZE - 1], i+1);
	}
}

/*
*********************************************************************************************************
*                                      TASK_Thinking_To_Hungry
*********************************************************************************************************
*/

static void TASK_Thinking_To_Hungry(INT8U data)
{
	Uart_PutLine(uartPort0,"Philosopher %d is thinking?????????????????????????", data+1);
	OSTimeDly(10);

	Uart_PutLine(uartPort0,"Philosopher %d is hungry!!!!!!!!!!!!!!!!!!!!!!!!!!!", data+1);
	OSTimeDly(10);
}

/*
*********************************************************************************************************
*                                            TASK_Eat
*********************************************************************************************************
*/

static void TASK_Eat(INT8U data)
{
	Uart_PutLine(uartPort0,"");
	Uart_PutLine(uartPort0,"Philosopher %d is EATING...........................", data+1);
	Uart_PutLine(uartPort0,"");
	OSTimeDly(30);
}

/*
*********************************************************************************************************
*                                               TASK
*********************************************************************************************************
*/

void  Task (void *pdata)
{
	INT8U  err;
	INT8U  i;
	INT8U  j;
	
	i=*(int *)pdata;
	j=(i+1) % 5;
	
	for (;;)
	{
		TASK_Thinking_To_Hungry(i);
		
		//Acquire semaphores to eat
		OSSemPend(fork[i], 0, &err);
		OSSemPend(fork[j], 0, &err);
		
		//开始就餐
		TASK_Eat(i);

		//Release semaphore
		OSSemPost(fork[j]);
		OSSemPost(fork[i]);
		
		OSTimeDly(20);
	}
}



⌨️ 快捷键说明

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