实验报告示例

实时操作系统实验报告

专业J通信0601

 学号3061109015

姓名:蔡  智  超

指导老师李峰

实验二 任务管理实验

实验目的:        

1.理解任务管理的基本原理,了解任务的各个基本状态及其变迁过程;

2.掌握μC/OS-II 中任务管理的基本方法(挂起、解挂);

3.熟练使用μC/OS-II 任务管理的基本系统调用。

实验要求与思路

为了体现任务的各个基本状态及其变迁过程,本实验设计了T0、T1 和T3

三个任务,它们交替运行,如图所示

说明

在系统完成初始化后,可以先创建并启动优先级最低的TaskStart,由它创

建其他3 个应用任务T0、T1 和T2,之后整个系统的运行流程如下:

1) 优先级最高的T0 开始执行,之后T0 挂起自己;

2) 然后系统调度选中T1 开始执行,之后T1 挂起自己;

3) 接着系统调度选中T2,之后唤醒T0;

4) 如此循环

实验程序:

*********************************************************************************************************

*                                                uC/OS-II

*                                          The Real-Time Kernel

*                                      EX #1  Task Management

*********************************************************************************************************

#include "includes.h"

*********************************************************************************************************

*                                               CONSTANTS

*********************************************************************************************************

#define  TASK_STK_SIZE                 512   /* Size of each task's stacks (# of WORDs)            */

#define  N_TASKS                        2        /* Number of identical tasks                         

*                                               VARIABLES

*********************************************************************************************************

*/

OS_STK        TaskStk[N_TASKS][TASK_STK_SIZE];        /* Tasks stacks                                 

OS_STK        TaskStartStk[TASK_STK_SIZE];            /* TaskStart  task stack                        

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

/*

*                                           FUNCTION PROTOTYPES

*********************************************************************************************************

*/

void  Task0(void *pdata);                       /* Function prototypes of tasks   */

void  Task1(void *pdata);

void  Task2(void *pdata);

void  TaskStart(void *pdata);                   /* Function prototypes of Startup task */

static  void  TaskStartCreateTasks(void);         /* Function prototypes of creat task  */

static  void  TaskStartDispInit(void);                /* Function prototypes of Initialization the display          */

/*$PAGE*/*                                                MAIN

**********************************************************************************************************/

void  main (void)

{

    PC_DispClrScr(DISP_FGND_WHITE + DISP_BGND_BLACK);   /* Clear the screen                         */

    OSInit();                                              /* Initialize uC/OS-II  */

    PC_DOSSaveReturn();                                    /* Save environment to return to DOS  */

    PC_VectSet(uCOS, OSCtxSw);                             /* Install uC/OS-II's context switch vector */

    //创建初始任务

    OSTaskCreate(TaskStart, (void *)0, &TaskStartStk[TASK_STK_SIZE - 1], 4);

    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

    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 (;;) {

    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                          */

    }

}

/*$PAGE*/

/*

*********************************************************************************************************

*                                        INITIALIZE THE DISPLAY

*********************************************************************************************************

*/

static  void  TaskStartDispInit (void)

{

/*                                1111111111222222222233333333334444444444555555555566666666667777777777 */

/*                      01234567890123456789012345678901234567890123456789012345678901234567890123456789 */

    PC_DispStr( 0,  0, "                         uC/OS-II, The Real-Time Kernel                         ", DISP_FGND_WHITE + DISP_BGND_RED + DISP_BLINK);

    PC_DispStr( 0,  1, "                                                                                ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);

    PC_DispStr( 0,  2, "                                                                                ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);

    PC_DispStr( 0,  3, "                         EXAMPLE #1     Task Management                         ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);

    PC_DispStr( 0,  4, "                                                                                ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);

    PC_DispStr( 0,  5, "                                                                                ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);

    PC_DispStr( 0,  6, "                                                                                ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);

    PC_DispStr( 0,  7, "                                                                                ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);

    PC_DispStr( 0,  8, "                                                                                ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);

    PC_DispStr( 0,  9, "                                                                                ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);

    PC_DispStr( 0, 10, "Task0() :                                                                       ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);

    PC_DispStr( 0, 11, "Task1() :                                                                       ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);

    PC_DispStr( 0, 12, "Task2() :                                                                              ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);

    PC_DispStr( 0, 13, "                                                                                ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);

    PC_DispStr( 0, 14, "                                                                                ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);

    PC_DispStr( 0, 15, "                                                                                ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);

    PC_DispStr( 0, 16, "                                                                                ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);

    PC_DispStr( 0, 17, "                                                                                ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);

    PC_DispStr( 0, 18, "                                                                                ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);

    PC_DispStr( 0, 19, "                                                                                ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);

    PC_DispStr( 0, 20, "                                                                                ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);

    PC_DispStr( 0, 21, "                                                                                ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);

    PC_DispStr( 0, 22, "                                                                                ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);

    PC_DispStr( 0, 23, "                                                                                ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);

    PC_DispStr( 0, 24, "                            <-PRESS 'ESC' TO QUIT->                             ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY + DISP_BLINK);

/*                                1111111111222222222233333333334444444444555555555566666666667777777777 */

/*                      01234567890123456789012345678901234567890123456789012345678901234567890123456789 */

}

/*$PAGE*/

/*

*********************************************************************************************************

*                                             CREATE TASKS

*********************************************************************************************************

*/

static  void  TaskStartCreateTasks (void)

{

    INT8U  i;

INT8U err;

     for (i = 0; i < N_TASKS; i++) {                        /* Create tasks           */

          TaskData[i] =  i;                             /* Each task will display its own information    */

     }

    OSTaskCreate(Task0, (void *)&TaskData[0], &TaskStk[0][TASK_STK_SIZE - 1], 5);

    OSTaskCreate(Task1, (void *)&TaskData[1], &TaskStk[1][TASK_STK_SIZE - 1], 6);

        OSTaskCreate(Task2, (void *)&TaskData[2], &TaskStk[2][TASK_STK_SIZE - 1], 7);

    err=OSTaskSuspend(6);      /* 确保每个任务运行时其他任务被挂起

    err=OSTaskSuspend(7);

}

/*$PAGE*/

/*

*********************************************************************************************************

*                                               TASK #0

*

* Description: This task is suspended by itself,then it will be resumed by other tasks.

*********************************************************************************************************

*/

void  Task0 (void *pdata)

{

    INT8U i;

    INT8U err;

    i=*(int *)pdata;

    for (;;) {

        PC_DispStr( 14, 10, "task0 is   running.                  ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);

        PC_DispStr( 14, 11, "task1 is suspended.                  ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);

        PC_DispStr( 14, 12, "task2 is suspended.                  ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);

        OSTimeDly(200);

        err=OSTaskResume(6);

        err=OSTaskSuspend(5);       /* suspend itself           */

    }

}

/*$PAGE*/

/*

*********************************************************************************************************

*                                               TASK #1

* Description: This task resume task0

*/

void  Task1 (void *pdata)

{

    INT8U i;

    INT8U err;

    i=*(int *)pdata;

    for (;;) {

        OSTimeDly(200);

        PC_DispStr( 14, 10, "task0 is suspended.                  ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);

        PC_DispStr( 14, 11, "task1 is   running.                  ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);

        PC_DispStr( 14, 12, "task2 is suspended.                  ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);

        OSTimeDly(200);

        err=OSTaskResume(7);        /* resume task0           */

        err=OSTaskSuspend(6);

    }

}

/*$PAGE*/

/*

*********************************************************************************************************

*                                               TASK #2

*

* Description: This task resume task0

*********************************************************************************************************

*/

void  Task2 (void *pdata)

{

    INT8U i;

    INT8U err;

    i=*(int *)pdata;

    for (;;) {

        OSTimeDly(200);

        PC_DispStr( 14, 10, "task0 is suspended.                  ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);

        PC_DispStr( 14, 11, "task1 is suspended.                  ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);

        PC_DispStr( 14, 12, "task2 is running.                  ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);

        OSTimeDly(200);

        err=OSTaskResume(5);        /* resume task0           */

        err=OSTaskSuspend(7);

    }

}

实验截图

实验感想

通过这次实验使我掌握μC/OS-II 中任务管理的基本方法(挂起、解挂),首先在主函数中创建初始任务OSTaskCreate,执行OSTaskCreate后,在调用TaskStartCreateTasks ,在TaskStartCreateTasks实现3 个应用任务T0、T1 和T2循环挂起和唤醒,每个任务运行时要保证其他任务被挂起,而且要在挂起之前唤醒下一个任务。显示设置可以修改TaskStartDispInit函数或者在Task0 Task1 Task2修改。

相关推荐