嵌入式操作实验报告综述.docx
《嵌入式操作实验报告综述.docx》由会员分享,可在线阅读,更多相关《嵌入式操作实验报告综述.docx(24页珍藏版)》请在冰点文库上搜索。
嵌入式操作实验报告综述
嵌入式操作系统
实验报告
系别:
三系
班级:
12电子
(1)
学号:
***********
*****
2014.12
实验一嵌入式开发环境的建立
一、实验目的
1.掌握嵌入式软件开发环境的建立过程;
2.初步掌握嵌入式程序的编译和调试过程。
二、实验步骤
1.安装集成开发环境LambdaEDU
集成开发环境LambdaEDU的安装文件夹为LambdaEDU,其中有一个名为“Setup.exe”
的文件,直接双击该文件便可启动安装过程。
具体的安装指导请看“LambdaEDU安装手
册.doc”文件。
当LambdaEDU安装完毕之后,我们看到的是一个空的界面,现在就开始一步一步地将
我们的实验项目建立并运行起来。
2.建立项目
为了我们的实验运行起来,需要建立1个项目基于x86虚拟机的标准应用项目。
通过点
击“文件”、“新建”、“项目”开始根据向导创建一个项目。
在随后出现的对话框中选择“Tool/标准应用项目”,点击下一步,开始创建一个标准的
可执行的应用程序项目。
在随后出现的对话框中填入项目名称“wj1”。
点击“下一步”。
选择“pc386uC/OS-II应用(x86)”作为该项目的应用框架。
点击“下一步”。
选择“pc386_elf_tra_debug”作为该项目的基本配置。
点击“完成”。
新创建的项目“wj1”将会被添加到项目列表。
src文件夹下保存了该项目中
包含的源文件。
ucos2文件夹中包含了移植到x86虚拟机的全部代码。
init.c文件是基于ucos2和本虚拟机的一个应用程序。
在进行ucos2内核实验中,只需要替换init.c文件,即可。
文件名不限,但是文件名中最好不要使用英文符号和数字以外的其他字符。
3.构建项目
第一次构建本项目,在此项目上点击右键,选择“重建BSP及项目”。
即可开始构建。
之后弹出的对话框显示了构建的进度。
可以点击“在后台运行”,以隐藏该对话框在构建的同时,在右下角的“构建信息”视图输出构建过程中的详细信息。
注:
“重新构建”将本项目中的全部源代码进行一次完全的编译和连接,花费时间较多。
“构建项目”则仅仅将新修改过的源代码进行编译和连接,花费时间最少。
“重建BSP及项
目”,不但要完成“重新构建”的全部工作,另外还要编译与该项目有关的的LambdaEDU
中内置的部分代码,花费时间最多。
但是在项目刚建立后,第一次构建时需要选择“重建
BSP及项目”。
以后的构建中选择“重新构建”或“构建项目”即可。
另外,在替换了源代
码中的文件后,需要选择“重新构建”来完成该项目的构建。
4.配置虚拟机和目标机代理
(1)制作X86启动盘
在LambdaEDU中依次点击“工具”、“Bochs”、“制作虚拟机启动映象”,对启动盘进行一些参数设置后(如下图所示),系统将自动为你生成一个PC虚拟机的启动盘映像。
注意:
在设置本IP地址时,要求该IP地址与本计算机在同一个子网中,同时要求该IP
地址没有被网络上其他计算机使用。
(2)配置虚拟机
启动盘制作完成后,选择“虚拟机——配置虚拟机”菜单,系统弹出如下对话框:
(3)创建目标机代理
配置好虚拟机后,创建目标机代理:
点击LambdaEDU左下方窗口中绿色的十字符号,
在弹出的窗口中选择“基于TA的连接方式”,并点击“下一步”。
在弹出的“新目标机连接配置中”的这些参数,应该与之前制作启动盘时设置的参数一
致。
(4)调试应用
启动虚拟机。
虚拟机启动后的画面如下(其中显示的IP地址创建虚拟机启动盘时填入的IP地址)中
设置的IP地址):
在“目标机管理”窗口中启动目标机代理:
选中之前创建的目标机代理项,并点击绿色的按钮:
如果计算机与目标机建立连接成功,则原先绿色的按钮会变灰,其旁边红色的按钮会被点亮。
在成功完成构建的项目wj1中的“pc386_elf_tra_debug”上点击鼠标右键,
在弹出的菜单中选择“调试”,启动调试器调试生成的程序。
第一次进行调试/运行,需要选择目标机,如下图,选择“Default”,点击“确定”,开
始向目标机(虚拟机)下载应用程序。
调试的界面如下:
点击绿色的按钮,全速运行。
注意:
全速运行后,程序不能够被暂停和停止。
三、实验过程中遇到的问题及体会
问题:
重新构建的时候会出现错误,无法构建完成;Ip地址不正确导致目标机连接不上。
体会:
学习了一新软件,了解了lambdaedu环境的创建和应用,遇到问题时同学们积极帮忙解决,老师也耐心的讲解,最后得出运行的结果。
实验二任务的基本管理
一、实验目的
1.理解任务管理的基本原理,了解任务的各个基本状态及其变迁过程;
2.掌握uC/OS-II中任务管理的基本方法(创建、启动、挂起、解挂任务);
3.熟练使用uC/OS-II任务管理的基本系统调用。
二、实验原理及程序结构
1.实验设计
为了展现任务的各种基本状态及其变迁过程,本实验设计了Task0、Task1两个任务:
任务Task0不断地挂起自己,再被任务Task1解挂,两个任务不断地切换执行。
通过本实验,
读者可以清晰地了解到任务在各个时刻的状态以及状态变迁的原因。
2.运行流程
(1)系统经历一系列的初始化过程后进入boot_card()函数,在其中调用ucBsp_init()进
行板级初始化后,调用main()函数;
(2)main()函数调用OSInit()函数对uC/OS-II内核进行初始化,调用OSTaskCreate创
建起始任务TaskStart;
(3)main()函数调用函数OSStart()启动uC/OS-II内核的运行,开始多任务的调度,执
行当前优先级最高的就绪任务TaskStart;
(4)TaskStart完成如下工作:
a、安装时钟中断并初始化时钟,创建2个应用任务;
b、挂起自己(不再被其它任务唤醒),系统切换到当前优先级最高的就绪任务
Task0。
之后整个系统的运行流程如下:
t1时刻,Task0开始执行,它运行到t2时刻挂起自己;
t2时刻,系统调度处于就绪状态的优先级最高任务Task1执行,它在t3时刻唤醒
Task0,后者由于优先级较高而抢占CPU;
Task0执行到t4时刻又挂起自己,内核调度Task1执行;
Task1运行至t5时刻再度唤醒Task0;
3.µC/OS-Ⅱ中的任务描述
一个任务通常是一个无限的循环,由于任务的执行是由操作系统内核调度的,因此任
务是绝不会返回的,其返回参数必须定义成void。
在μC/OS-Ⅱ中,当一个运行着的任务使
一个比它优先级高的任务进入了就绪态,当前任务的CPU使用权就会被抢占,高优先级任
务会立刻得到CPU的控制权(在系统允许调度和任务切换的前提下)。
μC/OS-Ⅱ可以管理
多达64个任务,但目前版本的μC/OS-Ⅱ有两个任务已经被系统占用了(即空闲任务和统
计任务)。
必须给每个任务赋以不同的优先级,任务的优先级号就是任务编号(ID),优先
级可以从0到OS_LOWEST_PR10-2。
优先级号越低,任务的优先级越高。
μC/OS-Ⅱ总是
运行进入就绪态的优先级最高的任务。
4.源程序说明
(1)TaskStart任务
TaskStart任务负责安装操作系统的时钟中断服务例程、初始化操作系统时钟,并创建所
有的应用任务:
UCOS_CPU_INIT();/*InstalluC/OS-II'sclocktickISR*/
UCOS_TIMER_START();/*Timer初始化*/
TaskStartCreateTasks();/*Createalltheapplicationtasks*/
OSTaskSuspend(OS_PRIO_SELF);
具体负责应用任务创建的TaskStartCreateTasks函数代码如下,它创建了两个应用任务
Task0和Task1:
voidTaskStartCreateTasks(void)
{
INT8Ui;
for(i=0;i{
TaskData[i]=i;//Eachtaskwilldisplayitsowninformation
}
OSTaskCreate(Task0,(void*)&TaskData[0],&TaskStk[0][TASK_STK_SIZE-1],5);
OSTaskCreate(Task1,(void*)&TaskData[1],&TaskStk[1][TASK_STK_SIZE-1],6);
}
TaskStart任务完成上述操作后将自己挂起,操作系统将调度当前优先级最高的应用任务
Task0运行。
(2)应用任务
应用任务Task0运行后将自己挂起,之后操作系统就会调度处于就绪状态的优先级最高
uC/OS-II实验指导书
-24-
的任务,具体代码如下:
voidTask0(void*pdata)
{
INT8Ui;
INT8Uerr;
i=*(int*)pdata;
for(;;)
{
printf("Applicationtasksswitched%dtimes!
\n\r",++count);
printf("TASK_0ISRUNNING..............................................................\n\r");
printf("task_1issuspended!
\n\r");
printf("**************************************************\n\r");
err=OSTaskSuspend(5);//suspenditself
}
}
应用任务Task1运行后将Task0唤醒,使其进入到就绪队列中:
voidTask1(void*pdata)
{
INT8Ui;
INT8Uerr;
i=*(int*)pdata;
for(;;)
{
OSTimeDly(150);
printf("Applicationtasksswitched%dtimes!
\n\r",++count);
printf("task_0issuspended!
\n\r");
printf("TASK_1ISRUNNING..............................................................\n\r");
printf("**************************************************\n\r");
OSTimeDly(150);
err=OSTaskResume(5);/*resumetask0*/
}
}
三、运行及观察应用输出信息
四、本实验中用到的µC/OS-Ⅱ相关函数
1.OSTaskCreate()建立一个新任务。
任务的建立可以在多任务环境启动之前,也可以在
正在运行的任务中建立。
中断处理程序中不能建立任务。
一个任务必须为无限循环结构,且
不能有返回点。
OSTaskCreate()是为与先前的μC/OS版本保持兼容,新增的特性在OSTaskCreateExt
()函数中。
无论用户程序中是否产生中断,在初始化任务堆栈时,堆栈的结构必须与CPU中断后
寄存器入栈的顺序结构相同。
详细说明请参考所用处理器的手册。
2.OSTaskSuspend()无条件挂起一个任务。
调用此函数的任务也可以传递参数
OS_PRIO_SELF,挂起调用任务本身。
当前任务挂起后,只有其他任务才能唤醒。
任务挂起
后,系统会重新进行任务调度,运行下一个优先级最高的就绪任务。
唤醒挂起任务需要调用
函数OSTaskResume()。
任务的挂起是可以叠加到其他操作上的。
例如,任务被挂起时正在进行延时操作,那么
任务的唤醒就需要两个条件:
延时的结束以及其他任务的唤醒操作。
又如,任务被挂起时正
在等待信号量,当任务从信号量的等待对列中清除后也不能立即运行,而必须等到被唤醒后。
3.OSTaskResume()唤醒一个用OSTaskSuspend()函数挂起的任务。
OSTaskResume
()也是唯一能“解挂”挂起任务的函数。
五、实验过程中遇到的问题及体会
问题:
遇到与第一次实验相同的问题,由于电脑系统的缘故,部分电脑无法完成最后的调试运行。
体会:
了解任务管理的基本原理,了解任务的各个基本状态及其变迁过程,老师详细的讲解让大家体会该程序的运行,函数的使用等,老师热心解答同学的疑问。
实验三信号量:
哲学家就餐问题的实现
一、实验目的
掌握在基于嵌入式实时操作系统uC/OS-II的应用中,任务使用信号量的一般原理。
通
过经典的哲学家就餐实验,了解如何利用信号量来对共享资源进行互斥访问。
二、实验原理及程序结构
1.实验设计
五个哲学家任务(ph1、ph2、ph3、ph4、ph5)主要有两种过程:
思考(即睡眠一段时
间)和就餐。
每个哲学家任务在就餐前必须申请并获得一左一右两支筷子,就餐完毕后释放
这两支筷子。
五个哲学家围成一圈,每两人之间有一支筷子。
一共有五支筷子,在该实验中
用了五个互斥信号量来代表
2.源程序说明
voidTask(void*pdata)
{
INT8Uerr;
INT8Ui;
INT8Uj;
i=*(int*)pdata;
j=(i+1)%5;
for(;;)
{
TaskThinking2Hungry(i);
OSSemPend(fork[i],0,&err);
OSSemPend(fork[j],0,&err);/*Acquiresemaphorestoeat*/
TaskEat(i);
OSSemPost(fork[j]);
OSSemPost(fork[i]);/*Releasesemaphore*/
OSTimeDly(200);/*Delay10clocktick*/
}
}
三、运行及观察应用输出信息
四、本实验中用到的µC/OS-Ⅱ相关函数
1.OSSemCreate()函数建立并初始化一个信号量。
信号量的作用如下:
允许一个任务和其他任务或者中断同步
取得设备的使用权
标志事件的发生
2.OSSemPend()函数用于任务试图取得设备的使用权,任务需要和其他任务或中断同
步,任务需要等待特定事件的发生的场合。
如果任务调用OSSemPend()函数时,信号量
的值大于零,OSSemPend()函数递减该值并返回该值。
如果调用时信号量等于零,
OSSemPend()函数函数将任务加入该信号量的等待队列。
OSSemPend()函数挂起当前
任务直到其他的任务或中断置起信号量或超出等待的预期时间。
如果在预期的时钟节拍内信
号量被置起,μC/OS-Ⅱ默认最高优先级的任务取得信号量恢复执行。
一个被OSTaskSuspend
()函数挂起的任务也可以接受信号量,但这个任务将一直保持挂起状态直到通过调用
OSTaskResume()函数恢复任务的运行。
3.OSSemPost()函数置起指定的信号量。
如果指定的信号量是零或大于零,OSSemPost
()函数递增该信号量并返回。
如果有任何任务在等待信号量,最高优先级的任务将得到信
号量并进入就绪状态。
任务调度函数将进行任务调度,决定当前运行的任务是否仍然为最高
优先级的就绪状态的任务。
4.OSTimeDly()将一个任务延时若干个时钟节拍。
如果延时时间大于0,系统将立即进
行任务调度。
延时时间的长度可从0到65535个时钟节拍。
延时时间0表示不进行延时,函
数将立即返回调用者。
延时的具体时间依赖于系统每秒钟有多少时钟节拍(由文件SO_CFG.H中的常量OS_TICKS_PER_SEC设定)。
五、实验过程中遇到的问题及体会
问题:
代码替换不了,运行结果还是第一个实验的结果。
再次新建项目的时候无法编译,应该在重新构建dsp之前替换代码。
体会:
这一次实验课中熟悉了该软件环境的熟悉,感谢老师悉心的指导和同学们热心的帮助。