首 页 行业热点 新车 试驾评测 养车用车 车型库
当前位置:首页实验报告

实验报告

2021-06-30 来源:好土汽车网
导读 实验报告


福建师范大学协和学院

实 验 报 告

课程名称: 实时操作系统

学院(系): 信息技术系

专 业: 物联网工程

班 级: 物联网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

因篇幅问题不能全部显示,请点此查看更多更全内容