福建师范大学协和学院
实 验 报 告
课程名称: 实时操作系统
学院(系): 信息技术系
专 业: 物联网工程
班 级: 物联网1班
学 号:
学生姓名:
学 号:
学生姓名:
2016 年 9 月 5 号
1
实时操作系统实验报告
实验项目: 实验1-ucos环境搭建 专业: 15物联网 班级: 一班 学号:_124292015053_姓名: 严铭 专业: 15物联网 班级: 一班 学号:_124292015065_姓名: 钟诚博
一、 实验目的
1.搭建uC/OS-II在Source Insight下的环境 2.搭建uC/OS-II在VC++6.0下的环境 3.了解uC/OS-II的文件结构 二、实验环境
1.PC机一台
2.uC/OS-II 2.91源代码 3.Source Insight 3.5安装软件 4.VC++ 6.0 安装软件 三、实验内容
1.安装Source Insight 3.5
2
2.安装VC++ 6.0(如果已经安装不需再安装)
系统中已安装
3.拷贝uC/OS-II 2.91源代码
4.在Source Insight中创建工程,把uC/OS-II 2.91源代码导入工程,实现在Source Insight中顺利查看uC/OS-II 2.91源代码。
3
4
5.在VC++ 6.0中创建工程,添加uC/OS-II 2.91源代码到工程中,实现uC/OS-II 2.91源代码在VC++ 6.0中能够顺利编译运行。
5
四、 实验总结
本学期第一个实验,软件安装及框架搭建,为了之后的实验铺垫,很简单就能完成,但刚开始因为不熟悉的原因也是浪费了不少时间。好在按着步骤一点点实行,最后按时完成了实验。
实时操作系统实验报告
6
实验项目: 实验2-ucos初步使用(一) 专业: 15物联网 班级: 一班 学号:_124292015053_姓名: 严铭 专业: 15物联网 班级: 一班 学号:_124292015065_姓名: 钟诚博
一、实验目的
1.通过输入代码熟悉在µC/OS-II中编程的步骤; 2.熟练µC/OS-II任务的框架 3. 初步了解µC/OS-II内存管理 二、实验环境 1.PC机一台
2.uC/OS-II 2.91源代码 3.Source Insight 3.5软件 4.VC++ 6.0软件 三、实验内容
1.内存分区管理任务的步骤是?
答:内存控制块初始化,创建内存分区,任务请求内存块、获得内存块,查询并统计分区中已用的内存块及空闲的内存块,释放分区。 (1)在main.c文件中的main函数中进行下面修改
(2)在test.h头文件的最后面增加内存管理函数的声明
(3)在test.c文件中增加内存管理函数的函数体
7
(4)编译一下,看是否有问题 (5)运行结果如下:
8
四、实验总结
实施操作课的第一次编程实验,因为老师一开始有提供代码的原因,照着样本输入基本没什么问题。难点在于看懂代码的编写原理,很多语句看不懂,最后只能通过网络以及请教他人来理解。
实时操作系统实验报告
实验项目: 实验3-ucos初步使用(二) 专业: 15物联网 班级: 一班 学号:_124292015053_姓名: 严铭 专业: 15物联网 班级: 一班 学号:_124292015065_姓名: 钟诚博
一、实验目的
1.通过输入代码熟悉在µC/OS-II中编程的步骤; 2.熟悉µC/OS-II任务的框架
9
3. 初步了解µC/OS-II消息邮箱管理 二、实验环境 1.PC机一台
2.uC/OS-II 2.91源代码 3.VC++ 6.0软件 三、实验内容
1.消息邮箱管理任务的步骤是? 答:
(1)在main.c文件中的main函数中进行下面修改,把所有的实验都整合在一起。
(2)在test.h头文件的最后面增加消息邮箱任务函数的声明
(3)在test.c文件中增加消息邮箱任务的函数体 (4)编译一下,看是否有问题 (5)运行结果如下:
10
四、实验总结
从这一次的实验开始,老师让我们把程序及之后的都整合到同一个工程内,方便期末上交报告,以至于除了这次实验的编程,还要额外对实验管理进行编译。有了上次的经验,这次完成提前了一点,果然熟能生巧啊。
实时操作系统实验报告
11
实验项目: 实验4-ucos任务基本管理(一) 专业: 15物联网 班级: 一班 学号:_124292015053_姓名: 严铭 专业: 15物联网 班级: 一班 学号:_124292015065_姓名: 钟诚博
一、实验目的
1.理解任务管理的基本原理,了解任务的基本状态及其变迁过程; 2.掌握µC/OS-II中任务管理的基本方法(创建、启动、挂起、解挂任务); 3.熟练使用µC/OS-II任务管理的基本系统调用 二、实验环境 1.PC机一台
2.uC/OS-II 2.91源代码 3.Source Insight 3.5软件 4.VC++ 6.0软件 三、实验内容
1.如果希望应用程序中任务的优先级别为28个,则需要在UC/OS-II源代码中的什么文件的什么地方做一些修改?如果应用程序中使用了系统提供的空闲任务和统计任务,则该应用程序最多可以安排多少个任务? 答:
0S_LOWESR_PRIO函数中 中设置, 26个
2.设计一个只有一个任务myTask,当程序运行后任务的工作就是每秒在显示器上显示一个字符“M”。 答:
①.程序源代码如下:(实现程序的主要源代码) void myTask(void *pParam) {
12
int i=0;
printf(\"本任务的功能--每秒显示一个M\\n\"); for(;;) {
printf(\"第%d秒:M\\n\ OSTimeDly(100); } }
②.程序运行的截图
③.实现过程中的思考
因为花了时间对之前实验的进行了理解,这个代码编写显得不那么难,
按着之前的代码理解然后编写即可。
13
3.在第2题应用程序的任务myTask中再创建一个任务yourTask 。当 程序运行后,任务myTask的工作在显示器上显示一个字符“M”; yourTask 则是在显示器上显示字符 “Y”,两个任务延时同样的 时间1s。 答:
①.程序源代码如下:(实现程序的主要源代码) void yourTask(void *pParam) {
int i=0;
printf(\"本任务的功能--每秒显示一个Y\\n\"); for(;;) {
printf(\"第%d秒:Y\\n\ OSTimeDly(100); } }
②.程序运行的截图
14
③.实现过程中的思考
要加强自己的归纳理解能力,这个代码也像之前编写的一样,只是在这基础上增加“Y”的编写即可。
4. 修改第3题应用程序的任务yourTask。要求任务yourTask运行3次后,挂起任务myTask;任务yourTask运行5次后,恢复任务myTask。 ①.程序源代码如下:(实现程序的主要源代码) void yourTask1(void *pParam) {
int i=0; int a=0;
printf(\"本任务的功能--每秒显示一个Y\\n\"); for(a;a<8;a++) {
15
printf(\"第%d秒:Y\\n\ OSTimeDly(100); if (a==3) {
printf(\"任务yourTask被挂起\\n\"); OSTaskSuspend(6); } }
printf(\"任务yourTask恢复\\n\"); OSTaskResume(6); for(;;) {
printf(\"第%d秒:Y\\n\ OSTimeDly(100); } }
②.程序运行的截图
16
③.实现过程中的思考
通过对之前实验的总结,以及课堂上提供的代码编写该程序,花了不少时间。
四、实验总结
这次的实验告诉我对每次课堂内容及时整理及理解的重要性,如果没有这样做,这次的实验可能不会按时完成。除此以外,三个小实验的设计也让我学会了一种循序渐进的思考过程,之后的实验我也会运用这种模式去完成。在这之前,我要先加深对课程的理解,因为这才是最重要的。
17
实时操作系统实验报告
实验项目: 实验5-ucos任务基本管理(二) 专业: 15物联网 班级: 一班 学号:_124292015053_姓名: 严铭 专业: 15物联网 班级: 一班 学号:_124292015065_姓名: 钟诚博
一、实验目的
1.理解任务管理的基本原理,了解任务的基本状态及其变迁过程; 2.掌握µC/OS-II中任务管理的基本方法(创建、启动、挂起、解挂任务); 3.熟练使用µC/OS-II任务管理的基本系统调用 二、实验环境 1.PC机一台
2.uC/OS-II 2.91源代码 3.Source Insight 3.5软件 4.VC++ 6.0软件 三、实验内容
1. 改造实验四中第3题的任务myTask,当任务myTask运行2次时,用函数OSSchedLock()对调度器进行加锁;而当任务myTask运行到第10次时,再用函数OSSchedUnlock() 对调度器进行解锁,并运行该程序。
请思考:当调度器被锁后,为什么myTask运行的速度明显加快(既显示M的速度明显加快)
答:因为当调度器被锁后,任务调度就不会再继续进行。myTask运行的速度之所以加快,是因为在任务myTask中对调度器加锁后,系统只会运行任务myTask,而只有在任务调度器解锁后,其他任务才会得到系统的调度而运行。
①.程序源代码如下:(实现程序的主要源代码)
void ex5_myTask(void *pParam) {
int i=0;
18
}
int a=0;
printf(\"本任务的功能--每秒显示一个M\\n\"); for(a;a<10;a++) {
printf(\"第%d秒:M\\n\ OSTimeDly(100); if (a==1) {
printf(\"对调度器加锁\\n\"); OSSchedLock( ); } }
printf(\"对调度器解锁\\n\"); OSSchedUnlock( ); for(;;) {
printf(\"第%d秒:M\\n\ OSTimeDly(100); }
②.程序运行的截图
③.实现过程中的思考
答:因为有些问题想不通,加锁过程的实现并不顺利,所以最后参考了其他人的建议才勉强完成。
2.建立一个起始任务TaskA,由它再建立1个任务TaskB来完成如
19
下任务:
由TaskB在屏幕上依次输出字符“|”、“\\”、“--”、“/”,而产生一个向右转动的动画标志。旋转5s后, TaskA挂起TaskB, 过3s 后恢复TaskB 。再过10s后, TaskA删除TaskB。
补充:用printf函数时,\\b实现回退一个字符。 答:
①.程序源代码如下:(实现程序的主要源代码)
void ex5_TaskB(void *pParam) {
printf(\"输出的内容:\\n\"); for ( ; ; ) {
printf (\"\\b\\\\\");OSTimeDly(10); printf (\"\\b|\");OSTimeDly(10); printf (\"\\b/\");OSTimeDly(10); printf (\"\\b-\");OSTimeDly(10); } }
void ex5_TaskA(void *pParam) {
int i=0;
printf(\"创建任务TaskB,实验字符旋转\\n\");
OSTaskCreate(ex5_TaskB,0,&TaskStk[8][TASK_STK_SIZE-1],6); for(;;) {
i++;
OSTimeDly(OS_TICKS_PER_SEC); if(i==5) {
OSTaskSuspend(6);
printf(\"\\b任务TaskB被挂起!\\n\"); }
if(i==8) {
OSTaskResume(6);
printf(\"任务TaskB被恢复!\\n\");
20
}
}
}
if(i==18) {
OSTaskDel(6);
printf(\"\\b任务TaskB被删除!\\n\"); }
②.程序运行的截图
③.实现过程中的思考
答:搭建时不知道如何处理AB关系,以及“/”字符的处理,请教老师才得以完成。
3. 设计一个应用程序,在任务中调用函数OSTimeGet()函数获得并显示系统的时钟节拍数OSTime.当任务运行10s时,调用函数OSTimeSet()将OSTime的值设为10。 答:
①.程序源代码如下:(实现程序的主要源代码)
void ex5_Task3(void *pParam) {
int i=0,a=0; for(;;) {
21
}
}
for(a=0;a<11;a++) {
int b; b=a+a*100;
printf(\"现在系统的时钟节拍OSTime是:\"); printf(\"%d\\n\ OSTimeDly(100); }
printf(\"现在系统的时钟节拍OSTime被修改为10\\n\"); OSTimeSet(10); OSTimeDly(100);
②.程序运行的截图
③.实现过程中的思考
答:没什么特别的问题,按照思路最后写完了。
四、实验总结
整这次的实验是比较失败的,大部分编码是依靠他人的指点才得以编译成功,这也暴露出了我对编码理解不足的缺陷,希望在下次的实验中能减少这类问题的发生。
22
实时操作系统实验报告
实验项目: 实验6-ucos任务的同步与互斥 专业: 15物联网 班级: 一班 学号:_124292015053_姓名: 严铭 专业: 15物联网 班级: 一班 学号:_124292015065_姓名: 钟诚博
一、实验目的
1.理解任务同步的基本原理;
2.掌握µC/OS-II中任务同步与互斥的基本方法; 3.熟练使用信号量实现µC/OS-II任务的同步与互斥; 二、实验环境 1.PC机一台
2.uC/OS-II 2.91源代码 3.Source Insight 3.5软件 4.VC++ 6.0软件 三、实验内容
1.
有一个公用变量count(全局变量),是一个临界资源。count进行互斥的操作,伪代码如下:
请把这一段伪代码转换成ucos-II的源代码
23
两个并发任务对
答:
①.程序源代码如下:(实现程序的主要源代码)
OS_EVENT * semaphore; int count=2; void ex6_task1A(void *pParam) { int i;
INT8U *perr; INT8U err; err=0; perr=&err;
semaphore=OSSemCreate(1);//创建信号量,指定初值 for ( ; ; ) {
OSSemPend(semaphore,0,perr);//p操作
count=count+1; printf (\"第一个实验的count是:%d\\n\ OSTimeDly (100);
i=count; printf (\"第一个实验的i是:%d\\n\ OSSemPost(semaphore); //V操作 } }
void ex6_task1B(void *pParam) {
int j;
INT8U *perr; INT8U err; err=0; perr=&err; for ( ; ; ) {
OSSemPend(semaphore,0,perr);//p操作
count=count+10;printf (\"第二个实验的count是:%d\\n\ OSTimeDly (100);
j=count; printf (\"第二个实验的j是:%d\\n\ OSSemPost(semaphore); //V操作 } }
②.程序运行的截图
24
③.实现过程中的思考
信号量的设定,较伪代码的转化这两点耽误了一些时间。
2. 设某台机挂有两个I/O通道:分别挂一台输入机和一台打印机。卡片机上有一叠数据卡片,现在要把这些数据逐一输入到缓冲区B1,然后再复制到缓冲区B2,并在打印机上打印出来。
答:
①.程序源代码如下:(实现程序的主要源代码)
OS_EVENT *S1,*S2,*S3,*S4; void ex6_task2A(void *pParam) {
INT8U *perr; INT8U err,i=0; err=0;
25
perr=&err;
S1=OSSemCreate(1); S2=OSSemCreate(0); S3=OSSemCreate(1); S4=OSSemCreate(0); for(;;) {
OSSemPend(S1,0,perr); i++;
printf(\"B1缓冲区为空,输入第%d个数据!\\n\ OSTimeDly(100); OSSemPost(S2); } }
void ex6_task2B(void *pParam) {
INT8U *perr; INT8U err,i=0; err=0;
perr=&err; for(;;) {
OSSemPend(S2,0,perr); i++;
printf(\"B1缓冲区为满,取出第%d个数据!\\n\ OSSemPend(S3,0,perr);
printf(\"B2缓冲区为空,放入第%d个数据!\\n\ OSTimeDly(100); OSSemPost(S4); OSSemPost(S1); } }
void ex6_task2C(void *pParam) {
INT8U *perr; INT8U err,i=0; err=0;
perr=&err; for(;;) {
OSSemPend(S4,0,perr); i++;
printf(\"B2缓冲区为满,取出并打印第%d个数据!\\n\ OSTimeDly(100); OSSemPost(S3);
26
} }
②.程序运行的截图
③.实现过程中的思考
注意设置存取变量,以及对可能造成死锁的情况都要考虑。
(附加题)3. 桌子上有一只盘子,最多可容纳两个水果,每次只能放入或取出一个水果。
• 爸爸专向盘子中放苹果(apple)。 • 妈妈专向盘子中放橘子(orange)。 • 儿子专等吃盘子中的橘子。 • 女儿专等吃盘子中的苹果。
请用PV操作来实现爸爸、妈妈、儿子、女儿之间的同步与互斥关系。
27
答:
①.程序源代码如下:(实现程序的主要源代码)
OS_EVENT * MP; OS_EVENT * SP; OS_EVENT * SA; OS_EVENT * SO;
void task6_father(void *pParam) {
INT8U *perr; INT8U err,i;
err=0; perr=&err;
i=1;
MP=OSSemCreate(1); SP=OSSemCreate(2); SA=OSSemCreate(0); SO=OSSemCreate(0); for(;;) {
printf(\"父亲:准备第%d个苹果\\n\ OSTimeDly(100);
OSSemPend(SP,0,perr); OSMutexPend(MP,0,perr);
printf(\"父亲:申请到碟子\\n\"); OSMutexPost(MP); OSSemPost(SA);
// OSSemQuery(SA,&fatherSemData);
printf(\"父亲:碟子中有1个苹果\\n\"); } }
void task6_mother(void *pParam) {
INT8U *perr; INT8U err,i;
OS_SEM_DATA motherSemData; perr=&err;
28
err=OS_ERR_NONE; i=1; for(;;) {
printf(\"母亲:准备第%d个橘子\\n\ OSTimeDly(100);
OSSemPend(SP,0,perr); OSMutexPend(MP,0,perr);
printf(\"母亲:申请到碟子\\n\"); OSMutexPost(MP); OSSemPost(SO);
OSSemQuery(SO,&motherSemData);
printf(\"母亲:碟子中有%d个橘子\\n\ } }
void task6_daughter(void *pParam) {
INT8U *perr; INT8U err,i;
OS_SEM_DATA daughterSemData; perr=&err;
err=OS_ERR_NONE; i=1; for(;;) {
OSTimeDly(200);
OSSemPend(SA,0,perr);
OSSemQuery(SA,&daughterSemData); OSMutexPend(MP,0,perr);
printf(\"女儿:碟子中有%d个苹果\\n\ OSMutexPost(MP);
printf(\"女儿:取走苹果,碟子中还剩%d个苹果\\n\ OSSemPost(SP);
printf(\"女儿:吃第%d个苹果\\n\ } }
void task6_son(void *pParam) {
INT8U *perr; INT8U err,i;
OS_SEM_DATA sonSemData; perr=&err;
29
}
err=OS_ERR_NONE; i=1; for(;;) {
OSTimeDly(200);
OSSemPend(SO,0,perr);
OSSemQuery(SO,&sonSemData); OSMutexPend(MP,0,perr);
printf(\"儿子:碟子中有%d个橘子\\n\ OSMutexPost(MP);
printf(\"女儿:取走苹果,碟子中还剩%d个苹果\\n\ OSSemPost(SP);
printf(\"儿子:吃第%d个橘子\\n\}
②.实现过程中的思考
在认真审题之后,明白了要注意的变量,写完代码之后,出现了一些小问题,最后和同学讨论得以解决。 四、实验总结。
三个小实验代码编写真是花了不少时间,除附加题以外,本身的两小题的
30
编写过程也是相当吃力的,总之,PV操作真是一个比较难理解的概念。
31
因篇幅问题不能全部显示,请点此查看更多更全内容