📄 philosopherdining.c
字号:
/***************************************************************
* 声明:
* 本程序只具备演示功能,不能保证适用于您的真实应用。如需使用,请根据
* 您的实际需要修改本程序。
*******************************************************************
* 电子科技大学嵌入式软件工程中心 版权所有
*
* Copyright (C) 2006 UESTC ESEC
**************************************************************/
/**************************************************************
* 模块: init.c
*
* 目的:
* 这个程序演示基本的哲学家就餐问题的解决。程序启动具有五个
* 不同优先级的任务,每个任务对应一个哲学家,完成一系列动作。
**************************************************************/
/*********************************************************************************************************
* uC/OS-II
* The Real-Time Kernel
*
*
*********************************************************************************************************
*/
#include <stdio.h>
#include "/host/ide/workspace/ucos/src/includes.h"
/*
*********************************************************************************************************
* 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
*********************************************************************************************************
*/
extern void main(void);
/*
*
* **********************************************************************************************************
*
*/
void boot_card()
{
ucBsp_init(); /* Initializa ucBsp */
main();
}
extern void OSCpuInit();
extern void OS_Sched(void);
void main (void)
{
INT8U err; /* for setting the mutex */
printk("Welcome to ucos-II\n");
printk("\n");
OSCpuInit(); /* Install uC/OS-II's context switch vector */
OSInit(); /* Initialize uC/OS-II */
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 */
}
/*
*********************************************************************************************************
* STARTUP TASK
*********************************************************************************************************
*/
void TaskStart (void *pdata)
{
INT16S key;
int i;
pdata = pdata; /* Prevent compiler warning */
ucos_x86_idt_set_handler(0x20,(void *)OSTickISR,0x8e00); /* Install uC/OS-II's clock tick ISR */
ucos_timer_init(); /* Reprogram tick rate */
for (i=0 ;i<N_TASKS;i++ ) /* Create N_TASKS identical tasks */
{
fork[i] = OSSemCreate(1); /* each create a signal */
}
TaskStartCreateTasks(); /* Create all the application tasks */
OSTaskSuspend(OS_PRIO_SELF); /* suspend the TaskStart */
}
/*
***************************************************************************************************************
* CREATE TASKS
***************************************************************************************************************
*/
void TaskStartCreateTasks (void)
{
INT8U i;
for (i = 0; i <N_TASKS; i++) { /* Create N_TASKS identical tasks */
TaskData[i] = i; /* Each task will pass its own id */
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)
{
printk("**********philosopher %d is thinking.\n", data+1);
OSTimeDly(100);
printk("==========philosopher %d is hungry. \n ", data+1);
OSTimeDly(100);
}
/*
*********************************************************************************************************
* TASK_Eat
*********************************************************************************************************
*/
static void TASK_Eat(INT8U data)
{
printk("::::::::::philosopher %d is eating. \n ", data+1);
OSTimeDly(100);
}
/*
*********************************************************************************************************
* TASK
*********************************************************************************************************
*/
void Task (void *pdata)
{
INT8U err;
INT8U i;
INT8U j;
i=*(int *)pdata;
j=(i+1) % 5;
for (;;)
{
TASK_Thinking_To_Hungry(i);
// printk("\n");
OSSemPend(fork[i], 0, &err);
OSSemPend(fork[j], 0, &err); /* Acquire semaphores to eat */
TASK_Eat(i);
// printk("\n");
OSSemPost(fork[j]);
OSSemPost(fork[i]); /* Release semaphore */
OSTimeDly(200); /* Delay 10 clock tick */
// OSTimeDly(100);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -