📄 哲学家就餐.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 + -