ucosII实验报告.docx
- 文档编号:29524458
- 上传时间:2023-07-24
- 格式:DOCX
- 页数:95
- 大小:409.51KB
ucosII实验报告.docx
《ucosII实验报告.docx》由会员分享,可在线阅读,更多相关《ucosII实验报告.docx(95页珍藏版)》请在冰豆网上搜索。
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、
程序:
/********
*Exercise 2 - 1
*author:
csuchenan
*time:
2013- 12 -12
********/
#include "includes、h"
#defineTASK_STK_SIZE256
OS_STK MyTaskStk[TASK_STK_SIZE];
INT16Skey;
INT8Ux=0, y=0;
void MyTask(void*pdata){
#ifOS_CRITICAL_METHOD==3
OS_CPU_SR ﻩcpu_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
#define My_TASK2_STK_SIZE 256
OS_STK MyTask1Stk[My_TASK1_STK_SIZE];
OS_STK MyTask2Stk[My_TASK2_STK_SIZE];
INT16S key;
INT8U x= 0,y=0;
void MyTask2(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);
}
}
void main(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:
csu chenan
*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];
INT16S key;
INT8Ux=0,y=0;
INT16U cnt=0;
voidMyTask2(void*pdata){
#ifOS_CRITICAL_METHOD== 3
ﻩOS_CPU_SRcpu_sr;
#endif
pdata=pdata;
ﻩfor(;;){
cnt+=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_SRﻩcpu_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);
}
}
void main(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"
#define My_TASK1_STK_SIZE 256
#define My_TASK2_STK_SIZE256
OS_STK MyTask1Stk[My_TASK1_STK_SIZE];
OS_STK MyTask2Stk[My_TASK2_STK_SIZE];
INT16S key;
INT8U x= 0,y= 0;
INT16Ucnt =0;
voidMyTask2(void *pdata){
#if OS_CRITICAL_METHOD==3
ﻩOS_CPU_SR cpu_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";
#if OS_CRITICAL_METHOD==3
ﻩOS_CPU_SR cpu_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(;;){
cnt=cnt +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"
#define My_TASK1_STK_SIZE 256
#define My_TASK2_STK_SIZE256
OS_STK MyTask1Stk[My_TASK1_STK_SIZE];
OS_STK MyTask2Stk[My_TASK2_STK_SIZE];
INT16S key;
INT8U x=0,y=0;
INT16U cnt= 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);
}
}
void MyTask1(void*pdata){
char*ch2= "Y";
#if OS_CRITICAL_METHOD==3
ﻩOS_CPU_SR ﻩcpu_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(;;){
cnt=cnt+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);
ﻩ}
}
void main(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
INT16U d=0;
INT16Ud1=0;
voidOSTimeTickHook (void)
{
char*s0="500";
char*s1= "Per";ﻩ
char* s2="Times InterruptAttemperTimes";
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"
#define TASK_STK_SIZE 512
OS_STK MyTaskStk[
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ucosII 实验 报告