ucosII实验报告.docx
《ucosII实验报告.docx》由会员分享,可在线阅读,更多相关《ucosII实验报告.docx(91页珍藏版)》请在冰豆网上搜索。
ucosII实验报告
实验1《任务的创建、删除、挂起、恢复》
实验学时:
2实验地点:
二综x203实验日期:
2013/12/13
一、实验目的
1.实验环境的建立
2.任务的接口函数的应用
二、实验容
1.设计一个只有一个任务Task1,当程序运行后任务的工作就是每秒在显示器上显示一个字符“M”。
2.在任务Task1中在创建一个任务Task2。
当程序运行后,任务Task1的工作在显示器上显示一个字符“M”;Task2则是在显示器上显示字符“Y”。
3.要求任务Task2运行20次后,挂起任务Task1;任务Task2运行40次后,恢复任务Task1。
4.当任务Task1运行5次时,用函数OSSchedLock()对调度器进行加锁;而当任务Task1运行到第10次时,再用函数OSSchedUnlock()对调度器进行解锁,并运行该程序。
5.使任务Task1能删除任务Task2。
三、实验方法
包括实验方法、原理、技术、方案等。
四、实验步骤
1.将BC45文件夹拷贝到C分区根目录下。
2.将software文件夹拷贝到任意分区根目录下。
3.分别完成实验1、2、3、4、5
五、实验结果
1.DOS窗口每秒显示一个字符“M”。
每行显示10个“M”字符,行与行的间隔是一行。
按ESC键程序退出
2.DOS窗口交替显示字符"M"和“Y”,每隔一秒显示一次。
每行显示10个字符,行与行之间的间隔是一行。
按ESC键程序退出
3.DOS窗口开始交替显示字符"M"和“Y”,显示20次以后,Task1挂起,只显示“Y”,当Task2运行40次以后,Task1恢复,然后开始Task1,Task2交替运行。
4.DOS窗口开始交题显示字符"M"和“Y”,显示5次以后,Task1将任务调度器上锁,此时只有“M”打印,当Task1运行10次后,Task1,Task2开始交替运行。
5.DOS窗口开始交替显示字符“M”和“Y”,显示10次后,只显示“Y”
六、实验结论
对实验数据和结果进行分析描述,给出实验取得的成果和结论。
1.
程序:
/********
*Exercise2-1
*author:
csuchenan
*time:
2013-12-12
********/
#include"includes.h"
#defineTASK_STK_SIZE256
OS_STKMyTaskStk[TASK_STK_SIZE];
INT16Skey;
INT8Ux=0,y=0;
voidMyTask(void*pdata){
#ifOS_CRITICAL_METHOD==3
OS_CPU_SRcpu_sr;
#endif
pdata=pdata;
OS_ENTER_CRITICAL();
PC_VectSet(0X08,OSTickISR);
PC_SetTickRate(OS_TICKS_PER_SEC);
OS_EXIT_CRITICAL();
OSStatInit();
for(;;){
if(x>10){
x=0;
y=y+2;
}
PC_DispChar(x,y,*(char*)pdata,,DISP_BGND_BLACK+DISP_FGND_WHITE);
x=x+1;
if(PC_GetKey(&key)==1){
if(key==0x1B){
PC_DOSReturn();
}
}
OSTimeDlyHMSM(0,0,1,0);
}
}
voidmain(void){
char*ch="M";
OSInit();
PC_DOSSaveReturn();
PC_VectSet(uCOS,OSCtxSw);
PC_DispClrScr(DISP_FGND_WHITE+DISP_BGND_BLACK);
OSTaskCreate(MyTask,ch,&MyTaskStk[TASK_STK_SIZE-1],0);
OSStart();
}
2.
程序源代码:
/********
*Exercise2-2
*author:
csuchenan
*time:
2013-12-13
********/
#include"includes.h"
#defineMy_TASK1_STK_SIZE256
#defineMy_TASK2_STK_SIZE256
OS_STKMyTask1Stk[My_TASK1_STK_SIZE];
OS_STKMyTask2Stk[My_TASK2_STK_SIZE];
INT16Skey;
INT8Ux=0,y=0;
voidMyTask2(void*pdata){
#ifOS_CRITICAL_METHOD==3
OS_CPU_SRcpu_sr;
#endif
pdata=pdata;
OS_ENTER_CRITICAL();
PC_VectSet(0x80,OSTickISR);
PC_SetTickRate(OS_TICKS_PER_SEC);
OS_EXIT_CRITICAL();
for(;;){
if(x>10){
x=0;
y=y+2;
}
PC_DispChar(x,y,*(char*)pdata,DISP_BGND_BLACK+DISP_FGND_WHITE);
x=x+1;
if(PC_GetKey(&key)==1){
if(key==0x1B){
PC_DOSReturn();
}
}
OSTimeDlyHMSM(0,0,1,0);
}
}
voidMyTask1(void*pdata){
#ifOS_CRITICAL_METHOD==3
OS_CPU_SRcpu_sr;
#endif
char*ch="Y";
pdata=pdata;
OS_ENTER_CRITICAL();
PC_VectSet(0X08,OSTickISR);
PC_SetTickRate(OS_TICKS_PER_SEC);
OS_EXIT_CRITICAL();
OSStatInit();
OSTaskCreate(MyTask2,ch,&MyTask2Stk[My_TASK2_STK_SIZE-1],1);
for(;;){
if(x>10){
x=0;
y=y+2;
}
PC_DispChar(x,y,*(char*)pdata,DISP_BGND_BLACK+DISP_FGND_WHITE);
x=x+1;
if(PC_GetKey(&key)==1){
if(key==0x1B){
PC_DOSReturn();
}
}
OSTimeDlyHMSM(0,0,1,0);
}
}
voidmain(void){
char*ch="M";
OSInit();
PC_DOSSaveReturn();
PC_VectSet(uCOS,OSCtxSw);
PC_DispClrScr(DISP_FGND_WHITE+DISP_BGND_BLACK);
OSTaskCreate(MyTask1,ch,&MyTask1Stk[My_TASK1_STK_SIZE-1],0);
OSStart();
}
3.
程序:
/********
*Exercise2-3
*author:
csuchenan
*time:
2013-12-13
********/
#include"includes.h"
#defineMy_TASK1_STK_SIZE256
#defineMy_TASK2_STK_SIZE256
OS_STKMyTask1Stk[My_TASK1_STK_SIZE];
OS_STKMyTask2Stk[My_TASK2_STK_SIZE];
INT16Skey;
INT8Ux=0,y=0;
INT16Ut=0;
voidMyTask2(void*pdata){
#ifOS_CRITICAL_METHOD==3
OS_CPU_SRcpu_sr;
#endif
pdata=pdata;
for(;;){
t+=1;
if(cnt==20){
OSTaskSuspend(0);
}
if(cnt==40){
OSTaskResume(0);
}
if(x>10){
x=0;
y=y+2;
}
PC_DispChar(x,y,*(char*)pdata,DISP_BGND_BLACK+DISP_FGND_WHITE);
x=x+1;
if(PC_GetKey(&key)==1){
if(key==0x1B){
PC_DOSReturn();
}
}
OSTimeDlyHMSM(0,0,1,0);
}
}
voidMyTask1(void*pdata){
char*ch2="Y";
#ifOS_CRITICAL_METHOD==3
OS_CPU_SRcpu_sr;
#endif
pdata=pdata;
OS_ENTER_CRITICAL();
PC_VectSet(0X08,OSTickISR);
PC_SetTickRate(OS_TICKS_PER_SEC);
OS_EXIT_CRITICAL();
OSStatInit();
OSTaskCreate(MyTask2,ch2,&MyTask2Stk[My_TASK2_STK_SIZE-1],1);
for(;;){
if(x>10){
x=0;
y=y+2;
}
PC_DispChar(x,y,*(char*)pdata,DISP_BGND_BLACK+DISP_FGND_WHITE);
x=x+1;
if(PC_GetKey(&key)==1){
if(key==0x1B){
PC_DOSReturn();
}
}
cnt++;
OSTimeDlyHMSM(0,0,1,0);
}
}
voidmain(void){
char*ch="M";
OSInit();
PC_DOSSaveReturn();
PC_VectSet(uCOS,OSCtxSw);
PC_DispClrScr(DISP_FGND_WHITE+DISP_BGND_BLACK);
OSTaskCreate(MyTask1,ch,&MyTask1Stk[My_TASK1_STK_SIZE-1],0);
OSStart();
}
4.
程序:
/********
*Exercise2-3
*author:
csuchenan
*time:
2013-12-13
********/
#include"includes.h"
#defineMy_TASK1_STK_SIZE256
#defineMy_TASK2_STK_SIZE256
OS_STKMyTask1Stk[My_TASK1_STK_SIZE];
OS_STKMyTask2Stk[My_TASK2_STK_SIZE];
INT16Skey;
INT8Ux=0,y=0;
INT16Ut=0;
voidMyTask2(void*pdata){
#ifOS_CRITICAL_METHOD==3
OS_CPU_SRcpu_sr;
#endif
pdata=pdata;
for(;;){
if(x>10){
x=0;
y=y+2;
}
PC_DispChar(x,y,*(char*)pdata,DISP_BGND_BLACK+DISP_FGND_WHITE);
x=x+1;
if(PC_GetKey(&key)==1){
if(key==0x1B){
PC_DOSReturn();
}
}
OSTimeDlyHMSM(0,0,1,0);
}
}
voidMyTask1(void*pdata){
char*ch2="Y";
#ifOS_CRITICAL_METHOD==3
OS_CPU_SRcpu_sr;
#endif
pdata=pdata;
OS_ENTER_CRITICAL();
PC_VectSet(0X08,OSTickISR);
PC_SetTickRate(OS_TICKS_PER_SEC);
OS_EXIT_CRITICAL();
OSStatInit();
OSTaskCreate(MyTask2,ch2,&MyTask2Stk[My_TASK2_STK_SIZE-1],1);
for(;;){
t=t+1;
if(cnt==5){
OSSchedLock();
}
elseif(cnt==10){
OSSchedUnlock();
}
if(x>10){
x=0;
y=y+2;
}
PC_DispChar(x,y,*(char*)pdata,DISP_BGND_BLACK+DISP_FGND_WHITE);
x=x+1;
if(PC_GetKey(&key)==1){
if(key==0x1B){
PC_DOSReturn();
}
}
OSTimeDlyHMSM(0,0,1,0);
}
}
voidmain(void){
char*ch="M";
OSInit();
PC_DOSSaveReturn();
PC_VectSet(uCOS,OSCtxSw);
PC_DispClrScr(DISP_FGND_WHITE+DISP_BGND_BLACK);
OSTaskCreate(MyTask1,ch,&MyTask1Stk[My_TASK1_STK_SIZE-1],0);
OSStart();
}
5.
程序代码如下:
/********
*Exercise2-3
*author:
csuchenan
*time:
2013-12-13
********/
#include"includes.h"
#defineMy_TASK1_STK_SIZE256
#defineMy_TASK2_STK_SIZE256
OS_STKMyTask1Stk[My_TASK1_STK_SIZE];
OS_STKMyTask2Stk[My_TASK2_STK_SIZE];
INT16Skey;
INT8Ux=0,y=0;
INT16Ut=0;
voidMyTask2(void*pdata){
#ifOS_CRITICAL_METHOD==3
OS_CPU_SRcpu_sr;
#endif
pdata=pdata;
for(;;){
if(OSTaskDelReq(OS_PRIO_SELF)==OS_TASK_DEL_REQ){
OSTaskDel(OS_PRIO_SELF);
break;
}
if(x>10){
x=0;
y=y+2;
}
PC_DispChar(x,y,*(char*)pdata,DISP_BGND_BLACK+DISP_FGND_WHITE);
x=x+1;
if(PC_GetKey(&key)==1){
if(key==0x1B){
PC_DOSReturn();
}
}
OSTimeDlyHMSM(0,0,1,0);
}
}
voidMyTask1(void*pdata){
char*ch2="Y";
#ifOS_CRITICAL_METHOD==3
OS_CPU_SRcpu_sr;
#endif
pdata=pdata;
OS_ENTER_CRITICAL();
PC_VectSet(0X08,OSTickISR);
PC_SetTickRate(OS_TICKS_PER_SEC);
OS_EXIT_CRITICAL();
OSStatInit();
OSTaskCreate(MyTask2,ch2,&MyTask2Stk[My_TASK2_STK_SIZE-1],1);
for(;;){
t=t+1;
if(cnt==10){
while(OSTaskDelReq(0)!
=OS_TASK_NOT_EXIST){
OSTimeDly
(1);
}
}
if(x>10){
x=0;
y=y+2;
}
PC_DispChar(x,y,*(char*)pdata,DISP_BGND_BLACK+DISP_FGND_WHITE);
x=x+1;
if(PC_GetKey(&key)==1){
if(key==0x1B){
PC_DOSReturn();
}
}
OSTimeDlyHMSM(0,0,1,0);
}
}
voidmain(void){
char*ch="M";
OSInit();
PC_DOSSaveReturn();
PC_VectSet(uCOS,OSCtxSw);
PC_DispClrScr(DISP_FGND_WHITE+DISP_BGND_BLACK);
OSTaskCreate(MyTask1,ch,&MyTask1Stk[My_TASK1_STK_SIZE-1],0);
OSStart();
}
注:
有程序的要求附上程序源代码,有图表的要有截图并有相应的文字说明和分析
七、实验小结
给出本次实验的体会,如学会了什么,遇到哪些问题,如何解决这些问题,存在哪些有待改进的地方。
实验2《时钟节拍及时间管理函数》
实验学时:
2实验地点:
综合实验楼x201实验日期:
2013/12/15
一、实验目的
1.实验环境的建立
2.多任务环境下中断机制及时间API的应用
二、实验容
1.在OS_CPU_C.C文件中按如下代码定义函数OSTimeTickHook(),然后运行并查看运行结果。
实现显示系统在每发生500次时钟中断期间,调度器进行任务调度的次数。
2.设计一个有3个任务的应用程序。
这3个任务分别是:
MyTask、YouTask、和InterTask。
其中任务InterTask是在时钟节拍中断服务程序中用钩子函数OSTimeTickHook()中断了10000次时使用一个信号变量InterKey激活的。
运行并分析由中断服务程序激活任务的工作特点。
3.设计一个应用,在任务MyTask中调用函数OSTimeDlyResume()取消任务YouTask的延时。
为了观察任务YouTask的延时时间的变化,在钩子函数OSTimeTickHook()输出了任务YouTask在延时时间到时的时钟节拍数。
4.设计一个应用程序,在任务中调用OSTimeGet()函数获得并显示系统的时钟节拍数OSTime。
当任务运行10s时,调用函数OSTimeSet()将OSTime的值设为10。
5.在KEIL模拟开发环境下,将顺序执行的程序改为多任务运行,并跟踪程序或设置断点观察多任务系统执行流程。
三、实验方法
包括实验方法、原理、技术、方案等。
四、实验步骤
1.将BC45文件夹拷贝到C分区根目录下。
2.将software文件夹拷贝到任意分区根目录下。
3.安装KEIL2集成开发环境。
4.分别完成实验1、2、3、4、5
五、实验结果
记录实验输出数据和结果。
1.
2.
3.
4.
5.
六、实验结论
对实验数据和结果进行分析描述,给出实验取得的成果和结论。
1.
OS_CPU_C.c
#ifOS_CPU_HOOKS_EN>0
INT16Ud=0;
INT16Ud1=0;
voidOSTimeTickHook(void)
{
char*s0="500";
char*s1="Per";
char*s2="TimesInterruptAttemperTimes";
chars[8];
if(d==500)
{
PC_DispStr(14,4,s1,DISP_BGND_BLACK+DISP_FGND_WHITE);
PC_DispStr(18,4,s0,DISP_BGND_BLACK+DISP_FGND_WHITE);
PC_DispStr(22,4,s2,DISP_BGND_BLACK+DISP_FGND_WHITE);
sprintf(s,"%d",OSCtxSwCtr);
PC_DispStr(31,d1+5,s,DISP_BGND_BLACK+DISP_FGND_WHITE);
d=0;
d1+=1;
}
d+=1;
}
#endif
#include"includes.h"
#defineTASK_STK_SIZE512
OS_STKMyTaskStk[TASK_STK_SIZE];
INT16Skey;
INT8Ux=0,y=0;
voidMyTask(void*data);
voidmain(void)
{
char*s_M="M";
OSInit();/*Initialize