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

📄 philosopherdining.c

📁 运行在ucos下的实验用例程序
💻 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 + -