1、有关操作操作系统报告 实时操作系统报告 专业:J通信工程0801 学号:3081109004 姓名:王吉利 指导老师:熊书明 完成时间:2011/4/16 实验一 任务编程实验实验目的:1.理解任务管理的基本原理,了解任务的各个基本状态及其变迁过程;2.掌握C/OS-II系统的编程方法,包括main函数的书写方法,任务组成、创建、启动和时间函数,主要包括:OSInit; OSStart; OSTaskCreate; PC_DispStr; PC_GetKey; OSTimeDlyHMSM; OSTimeDly; OSTimeGet等。实验要求与思路: 设计一个任务,利用OSTimeGet实现时
2、间的获取,同时利用PC_DispStr实现时间的显示,同时需要编写一个启动任务实现对时间任务的启动。实验程序: #include includes.h/* CONSTANTS*/#define TASK_STK_SIZE 512 /* Size of each tasks stacks (# of WORDs) */* VARIABLES*/OS_STK TaskStkTASK_STK_SIZE; /* Tasks stacks */OS_STK TaskStartStkTASK_STK_SIZE;/* FUNCTION PROTOTYPES*/void Task(void *data); /
3、* Function prototypes of tasks */void TaskStart(void *data); /* Function prototypes of Startup task */static void TaskStartCreateTasks(void);static void TaskStartDispInit(void);/* MAIN*/void main (void) PC_DispClrScr(DISP_FGND_WHITE + DISP_BGND_BLACK); /* Clear the screen */ OSInit(); /* Initialize
4、uC/OS-II */ PC_DOSSaveReturn(); /* Save environment to return to DOS */ PC_VectSet(uCOS, OSCtxSw); /* Install uC/OS-IIs context switch vector */ OSTaskCreate(TaskStart, (void *)0, &TaskStartStkTASK_STK_SIZE - 1, 2); OSStart(); /* Start multitasking */* STARTUP TASK*/void TaskStart (void *pdata)#if O
5、S_CRITICAL_METHOD = 3 /* Allocate storage for CPU status register */ OS_CPU_SR cpu_sr;#endif char s100; INT16S key; pdata = pdata; /* Prevent compiler warning */ TaskStartDispInit(); /* Initialize the display */ OS_ENTER_CRITICAL(); PC_VectSet(0x08, OSTickISR); /* Install uC/OS-IIs clock tick ISR */
6、 PC_SetTickRate(OS_TICKS_PER_SEC); /* Reprogram tick rate */ OS_EXIT_CRITICAL(); OSStatInit(); /* Initialize uC/OS-IIs statistics */ OSTaskCreate(Task, (void *)0, &TaskStkTASK_STK_SIZE - 1, 0); for (;) if (PC_GetKey(&key) = TRUE) /* See if key has been pressed */ if (key = 0x1B) /* Yes, see if its t
7、he ESCAPE key */ PC_DOSReturn(); /* Return to DOS */ OSCtxSwCtr = 0; /* Clear context switch counter */ OSTimeDly(1); /* INITIALIZE THE DISPLAY*/static void TaskStartDispInit (void) PC_DispStr( 0, 0, uC/OS-II, The Real-Time Kernel , DISP_FGND_WHITE + DISP_BGND_RED + DISP_BLINK); PC_DispStr( 0, 1, ,
8、DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY); PC_DispStr( 0, 2, , DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY); PC_DispStr( 0, 3, Time EXAMPLE , 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
9、_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, , DISP_FGND_BLACK + DISP_BGND_LIGHT_GRA
10、Y); PC_DispStr( 0, 11, , DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY); PC_DispStr( 0, 12, , 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
11、_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 +
12、 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 + DISP_BLINK);/* TASKS*/void Task (void *pdata) char ss30; INT8U err; pdata=pdata; for (;) sprintf(ss,Time = %ld,OSTimeGet(); PC_DispStr(40, 10, ss, DISP_
13、FGND_BLACK + DISP_BGND_LIGHT_GRAY); OSTimeDlyHMSM(0, 0, 1, 0); /* Wait one second */ /* Delay 1 clock tick */ 实验截图:实验感想: 通过这次实验让我了解了C/OS-II系统的编程的方法,尤其是main函数的书写方法,以及函数的调用的用法,进一步巩固了c语言的知识。在C/OS-I制块。本次实验用到的功能函数就是OSTimeGet(),实现了可以随时获取系统的时间,对于显示时间的函数I任务的创建中,掌握了任务堆栈的定义(os_stk TaskStkTASK_STK_SIZE)方法,以及任务
14、创建函数中各个参数的意义,创建一个任务就是创建一个任务的任务控主要通过sprintf(ss,Time = %ld,OSTimeGet();PC_DispStr(40, 10, ss, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);实现。要求时间每次以200tick跳转,则通过函数OSTimeDlyHMSM(0, 0, 1, 0);即:系统延时一秒钟就可以实现每次以200tick跳转。对于每个任务的运行还需要一个时间启动任务来执行,即:TaskStart(void *data); 实验二 任务管理实验 实验目的: 1.理解任务管理的基本原理,了解任务的各个基本状
15、态及其变迁过程;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) 如此循环实验程序#include includ
16、es.h/* CONSTANTS*/#define TASK_STK_SIZE 512 /* Size of each tasks stacks (# of WORDs) */#define N_TASKS 3 /* Number of identical tasks */* VARIABLES*/OS_STK TaskStkN_TASKSTASK_STK_SIZE; /* Tasks stacks */OS_STK TaskStartStkTASK_STK_SIZE; /* TaskStart task stack */INT8U TaskDataN_TASKS; /* Parameters
17、 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
18、 */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_
19、VectSet(uCOS, OSCtxSw); /* Install uC/OS-IIs context switch vector */ /创建初始任务 OSTaskCreate(TaskStart, (void *)0, &TaskStartStkTASK_STK_SIZE - 1, 4); OSStart(); /* Start multitasking */* STARTUP TASK*/void TaskStart (void *pdata)#if OS_CRITICAL_METHOD = 3 /* Allocate storage for CPU status register *
20、/ 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-IIs clock tick ISR */ PC_SetTickRate(OS_TICKS_PER_SEC); /* Reprogram tick rate */ OS_EXIT_CRITICAL(
21、); OSStatInit(); /* Initialize uC/OS-IIs 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 its 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 */* 0123456789012
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2