实时操作系统实验.docx

上传人:b****0 文档编号:18250011 上传时间:2023-08-14 格式:DOCX 页数:25 大小:50.04KB
下载 相关 举报
实时操作系统实验.docx_第1页
第1页 / 共25页
实时操作系统实验.docx_第2页
第2页 / 共25页
实时操作系统实验.docx_第3页
第3页 / 共25页
实时操作系统实验.docx_第4页
第4页 / 共25页
实时操作系统实验.docx_第5页
第5页 / 共25页
实时操作系统实验.docx_第6页
第6页 / 共25页
实时操作系统实验.docx_第7页
第7页 / 共25页
实时操作系统实验.docx_第8页
第8页 / 共25页
实时操作系统实验.docx_第9页
第9页 / 共25页
实时操作系统实验.docx_第10页
第10页 / 共25页
实时操作系统实验.docx_第11页
第11页 / 共25页
实时操作系统实验.docx_第12页
第12页 / 共25页
实时操作系统实验.docx_第13页
第13页 / 共25页
实时操作系统实验.docx_第14页
第14页 / 共25页
实时操作系统实验.docx_第15页
第15页 / 共25页
实时操作系统实验.docx_第16页
第16页 / 共25页
实时操作系统实验.docx_第17页
第17页 / 共25页
实时操作系统实验.docx_第18页
第18页 / 共25页
实时操作系统实验.docx_第19页
第19页 / 共25页
实时操作系统实验.docx_第20页
第20页 / 共25页
亲,该文档总共25页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

实时操作系统实验.docx

《实时操作系统实验.docx》由会员分享,可在线阅读,更多相关《实时操作系统实验.docx(25页珍藏版)》请在冰点文库上搜索。

实时操作系统实验.docx

实时操作系统实验

实时操作系统实验报告

 

专业:

10通信工程

学号:

***********

**********

*********

 

实验一任务管理实验

实验目的:

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)如此循环

实验程序:

#include"includes.h"

#defineTASK_STK_SIZE512

OS_STKTaskStk1[TASK_STK_SIZE];

OS_STKTaskStk2[TASK_STK_SIZE];

OS_STKTaskStk3[TASK_STK_SIZE];OS_STKTaskStartStk[TASK_STK_SIZE];

voidTask1(void*data);

voidTask2(void*data);

voidTask3(void*data);/*Functionprototypesoftasks*\

voidTaskStart(void*data);/*FunctionprototypesofStartuptask*/

staticvoidTaskStartCreateTasks(void);

staticvoidTaskStartDispInit(void);

voidmain(void)

{

PC_DispClrScr(DISP_FGND_WHITE+DISP_BGND_BLACK);/*Clearthescreen*/

OSInit();/*InitializeuC/OS-II*/

PC_DOSSaveReturn();/*SaveenvironmenttoreturntoDOS*/

PC_VectSet(uCOS,OSCtxSw);/*InstalluC/OS-II'scontextswitchvector*/

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

OSStart();/*Startmultitasking*/

}

voidTaskStart(void*pdata)

{

#ifOS_CRITICAL_METHOD==3/*AllocatestorageforCPUstatusregister*/

OS_CPU_SRcpu_sr;

#endif

chars[100];

INT16Skey;

pdata=pdata;

TaskStartDispInit();/*Initializethedisplay*/

OS_ENTER_CRITICAL();

PC_VectSet(0x08,OSTickISR);/*InstalluC/OS-II'sclocktickISR*/

PC_SetTickRate(OS_TICKS_PER_SEC);/*Reprogramtickrate*/

OS_EXIT_CRITICAL();

OSStatInit();/*InitializeuC/OS-II'sstatistics*/

OSTaskCreate(Task1,(void*)0,&TaskStk1[TASK_STK_SIZE-1],1);

OSTaskCreate(Task2,(void*)0,&TaskStk2[TASK_STK_SIZE-1],2);

OSTaskCreate(Task3,(void*)0,&TaskStk3[TASK_STK_SIZE-1],3);

OSTaskSuspend

(2);/*Preventcompilerwarning*/

OSTaskSuspend(3);

for(;;){

if(PC_GetKey(&key)==TRUE){/*Seeifkeyhasbeenpressed*/

if(key==0x1B){/*Yes,seeifit'stheESCAPEkey*/

PC_DOSReturn();/*ReturntoDOS*/

}

}

OSCtxSwCtr=0;/*Clearcontextswitchcounter*/

OSTimeDly

(1);

}

}

staticvoidTaskStartDispInit(void)

{

PC_DispStr(0,0,"uC/OS-II,TheReal-TimeKernel",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,"TimeEXAMPLE",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,"",DISP_FGND_BLACK+DISP_BGND_LIGHT_GRAY);

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_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,"<-PRESS'ESC'TOQUIT->",DISP_FGND_BLACK+DISP_BGND_LIGHT_GRAY+DISP_BLINK);

}

voidTask1(void*pdata)

{

charss[30];

INT8Uerr;

pdata=pdata;

for(;;){

PC_DispStr(40,10,"Task1running",DISP_FGND_RED+DISP_BGND_LIGHT_GRAY);

PC_DispStr(40,11,"Task2Suspend",DISP_FGND_BLACK+DISP_BGND_LIGHT_GRAY);

PC_DispStr(40,12,"Task3Suspend",DISP_FGND_GREEN+DISP_BGND_LIGHT_GRAY);

OSTimeDlyHMSM(0,0,1,0);/*Waitonesecond*/

OSTaskResume

(2);/*Delay1clocktick*/

OSTaskSuspend(OS_PRIO_SELF);

}

}

voidTask2(void*pdata)

{

charss[30];

INT8Uerr;

pdata=pdata;

for(;;){

PC_DispStr(40,10,"Task1Suspend",DISP_FGND_BLACK+DISP_BGND_LIGHT_GRAY);

PC_DispStr(40,11,"Task2running",DISP_FGND_RED+DISP_BGND_LIGHT_GRAY);

PC_DispStr(40,12,"Task3Suspend",DISP_FGND_BLACK+DISP_BGND_LIGHT_GRAY);

OSTimeDlyHMSM(0,0,1,0);/*Waitonesecond*//*Delay1clocktick*/

OSTaskResume(3);/*Delay1clocktick*/

OSTaskSuspend(OS_PRIO_SELF);

}

}

voidTask3(void*pdata)

{

charss[30];

INT8Uerr;

pdata=pdata;

for(;;){

PC_DispStr(40,10,"Task1Suspend",DISP_FGND_BLACK+DISP_BGND_LIGHT_GRAY);

PC_DispStr(40,11,"Task2Suspend",DISP_FGND_BLACK+DISP_BGND_LIGHT_GRAY);

PC_DispStr(40,12,"Task3running",DISP_FGND_RED+DISP_BGND_LIGHT_GRAY);

OSTimeDlyHMSM(0,0,1,0);/*Waitonesecond*//*Delay1clocktick*/

OSTaskResume

(1);/*Delay1clocktick*/

OSTaskSuspend(OS_PRIO_SELF);

}

}

实验截图:

 

实验感想

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

显示设置可以修改TaskStartDispInit函数或者在Task0Task1Task2修改。

 

实验二信号量编程实验

实验目的:

●理解信号量的作用,特别是互斥操作和同步操作;

●掌握利用信号量操作函数实现简单的生产者/消费者问题;

●掌握下列信号量操作函数及其使用方法:

⏹OSSemCreate、OSSemPend、OSSemPost

实验要求与思路:

在该实验中,实现简单的生产者消费者问题,如图2-4所示,两个生产者任务和一个消费者任务,调用同一个输出函数。

即Task1和Task2竞争使用Fun函数,它们属于生产者,而Task3是消费者,消费者和生产者之间轮流使用Fun函数。

实验程序:

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

*uC/OS-II

*TheReal-TimeKernel

*EXAMPLE

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

*/

#include"includes.h"

/*

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

*CONSTANTS

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

*/

#defineTASK_STK_SIZE512/*Sizeofeachtask'sstacks(#ofWORDs)*/

/*

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

*VARIABLES

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

*/

OS_STKTask1Stk[TASK_STK_SIZE];

OS_STKTask2Stk[TASK_STK_SIZE];/*Tasksstacks*/

OS_STKTaskStartStk[TASK_STK_SIZE];

INT8Uline=5;

OS_EVENT*PEvent;

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

*FUNCTIONPROTOTYPES

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

*/

voidTask1(void*data);/*Functionprototypesoftasks*/

voidTask2(void*data);

voidTaskStart(void*data);/*FunctionprototypesofStartuptask*/

staticvoidTaskStartCreateTasks(void);

staticvoidTaskStartDispInit(void);

/*

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

*MAIN

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

*/

voidmain(void)

{

PC_DispClrScr(DISP_FGND_WHITE+DISP_BGND_BLACK);/*Clearthescreen*/

OSInit();/*InitializeuC/OS-II*/

PC_DOSSaveReturn();/*SaveenvironmenttoreturntoDOS*/

PC_VectSet(uCOS,OSCtxSw);/*InstalluC/OS-II'scontextswitchvector*/

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

OSStart();/*Startmultitasking*/

}

/*

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

*STARTUPTASK

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

*/

voidTaskStart(void*pdata)

{

#ifOS_CRITICAL_METHOD==3/*AllocatestorageforCPUstatusregister*/

OS_CPU_SRcpu_sr;

#endif

chars[100];

INT16Skey;

charbsus=0;

pdata=pdata;/*Preventcompilerwarning*/

TaskStartDispInit();/*Initializethedisplay*/

OS_ENTER_CRITICAL();

PC_VectSet(0x08,OSTickISR);/*InstalluC/OS-II'sclocktickISR*/

PC_SetTickRate(OS_TICKS_PER_SEC);/*Reprogramtickrate*/

OS_EXIT_CRITICAL();

OSStatInit();/*InitializeuC/OS-II'sstatistics*/

PEvent=OSSemCreate

(1);

OSTaskCreate(Task1,(void*)0,&Task1Stk[TASK_STK_SIZE-1],3);

OSTaskCreate(Task2,(void*)0,&Task2Stk[TASK_STK_SIZE-1],4);

for(;;){

if(PC_GetKey(&key)==TRUE){/*Seeifkeyhasbeenpressed*/

if(key==0x1B){/*Yes,seeifit'stheESCAPEkey*/

PC_DOSReturn();/*ReturntoDOS*/

}

else

{

if(bsus)

{

OSTaskResume(3);

OSTaskResume(4);

bsus=0;

}

else

{

OSTaskSuspend(3);

OSTaskSuspend(4);

bsus=1;

}

}

}

OSCtxSwCtr=0;/*Clearcontextswitchcounter*/

OSTimeDly

(1);

}

}

/*

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

*INITIALIZETHEDISPLAY

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

*/

staticvoidTaskStartDispInit(void)

{

PC_DispStr(0,0,"uC/OS-II,TheReal-TimeKernel",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,"TimeEXAMPLE",DISP_FGND_BLACK+DISP_BGND_LIGHT_GRAY);

PC_DispStr(0,4,"",DISP_FGND

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 表格模板 > 书信模板

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2